Explorar o código

core: new conditional lump types SUBST_RCV_ALL_EX and SUBST_SND_ALL_EX

- build conditional uri adding socket name in 'sn' param
Daniel-Constantin Mierla %!s(int64=5) %!d(string=hai) anos
pai
achega
53c5d86c37
Modificáronse 3 ficheiros con 42 adicións e 6 borrados
  1. 3 0
      src/core/config.h
  2. 6 5
      src/core/lump_struct.h
  3. 33 1
      src/core/msg_translator.c

+ 3 - 0
src/core/config.h

@@ -108,6 +108,9 @@
 #define COMP_PARAM ";comp="
 #define COMP_PARAM_LEN (sizeof(COMP_PARAM)-1)
 
+#define SOCKNAME_PARAM ";sn="
+#define SOCKNAME_PARAM_LEN (sizeof(SOCKNAME_PARAM)-1)
+
 #define SIGCOMP_NAME "sigcomp"
 #define SIGCOMP_NAME_LEN (sizeof(SIGCOMP_NAME)-1)
 

+ 6 - 5
src/core/lump_struct.h

@@ -35,11 +35,12 @@
 
 
 enum lump_op { LUMP_NOP=0, LUMP_DEL, LUMP_ADD, LUMP_ADD_SUBST, LUMP_ADD_OPT };
-enum lump_subst{ SUBST_NOP=0,                     /* do nothing */
-				 SUBST_RCV_IP,    SUBST_SND_IP,   /* add ip address */
-				 SUBST_RCV_PORT,  SUBST_SND_PORT, /* add port no */
-				 SUBST_RCV_PROTO, SUBST_SND_PROTO,/* add protocol(udp,tcp,tls)*/
-				 SUBST_RCV_ALL,   SUBST_SND_ALL   /*  ip:port;transport=proto */
+enum lump_subst{ SUBST_NOP=0,                       /* do nothing */
+				 SUBST_RCV_IP,     SUBST_SND_IP,    /* add ip address */
+				 SUBST_RCV_PORT,   SUBST_SND_PORT,  /* add port no */
+				 SUBST_RCV_PROTO,  SUBST_SND_PROTO, /* add protocol(udp,tcp,tls)*/
+				 SUBST_RCV_ALL,    SUBST_SND_ALL,   /* ip:port;transport=proto */
+				 SUBST_RCV_ALL_EX, SUBST_SND_ALL_EX /* ip:port;transport=proto;sn=xyz */
 				};
 				/* Where:
 				   SND = sending, e.g the src ip of the outgoing message

+ 33 - 1
src/core/msg_translator.c

@@ -592,7 +592,7 @@ static inline int lumps_len(struct sip_msg* msg, struct lump* lumps,
 	#define RCVCOMP_LUMP_LEN
 	#define SENDCOMP_LUMP_LEN
 #endif /*USE_COMP */
-	
+
 #define SUBST_LUMP_LEN(subst_l) \
 		switch((subst_l)->u.subst){ \
 			case SUBST_RCV_IP: \
@@ -644,6 +644,7 @@ static inline int lumps_len(struct sip_msg* msg, struct lump* lumps,
 				}; \
 				break; \
 			case SUBST_RCV_ALL: \
+			case SUBST_RCV_ALL_EX: \
 				if (msg->rcv.bind_address){ \
 					new_len+=recv_address_str->len; \
 					if ((msg->rcv.bind_address->address.af==AF_INET6)\
@@ -679,6 +680,11 @@ static inline int lumps_len(struct sip_msg* msg, struct lump* lumps,
 						LM_CRIT("unknown proto %d\n", \
 								msg->rcv.bind_address->proto); \
 					}\
+					if((subst_l)->u.subst==SUBST_RCV_ALL_EX \
+								&& msg->rcv.bind_address->sockname.len>0) { \
+						new_len+=SOCKNAME_PARAM_LEN \
+								+ msg->rcv.bind_address->sockname.len; \
+					} \
 					RCVCOMP_LUMP_LEN \
 				}else{ \
 					/* FIXME */ \
@@ -732,6 +738,7 @@ static inline int lumps_len(struct sip_msg* msg, struct lump* lumps,
 				}; \
 				break; \
 			case SUBST_SND_ALL: \
+			case SUBST_SND_ALL_EX: \
 				if (send_sock){ \
 					new_len+=send_address_str->len; \
 					if ((send_sock->address.af==AF_INET6) && \
@@ -767,6 +774,11 @@ static inline int lumps_len(struct sip_msg* msg, struct lump* lumps,
 						default: \
 						LM_CRIT("unknown proto %d\n", send_sock->proto); \
 					}\
+					if((subst_l)->u.subst==SUBST_SND_ALL_EX \
+								&& send_sock->sockname.len>0) { \
+						new_len+=SOCKNAME_PARAM_LEN \
+								+ send_sock->sockname.len; \
+					} \
 					SENDCOMP_LUMP_LEN \
 				}else{ \
 					/* FIXME */ \
@@ -1003,6 +1015,7 @@ void process_lumps( struct sip_msg* msg,
 			}; \
 			break; \
 		case SUBST_RCV_ALL: \
+		case SUBST_RCV_ALL_EX: \
 			if (msg->rcv.bind_address){  \
 				/* address */ \
 				if ((msg->rcv.bind_address->address.af==AF_INET6)\
@@ -1066,6 +1079,15 @@ void process_lumps( struct sip_msg* msg,
 					default: \
 						LM_CRIT("unknown proto %d\n", msg->rcv.bind_address->proto); \
 				} \
+				if((subst_l)->u.subst==SUBST_RCV_ALL_EX \
+								&& msg->rcv.bind_address->sockname.len>0) { \
+					memcpy(new_buf+offset, SOCKNAME_PARAM, \
+								SOCKNAME_PARAM_LEN); \
+					offset+=SOCKNAME_PARAM_LEN; \
+					memcpy(new_buf+offset, msg->rcv.bind_address->sockname.s, \
+							msg->rcv.bind_address->sockname.len); \
+					offset+=msg->rcv.bind_address->sockname.len; \
+				} \
 				RCVCOMP_PARAM_ADD \
 			}else{  \
 				/*FIXME*/ \
@@ -1101,6 +1123,7 @@ void process_lumps( struct sip_msg* msg,
 			}; \
 			break; \
 		case SUBST_SND_ALL: \
+		case SUBST_SND_ALL_EX: \
 			if (send_sock){  \
 				/* address */ \
 				if ((send_sock->address.af==AF_INET6)\
@@ -1164,6 +1187,15 @@ void process_lumps( struct sip_msg* msg,
 					default: \
 						LM_CRIT("unknown proto %d\n", send_sock->proto); \
 				} \
+				if((subst_l)->u.subst==SUBST_SND_ALL_EX \
+							&& send_sock->sockname.len>0) { \
+					memcpy(new_buf+offset, SOCKNAME_PARAM, \
+							SOCKNAME_PARAM_LEN); \
+					offset+=SOCKNAME_PARAM_LEN; \
+					memcpy(new_buf+offset, send_sock->sockname.s, \
+							send_sock->sockname.len); \
+					offset+=send_sock->sockname.len; \
+				} \
 				SENDCOMP_PARAM_ADD \
 			}else{  \
 				/*FIXME*/ \