Selaa lähdekoodia

core: added events and data-structures so that Kamailio core can transmit through the WebSocket module

Peter Dunkley 13 vuotta sitten
vanhempi
commit
1f13981426
5 muutettua tiedostoa jossa 59 lisäystä ja 14 poistoa
  1. 21 8
      events.c
  2. 4 2
      events.h
  3. 24 1
      forward.h
  4. 7 0
      tcp_conn.h
  5. 3 3
      tcp_read.c

+ 21 - 8
events.c

@@ -96,9 +96,14 @@ int sr_event_register_cb(int type, sr_event_cb_f f)
 					_sr_events_list.tcp_msrp_frame = f;
 				else return -1;
 			break;
-		case SREV_TCP_WS_FRAME:
-				if(_sr_events_list.tcp_ws_frame==0)
-					_sr_events_list.tcp_ws_frame = f;
+		case SREV_TCP_WS_FRAME_IN:
+				if(_sr_events_list.tcp_ws_frame_in==0)
+					_sr_events_list.tcp_ws_frame_in = f;
+				else return -1;
+			break;
+		case SREV_TCP_WS_FRAME_OUT:
+				if(_sr_events_list.tcp_ws_frame_out==0)
+					_sr_events_list.tcp_ws_frame_out = f;
 				else return -1;
 			break;
 		default:
@@ -192,10 +197,16 @@ int sr_event_exec(int type, void *data)
 					ret = _sr_events_list.tcp_msrp_frame(data);
 					return ret;
 				} else return 1;
-		case SREV_TCP_WS_FRAME:
-				if(unlikely(_sr_events_list.tcp_ws_frame!=0))
+		case SREV_TCP_WS_FRAME_IN:
+				if(unlikely(_sr_events_list.tcp_ws_frame_in!=0))
+				{
+					ret = _sr_events_list.tcp_ws_frame_in(data);
+					return ret;
+				} else return 1;
+		case SREV_TCP_WS_FRAME_OUT:
+				if(unlikely(_sr_events_list.tcp_ws_frame_out!=0))
 				{
-					ret = _sr_events_list.tcp_ws_frame(data);
+					ret = _sr_events_list.tcp_ws_frame_out(data);
 					return ret;
 				} else return 1;
 		default:
@@ -227,8 +238,10 @@ int sr_event_enabled(int type)
 				return (_sr_events_list.tcp_http_100c!=0)?1:0;
 		case SREV_TCP_MSRP_FRAME:
 				return (_sr_events_list.tcp_msrp_frame!=0)?1:0;
-		case SREV_TCP_WS_FRAME:
-				return (_sr_events_list.tcp_ws_frame!=0)?1:0;
+		case SREV_TCP_WS_FRAME_IN:
+				return (_sr_events_list.tcp_ws_frame_in!=0)?1:0;
+		case SREV_TCP_WS_FRAME_OUT:
+				return (_sr_events_list.tcp_ws_frame_out!=0)?1:0;
 	}
 	return 0;
 }

+ 4 - 2
events.h

@@ -32,7 +32,8 @@
 #define SREV_NET_DGRAM_IN		7
 #define SREV_TCP_HTTP_100C		8
 #define SREV_TCP_MSRP_FRAME		9
-#define SREV_TCP_WS_FRAME		10
+#define SREV_TCP_WS_FRAME_IN		10
+#define SREV_TCP_WS_FRAME_OUT		11
 
 
 typedef int (*sr_event_cb_f)(void *data);
@@ -47,7 +48,8 @@ typedef struct sr_event_cb {
 	sr_event_cb_f net_dgram_in;
 	sr_event_cb_f tcp_http_100c;
 	sr_event_cb_f tcp_msrp_frame;
-	sr_event_cb_f tcp_ws_frame;
+	sr_event_cb_f tcp_ws_frame_in;
+	sr_event_cb_f tcp_ws_frame_out;
 } sr_event_cb_t;
 
 void sr_event_cb_init(void);

+ 24 - 1
forward.h

@@ -54,6 +54,7 @@
 #include "udp_server.h"
 #ifdef USE_TCP
 #include "tcp_server.h"
+#include "tcp_conn.h"
 #endif
 #ifdef USE_SCTP
 #include "sctp_server.h"
@@ -128,12 +129,34 @@ static inline int msg_send(struct dest_info* dst, char* buf, int len)
 #ifdef USE_TCP 
 	union sockaddr_union* from;
 	union sockaddr_union local_addr;
+	struct tcp_connection *con = NULL;
+	struct ws_event_info wsev;
 #endif
 	
 	outb.s = buf;
 	outb.len = len;
 	sr_event_exec(SREV_NET_DATA_OUT, (void*)&outb);
-	
+
+#ifdef USE_TCP
+	if (unlikely(sr_event_enabled(SREV_TCP_WS_FRAME_OUT))) {
+		if (dst->proto == PROTO_TCP)
+			con = tcpconn_get(dst->id, 0, 0, 0, 0);
+#ifdef USE_TLS
+		else if (dst->proto == PROTO_TLS)
+			con = tcpconn_get(dst->id, 0, 0, 0, 0);
+#endif
+		if (con->flags & F_CONN_WS)
+		{
+			memset(&wsev, 0, sizeof(ws_event_info_t));
+			wsev.type = SREV_TCP_WS_FRAME_OUT;
+			wsev.buf = outb.s;
+			wsev.len = outb.len;
+			wsev.id = dst->id;
+			return sr_event_exec(SREV_TCP_WS_FRAME_OUT, (void *) &wsev);
+		}
+	}
+#endif
+
 	if (likely(dst->proto==PROTO_UDP)){
 		if (unlikely((dst->send_sock==0) || 
 					(dst->send_sock->flags & SI_IS_MCAST))){

+ 7 - 0
tcp_conn.h

@@ -355,6 +355,13 @@ typedef struct tcp_event_info {
 	struct tcp_connection *con;
 } tcp_event_info_t;
 
+typedef struct ws_event_info {
+	int type;
+	char *buf;
+	unsigned int len;
+	int id;
+} ws_event_info_t;
+
 #endif
 
 

+ 3 - 3
tcp_read.c

@@ -1132,14 +1132,14 @@ static int ws_process_msg(char* tcpbuf, unsigned int len,
 
 	ret = 0;
 	LM_DBG("WebSocket Message: [[>>>\n%.*s<<<]]\n", len, tcpbuf);
-	if(likely(sr_event_enabled(SREV_TCP_WS_FRAME))) {
+	if(likely(sr_event_enabled(SREV_TCP_WS_FRAME_IN))) {
 		memset(&tev, 0, sizeof(tcp_event_info_t));
-		tev.type = SREV_TCP_WS_FRAME;
+		tev.type = SREV_TCP_WS_FRAME_IN;
 		tev.buf = tcpbuf;
 		tev.len = len;
 		tev.rcv = rcv_info;
 		tev.con = con;
-		ret = sr_event_exec(SREV_TCP_WS_FRAME, (void*)(&tev));
+		ret = sr_event_exec(SREV_TCP_WS_FRAME_IN, (void*)(&tev));
 	} else {
 		LM_DBG("no callback registering for handling WebSockets - dropping!\n");
 	}