... | ... |
@@ -96,9 +96,14 @@ int sr_event_register_cb(int type, sr_event_cb_f f) |
96 | 96 |
_sr_events_list.tcp_msrp_frame = f; |
97 | 97 |
else return -1; |
98 | 98 |
break; |
99 |
- case SREV_TCP_WS_FRAME: |
|
100 |
- if(_sr_events_list.tcp_ws_frame==0) |
|
101 |
- _sr_events_list.tcp_ws_frame = f; |
|
99 |
+ case SREV_TCP_WS_FRAME_IN: |
|
100 |
+ if(_sr_events_list.tcp_ws_frame_in==0) |
|
101 |
+ _sr_events_list.tcp_ws_frame_in = f; |
|
102 |
+ else return -1; |
|
103 |
+ break; |
|
104 |
+ case SREV_TCP_WS_FRAME_OUT: |
|
105 |
+ if(_sr_events_list.tcp_ws_frame_out==0) |
|
106 |
+ _sr_events_list.tcp_ws_frame_out = f; |
|
102 | 107 |
else return -1; |
103 | 108 |
break; |
104 | 109 |
default: |
... | ... |
@@ -192,10 +197,16 @@ int sr_event_exec(int type, void *data) |
192 | 197 |
ret = _sr_events_list.tcp_msrp_frame(data); |
193 | 198 |
return ret; |
194 | 199 |
} else return 1; |
195 |
- case SREV_TCP_WS_FRAME: |
|
196 |
- if(unlikely(_sr_events_list.tcp_ws_frame!=0)) |
|
200 |
+ case SREV_TCP_WS_FRAME_IN: |
|
201 |
+ if(unlikely(_sr_events_list.tcp_ws_frame_in!=0)) |
|
202 |
+ { |
|
203 |
+ ret = _sr_events_list.tcp_ws_frame_in(data); |
|
204 |
+ return ret; |
|
205 |
+ } else return 1; |
|
206 |
+ case SREV_TCP_WS_FRAME_OUT: |
|
207 |
+ if(unlikely(_sr_events_list.tcp_ws_frame_out!=0)) |
|
197 | 208 |
{ |
198 |
- ret = _sr_events_list.tcp_ws_frame(data); |
|
209 |
+ ret = _sr_events_list.tcp_ws_frame_out(data); |
|
199 | 210 |
return ret; |
200 | 211 |
} else return 1; |
201 | 212 |
default: |
... | ... |
@@ -227,8 +238,10 @@ int sr_event_enabled(int type) |
227 | 238 |
return (_sr_events_list.tcp_http_100c!=0)?1:0; |
228 | 239 |
case SREV_TCP_MSRP_FRAME: |
229 | 240 |
return (_sr_events_list.tcp_msrp_frame!=0)?1:0; |
230 |
- case SREV_TCP_WS_FRAME: |
|
231 |
- return (_sr_events_list.tcp_ws_frame!=0)?1:0; |
|
241 |
+ case SREV_TCP_WS_FRAME_IN: |
|
242 |
+ return (_sr_events_list.tcp_ws_frame_in!=0)?1:0; |
|
243 |
+ case SREV_TCP_WS_FRAME_OUT: |
|
244 |
+ return (_sr_events_list.tcp_ws_frame_out!=0)?1:0; |
|
232 | 245 |
} |
233 | 246 |
return 0; |
234 | 247 |
} |
... | ... |
@@ -32,7 +32,8 @@ |
32 | 32 |
#define SREV_NET_DGRAM_IN 7 |
33 | 33 |
#define SREV_TCP_HTTP_100C 8 |
34 | 34 |
#define SREV_TCP_MSRP_FRAME 9 |
35 |
-#define SREV_TCP_WS_FRAME 10 |
|
35 |
+#define SREV_TCP_WS_FRAME_IN 10 |
|
36 |
+#define SREV_TCP_WS_FRAME_OUT 11 |
|
36 | 37 |
|
37 | 38 |
|
38 | 39 |
typedef int (*sr_event_cb_f)(void *data); |
... | ... |
@@ -47,7 +48,8 @@ typedef struct sr_event_cb { |
47 | 48 |
sr_event_cb_f net_dgram_in; |
48 | 49 |
sr_event_cb_f tcp_http_100c; |
49 | 50 |
sr_event_cb_f tcp_msrp_frame; |
50 |
- sr_event_cb_f tcp_ws_frame; |
|
51 |
+ sr_event_cb_f tcp_ws_frame_in; |
|
52 |
+ sr_event_cb_f tcp_ws_frame_out; |
|
51 | 53 |
} sr_event_cb_t; |
52 | 54 |
|
53 | 55 |
void sr_event_cb_init(void); |
... | ... |
@@ -54,6 +54,7 @@ |
54 | 54 |
#include "udp_server.h" |
55 | 55 |
#ifdef USE_TCP |
56 | 56 |
#include "tcp_server.h" |
57 |
+#include "tcp_conn.h" |
|
57 | 58 |
#endif |
58 | 59 |
#ifdef USE_SCTP |
59 | 60 |
#include "sctp_server.h" |
... | ... |
@@ -128,12 +129,34 @@ static inline int msg_send(struct dest_info* dst, char* buf, int len) |
128 | 129 |
#ifdef USE_TCP |
129 | 130 |
union sockaddr_union* from; |
130 | 131 |
union sockaddr_union local_addr; |
132 |
+ struct tcp_connection *con = NULL; |
|
133 |
+ struct ws_event_info wsev; |
|
131 | 134 |
#endif |
132 | 135 |
|
133 | 136 |
outb.s = buf; |
134 | 137 |
outb.len = len; |
135 | 138 |
sr_event_exec(SREV_NET_DATA_OUT, (void*)&outb); |
136 |
- |
|
139 |
+ |
|
140 |
+#ifdef USE_TCP |
|
141 |
+ if (unlikely(sr_event_enabled(SREV_TCP_WS_FRAME_OUT))) { |
|
142 |
+ if (dst->proto == PROTO_TCP) |
|
143 |
+ con = tcpconn_get(dst->id, 0, 0, 0, 0); |
|
144 |
+#ifdef USE_TLS |
|
145 |
+ else if (dst->proto == PROTO_TLS) |
|
146 |
+ con = tcpconn_get(dst->id, 0, 0, 0, 0); |
|
147 |
+#endif |
|
148 |
+ if (con->flags & F_CONN_WS) |
|
149 |
+ { |
|
150 |
+ memset(&wsev, 0, sizeof(ws_event_info_t)); |
|
151 |
+ wsev.type = SREV_TCP_WS_FRAME_OUT; |
|
152 |
+ wsev.buf = outb.s; |
|
153 |
+ wsev.len = outb.len; |
|
154 |
+ wsev.id = dst->id; |
|
155 |
+ return sr_event_exec(SREV_TCP_WS_FRAME_OUT, (void *) &wsev); |
|
156 |
+ } |
|
157 |
+ } |
|
158 |
+#endif |
|
159 |
+ |
|
137 | 160 |
if (likely(dst->proto==PROTO_UDP)){ |
138 | 161 |
if (unlikely((dst->send_sock==0) || |
139 | 162 |
(dst->send_sock->flags & SI_IS_MCAST))){ |
... | ... |
@@ -355,6 +355,13 @@ typedef struct tcp_event_info { |
355 | 355 |
struct tcp_connection *con; |
356 | 356 |
} tcp_event_info_t; |
357 | 357 |
|
358 |
+typedef struct ws_event_info { |
|
359 |
+ int type; |
|
360 |
+ char *buf; |
|
361 |
+ unsigned int len; |
|
362 |
+ int id; |
|
363 |
+} ws_event_info_t; |
|
364 |
+ |
|
358 | 365 |
#endif |
359 | 366 |
|
360 | 367 |
|
... | ... |
@@ -1132,14 +1132,14 @@ static int ws_process_msg(char* tcpbuf, unsigned int len, |
1132 | 1132 |
|
1133 | 1133 |
ret = 0; |
1134 | 1134 |
LM_DBG("WebSocket Message: [[>>>\n%.*s<<<]]\n", len, tcpbuf); |
1135 |
- if(likely(sr_event_enabled(SREV_TCP_WS_FRAME))) { |
|
1135 |
+ if(likely(sr_event_enabled(SREV_TCP_WS_FRAME_IN))) { |
|
1136 | 1136 |
memset(&tev, 0, sizeof(tcp_event_info_t)); |
1137 |
- tev.type = SREV_TCP_WS_FRAME; |
|
1137 |
+ tev.type = SREV_TCP_WS_FRAME_IN; |
|
1138 | 1138 |
tev.buf = tcpbuf; |
1139 | 1139 |
tev.len = len; |
1140 | 1140 |
tev.rcv = rcv_info; |
1141 | 1141 |
tev.con = con; |
1142 |
- ret = sr_event_exec(SREV_TCP_WS_FRAME, (void*)(&tev)); |
|
1142 |
+ ret = sr_event_exec(SREV_TCP_WS_FRAME_IN, (void*)(&tev)); |
|
1143 | 1143 |
} else { |
1144 | 1144 |
LM_DBG("no callback registering for handling WebSockets - dropping!\n"); |
1145 | 1145 |
} |