|
@@ -104,7 +104,7 @@ struct switchboard_item_stat {
|
|
struct switchboard_item {
|
|
struct switchboard_item {
|
|
str name;
|
|
str name;
|
|
struct xt_rtpproxy_switchboard_id switchboard_addr;
|
|
struct xt_rtpproxy_switchboard_id switchboard_addr;
|
|
- unsigned int sip_ip;
|
|
|
|
|
|
+ struct xt_rtpproxy_addr sip_ip;
|
|
str hostname;
|
|
str hostname;
|
|
struct host_item *host;
|
|
struct host_item *host;
|
|
unsigned int weight;
|
|
unsigned int weight;
|
|
@@ -140,7 +140,7 @@ static str sdp_media_types_str[NUM_MEDIA_TYPES] = {
|
|
struct aggregation_item {
|
|
struct aggregation_item {
|
|
str name;
|
|
str name;
|
|
unsigned int switchboard_count;
|
|
unsigned int switchboard_count;
|
|
- unsigned int sip_ip;
|
|
|
|
|
|
+ struct xt_rtpproxy_addr sip_ip;
|
|
struct switchboard_item *(*switchboards)[];
|
|
struct switchboard_item *(*switchboards)[];
|
|
struct aggregation_item *next;
|
|
struct aggregation_item *next;
|
|
};
|
|
};
|
|
@@ -184,6 +184,7 @@ static struct {
|
|
u_int32_t mark;
|
|
u_int32_t mark;
|
|
struct xt_rtpproxy_throttle_stat bandwidth[2];
|
|
struct xt_rtpproxy_throttle_stat bandwidth[2];
|
|
} throttle;
|
|
} throttle;
|
|
|
|
+ int session_mark;
|
|
struct codec_set_item *codec_set;
|
|
struct codec_set_item *codec_set;
|
|
int remove_codec_mask;
|
|
int remove_codec_mask;
|
|
int auth_throttling;
|
|
int auth_throttling;
|
|
@@ -234,7 +235,7 @@ declare_find_function(codec_set)
|
|
static struct switchboard_item* find_switchboard_by_addr(struct xt_rtpproxy_switchboard_id *addr) {
|
|
static struct switchboard_item* find_switchboard_by_addr(struct xt_rtpproxy_switchboard_id *addr) {
|
|
struct switchboard_item* p;
|
|
struct switchboard_item* p;
|
|
for (p = switchboards; p; p=p->next) {
|
|
for (p = switchboards; p; p=p->next) {
|
|
- if (addr->ip == p->switchboard_addr.ip && addr->port == p->switchboard_addr.port) break;
|
|
|
|
|
|
+ if (xt_rtpproxy_addr_test(addr, &p->switchboard_addr) == 3) break;
|
|
}
|
|
}
|
|
return p;
|
|
return p;
|
|
}
|
|
}
|
|
@@ -250,10 +251,11 @@ enum {
|
|
PAR_SWITCHBOARD_BY_SIP_IP_A, PAR_SWITCHBOARD_BY_SIP_IP_B,
|
|
PAR_SWITCHBOARD_BY_SIP_IP_A, PAR_SWITCHBOARD_BY_SIP_IP_B,
|
|
PAR_SESSION_IDS, PAR_PROTECTED_SESSION_IDS,
|
|
PAR_SESSION_IDS, PAR_PROTECTED_SESSION_IDS,
|
|
PAR_SDP_IP, PAR_ACTIVE_MEDIA_NUM,
|
|
PAR_SDP_IP, PAR_ACTIVE_MEDIA_NUM,
|
|
- PAR_OLINE_USER, PAR_OLINE_ADDR,
|
|
|
|
|
|
+ PAR_OLINE_USER, PAR_OLINE_ADDR, PAR_OLINE_IP_VER,
|
|
PAR_THROTTLE_MARK,
|
|
PAR_THROTTLE_MARK,
|
|
PAR_THROTTLE_RTP_MAX_BYTES, PAR_THROTTLE_RTP_MAX_PACKETS,
|
|
PAR_THROTTLE_RTP_MAX_BYTES, PAR_THROTTLE_RTP_MAX_PACKETS,
|
|
PAR_THROTTLE_RTCP_MAX_BYTES, PAR_THROTTLE_RTCP_MAX_PACKETS,
|
|
PAR_THROTTLE_RTCP_MAX_BYTES, PAR_THROTTLE_RTCP_MAX_PACKETS,
|
|
|
|
+ PAR_SESSION_MARK,
|
|
PAR_CODEC_SET, PAR_AUTH_RIGHTS, PAR_REMOVE_CODEC_MASK,
|
|
PAR_CODEC_SET, PAR_AUTH_RIGHTS, PAR_REMOVE_CODEC_MASK,
|
|
PAR_AUTH_THROTTLING
|
|
PAR_AUTH_THROTTLING
|
|
};
|
|
};
|
|
@@ -284,12 +286,14 @@ static struct {
|
|
{"sdp_ip", PAR_SDP_IP, PAR_READ|PAR_INT},
|
|
{"sdp_ip", PAR_SDP_IP, PAR_READ|PAR_INT},
|
|
{"active_media_num", PAR_ACTIVE_MEDIA_NUM, PAR_READ|PAR_INT},
|
|
{"active_media_num", PAR_ACTIVE_MEDIA_NUM, PAR_READ|PAR_INT},
|
|
{"o_user", PAR_OLINE_USER, PAR_READ|PAR_WRITE|PAR_STR},
|
|
{"o_user", PAR_OLINE_USER, PAR_READ|PAR_WRITE|PAR_STR},
|
|
|
|
+ {"o_ip_ver", PAR_OLINE_IP_VER, PAR_READ|PAR_INT},
|
|
{"o_addr", PAR_OLINE_ADDR, PAR_READ|PAR_WRITE|PAR_STR},
|
|
{"o_addr", PAR_OLINE_ADDR, PAR_READ|PAR_WRITE|PAR_STR},
|
|
{"throttle_mark", PAR_THROTTLE_MARK, PAR_READ|PAR_WRITE|PAR_INT},
|
|
{"throttle_mark", PAR_THROTTLE_MARK, PAR_READ|PAR_WRITE|PAR_INT},
|
|
{"throttle_rtp_max_bytes", PAR_THROTTLE_RTP_MAX_BYTES, PAR_READ|PAR_WRITE|PAR_INT},
|
|
{"throttle_rtp_max_bytes", PAR_THROTTLE_RTP_MAX_BYTES, PAR_READ|PAR_WRITE|PAR_INT},
|
|
{"throttle_rtp_max_packets", PAR_THROTTLE_RTP_MAX_PACKETS, PAR_READ|PAR_WRITE|PAR_INT},
|
|
{"throttle_rtp_max_packets", PAR_THROTTLE_RTP_MAX_PACKETS, PAR_READ|PAR_WRITE|PAR_INT},
|
|
{"throttle_rtcp_max_bytes", PAR_THROTTLE_RTCP_MAX_BYTES, PAR_READ|PAR_WRITE|PAR_INT},
|
|
{"throttle_rtcp_max_bytes", PAR_THROTTLE_RTCP_MAX_BYTES, PAR_READ|PAR_WRITE|PAR_INT},
|
|
{"throttle_rtcp_max_packets", PAR_THROTTLE_RTCP_MAX_PACKETS, PAR_READ|PAR_WRITE|PAR_INT},
|
|
{"throttle_rtcp_max_packets", PAR_THROTTLE_RTCP_MAX_PACKETS, PAR_READ|PAR_WRITE|PAR_INT},
|
|
|
|
+ {"session_mark", PAR_SESSION_MARK, PAR_READ|PAR_WRITE|PAR_INT},
|
|
{"codec_set", PAR_CODEC_SET, PAR_READ|PAR_WRITE|PAR_STR},
|
|
{"codec_set", PAR_CODEC_SET, PAR_READ|PAR_WRITE|PAR_STR},
|
|
{"remove_codec_mask", PAR_REMOVE_CODEC_MASK, PAR_READ|PAR_WRITE|PAR_INT},
|
|
{"remove_codec_mask", PAR_REMOVE_CODEC_MASK, PAR_READ|PAR_WRITE|PAR_INT},
|
|
{"auth_rights", PAR_AUTH_RIGHTS, PAR_READ|PAR_INT},
|
|
{"auth_rights", PAR_AUTH_RIGHTS, PAR_READ|PAR_INT},
|
|
@@ -464,13 +468,14 @@ struct sdp_codec {
|
|
|
|
|
|
struct sdp_session {
|
|
struct sdp_session {
|
|
str oline_user_s;
|
|
str oline_user_s;
|
|
|
|
+ char oline_ip_ver;
|
|
str oline_addr_s;
|
|
str oline_addr_s;
|
|
str cline_ip_s;
|
|
str cline_ip_s;
|
|
unsigned int media_count;
|
|
unsigned int media_count;
|
|
struct {
|
|
struct {
|
|
int active; /* if SDP has been parsed correctly, has a IP (even 0.0.0.0), port!=0 and has supported params */
|
|
int active; /* if SDP has been parsed correctly, has a IP (even 0.0.0.0), port!=0 and has supported params */
|
|
unsigned short port;
|
|
unsigned short port;
|
|
- unsigned int ip;
|
|
|
|
|
|
+ struct xt_rtpproxy_addr addr;
|
|
str ip_s;
|
|
str ip_s;
|
|
str port_s;
|
|
str port_s;
|
|
enum sdp_media_type media_type;
|
|
enum sdp_media_type media_type;
|
|
@@ -481,23 +486,26 @@ struct sdp_session {
|
|
} media[MAX_MEDIA_NUMBER];
|
|
} media[MAX_MEDIA_NUMBER];
|
|
};
|
|
};
|
|
|
|
|
|
-static unsigned int s2ip4(str *s) {
|
|
|
|
- struct in_addr res;
|
|
|
|
- char c2;
|
|
|
|
- c2 = s->s[s->len];
|
|
|
|
- s->s[s->len] = '\0';
|
|
|
|
- if (!inet_aton(s->s, &res)) {
|
|
|
|
- s->s[s->len] = c2;
|
|
|
|
- return 0;
|
|
|
|
|
|
+static int s2ip(str *s, struct xt_rtpproxy_addr *addr) {
|
|
|
|
+ char c2;
|
|
|
|
+ c2 = s->s[s->len];
|
|
|
|
+ s->s[s->len] = '\0';
|
|
|
|
+ addr->ver = (strchr(s->s, ':') != NULL)?6:4;
|
|
|
|
+ if (inet_pton((addr->ver==6)?AF_INET6:AF_INET, s->s, &addr->ip) <= 0 ) {
|
|
|
|
+ addr->ver = 0;
|
|
}
|
|
}
|
|
s->s[s->len] = c2;
|
|
s->s[s->len] = c2;
|
|
- return res.s_addr;
|
|
|
|
|
|
+ return addr->ver;
|
|
}
|
|
}
|
|
|
|
|
|
-static void ip42s(unsigned int ip, str *s) {
|
|
|
|
- struct in_addr ip2 = { ip };
|
|
|
|
- s->s = inet_ntoa(ip2);
|
|
|
|
- s->len = strlen(s->s);
|
|
|
|
|
|
+static void ip2s(struct xt_rtpproxy_addr *addr, str *s) {
|
|
|
|
+ static char buf[INET6_ADDRSTRLEN+1];
|
|
|
|
+ s->s = buf;
|
|
|
|
+ if (addr->ver == 0 || !inet_ntop((addr->ver==6)?AF_INET6:AF_INET, &addr->ip, buf, sizeof(buf))) {
|
|
|
|
+ s->len = 0;
|
|
|
|
+ } else {
|
|
|
|
+ s->len = strlen(s->s);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
#define is_alpha(_c) (((_c) >= 'a' && (_c) <= 'z') || ((_c) >= 'A' && (_c) <= 'Z') || ((_c) >= '0' && (_c) <= '9') || ((_c) == '_') || ((_c) == '-'))
|
|
#define is_alpha(_c) (((_c) >= 'a' && (_c) <= 'z') || ((_c) >= 'A' && (_c) <= 'Z') || ((_c) >= '0' && (_c) <= '9') || ((_c) == '_') || ((_c) == '-'))
|
|
@@ -551,8 +559,9 @@ static int parse_sdp_content(struct sip_msg* msg, struct sdp_session *sess) {
|
|
str line, lvalue, body;
|
|
str line, lvalue, body;
|
|
int sess_fl, i, cline_count, codec_count;
|
|
int sess_fl, i, cline_count, codec_count;
|
|
char ltype, savec;
|
|
char ltype, savec;
|
|
- unsigned int cline_ip;
|
|
|
|
|
|
+ struct xt_rtpproxy_addr cline_ip;
|
|
enum send_rec_modifier sess_send_rec_modifier;
|
|
enum send_rec_modifier sess_send_rec_modifier;
|
|
|
|
+ char cline_ver;
|
|
|
|
|
|
static struct sdp_codec codecs[MAX_CODEC_NUMBER];
|
|
static struct sdp_codec codecs[MAX_CODEC_NUMBER];
|
|
|
|
|
|
@@ -631,7 +640,7 @@ static int parse_sdp_content(struct sip_msg* msg, struct sdp_session *sess) {
|
|
sess->media_count = 0;
|
|
sess->media_count = 0;
|
|
sess->cline_ip_s.s = NULL; /* make gcc happy */
|
|
sess->cline_ip_s.s = NULL; /* make gcc happy */
|
|
sess->cline_ip_s.len = 0;
|
|
sess->cline_ip_s.len = 0;
|
|
- cline_ip = 0;
|
|
|
|
|
|
+ cline_ip.ver = 0;
|
|
cline_count = 0;
|
|
cline_count = 0;
|
|
codec_count = 0;
|
|
codec_count = 0;
|
|
memset(&codecs, 0, sizeof(codecs));
|
|
memset(&codecs, 0, sizeof(codecs));
|
|
@@ -649,12 +658,12 @@ static int parse_sdp_content(struct sip_msg* msg, struct sdp_session *sess) {
|
|
sess_fl = 1;
|
|
sess_fl = 1;
|
|
break;
|
|
break;
|
|
case 'o':
|
|
case 'o':
|
|
- /* originator & session description: o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address> */
|
|
|
|
|
|
+ /* originator & session description: o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
|
|
|
|
+ o=assistant 971731711378798081 0 IN IP6 2001:db8::20 */
|
|
if (sess_fl != 1) {
|
|
if (sess_fl != 1) {
|
|
ERR(MODULE_NAME": parse_sdp_content: o= line is not in session section\n");
|
|
ERR(MODULE_NAME": parse_sdp_content: o= line is not in session section\n");
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
- for (i=0; i<6; i++)
|
|
|
|
if (sess->oline_addr_s.s) {
|
|
if (sess->oline_addr_s.s) {
|
|
ERR(MODULE_NAME": parse_sdp_content: only one o= line allowed\n");
|
|
ERR(MODULE_NAME": parse_sdp_content: only one o= line allowed\n");
|
|
return -1;
|
|
return -1;
|
|
@@ -664,11 +673,20 @@ static int parse_sdp_content(struct sip_msg* msg, struct sdp_session *sess) {
|
|
if (!sess->oline_user_s.len) goto invalid_o;
|
|
if (!sess->oline_user_s.len) goto invalid_o;
|
|
sess->oline_user_s.s = lvalue.s;
|
|
sess->oline_user_s.s = lvalue.s;
|
|
lvalue.s = eat_space_end(cp, lend);
|
|
lvalue.s = eat_space_end(cp, lend);
|
|
- for (i=0; i<4; i++) {
|
|
|
|
- cp = eat_token_end(lvalue.s, lend);
|
|
|
|
- if (cp-lvalue.s == 0) goto invalid_o;
|
|
|
|
- lvalue.s = eat_space_end(cp, lend);
|
|
|
|
|
|
+ for (i=0; i<3; i++) {
|
|
|
|
+ cp = eat_token_end(lvalue.s, lend);
|
|
|
|
+ if (cp-lvalue.s == 0) goto invalid_o;
|
|
|
|
+ lvalue.s = eat_space_end(cp, lend);
|
|
}
|
|
}
|
|
|
|
+ cp = eat_token_end(lvalue.s, lend);
|
|
|
|
+ if (cp-lvalue.s != 3 || memcmp(lvalue.s, "IP", 2) != 0 ||
|
|
|
|
+ !(lvalue.s[2] == '4' || lvalue.s[2] == '6')
|
|
|
|
+ ){ /* IP4 or IP6 */
|
|
|
|
+ goto invalid_o;
|
|
|
|
+ }
|
|
|
|
+ sess->oline_ip_ver = lvalue.s[2]-'0';
|
|
|
|
+ lvalue.s = eat_space_end(cp, lend);
|
|
|
|
+
|
|
cp = eat_token_end(lvalue.s, lend);
|
|
cp = eat_token_end(lvalue.s, lend);
|
|
sess->oline_addr_s.len = cp-lvalue.s;
|
|
sess->oline_addr_s.len = cp-lvalue.s;
|
|
if (!sess->oline_addr_s.len) goto invalid_o;
|
|
if (!sess->oline_addr_s.len) goto invalid_o;
|
|
@@ -678,7 +696,9 @@ static int parse_sdp_content(struct sip_msg* msg, struct sdp_session *sess) {
|
|
ERR(MODULE_NAME": parse_sdp_content: invalid o= line '%.*s'\n", (int) (lend-line.s), line.s);
|
|
ERR(MODULE_NAME": parse_sdp_content: invalid o= line '%.*s'\n", (int) (lend-line.s), line.s);
|
|
return -1;
|
|
return -1;
|
|
case 'c':
|
|
case 'c':
|
|
- /* Connection Data: c=<network type> <address type> <connection address>, ex. c=IN IP4 224.2.17.12/127 */
|
|
|
|
|
|
+ /* Connection Data:
|
|
|
|
+ c=<network type> <address type> <connection address>, ex. c=IN IP4 224.2.17.12/127
|
|
|
|
+ c=IN IP6 2001:db8::20 */
|
|
switch (sess_fl) {
|
|
switch (sess_fl) {
|
|
case 0:
|
|
case 0:
|
|
ERR(MODULE_NAME": parse_sdp_content: c= line is not in session section\n");
|
|
ERR(MODULE_NAME": parse_sdp_content: c= line is not in session section\n");
|
|
@@ -704,9 +724,12 @@ static int parse_sdp_content(struct sip_msg* msg, struct sdp_session *sess) {
|
|
cp = eat_space_end(cp, lend);
|
|
cp = eat_space_end(cp, lend);
|
|
lvalue.s = cp;
|
|
lvalue.s = cp;
|
|
cp = eat_token_end(cp, lend);
|
|
cp = eat_token_end(cp, lend);
|
|
- if (cp-lvalue.s != 3 || memcmp(lvalue.s, "IP4", 3) != 0) {
|
|
|
|
|
|
+ if (cp-lvalue.s != 3 || memcmp(lvalue.s, "IP", 2) != 0 ||
|
|
|
|
+ !(lvalue.s[2] == '4' || lvalue.s[2] == '6')
|
|
|
|
+ ) { /* IP4 or IP6 */
|
|
goto invalidate;
|
|
goto invalidate;
|
|
}
|
|
}
|
|
|
|
+ cline_ver = lvalue.s[2];
|
|
cp = eat_space_end(cp, lend);
|
|
cp = eat_space_end(cp, lend);
|
|
lvalue.s = cp;
|
|
lvalue.s = cp;
|
|
cp = eat_token_end(cp, lend);
|
|
cp = eat_token_end(cp, lend);
|
|
@@ -717,11 +740,17 @@ static int parse_sdp_content(struct sip_msg* msg, struct sdp_session *sess) {
|
|
}
|
|
}
|
|
if (sess_fl == 1) {
|
|
if (sess_fl == 1) {
|
|
sess->cline_ip_s = lvalue;
|
|
sess->cline_ip_s = lvalue;
|
|
- cline_ip = s2ip4(&lvalue);
|
|
|
|
|
|
+ s2ip(&lvalue, &cline_ip);
|
|
|
|
+ if (cline_ip.ver != cline_ver) {
|
|
|
|
+ goto invalidate;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
else {
|
|
else {
|
|
- sess->media[sess->media_count-1].ip = s2ip4(&lvalue);
|
|
|
|
- sess->media[sess->media_count-1].active = sess->media[sess->media_count-1].port != 0; /* IP may by specified by hostname */
|
|
|
|
|
|
+ s2ip(&lvalue, &sess->media[sess->media_count-1].addr);
|
|
|
|
+ if (sess->media[sess->media_count-1].addr.ver != cline_ver) {
|
|
|
|
+ goto invalidate;
|
|
|
|
+ }
|
|
|
|
+ sess->media[sess->media_count-1].active = sess->media[sess->media_count-1].addr.port != 0; /* IP may by specified by hostname */
|
|
sess->media[sess->media_count-1].ip_s = lvalue;
|
|
sess->media[sess->media_count-1].ip_s = lvalue;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
@@ -788,7 +817,9 @@ static int parse_sdp_content(struct sip_msg* msg, struct sdp_session *sess) {
|
|
if (name2enum(&lvalue, &supported_protocols) >= 0) {
|
|
if (name2enum(&lvalue, &supported_protocols) >= 0) {
|
|
sess->media[sess->media_count-1].active = sess->cline_ip_s.len != 0; /* IP may by specified by hostname */
|
|
sess->media[sess->media_count-1].active = sess->cline_ip_s.len != 0; /* IP may by specified by hostname */
|
|
sess->media[sess->media_count-1].ip_s = sess->cline_ip_s;
|
|
sess->media[sess->media_count-1].ip_s = sess->cline_ip_s;
|
|
- sess->media[sess->media_count-1].ip = cline_ip;
|
|
|
|
|
|
+ sess->media[sess->media_count-1].addr.ver = cline_ip.ver;
|
|
|
|
+ sess->media[sess->media_count-1].addr.ip6 = cline_ip.ip6;
|
|
|
|
+
|
|
}
|
|
}
|
|
/* get payload types */
|
|
/* get payload types */
|
|
sess->media[sess->media_count-1].codecs = (struct sdp_codec (*)[]) (codecs + codec_count);
|
|
sess->media[sess->media_count-1].codecs = (struct sdp_codec (*)[]) (codecs + codec_count);
|
|
@@ -973,8 +1004,13 @@ static int prepare_lumps(struct sip_msg* msg, str* position, str* s) {
|
|
static int update_sdp_content(struct sip_msg* msg, int gate_a_to_b, struct sdp_session *sdp_sess, struct ipt_session *ipt_sess) {
|
|
static int update_sdp_content(struct sip_msg* msg, int gate_a_to_b, struct sdp_session *sdp_sess, struct ipt_session *ipt_sess) {
|
|
int i, j;
|
|
int i, j;
|
|
str s;
|
|
str s;
|
|
|
|
+ struct xt_rtpproxy_addr null_addr;
|
|
/* we must apply lumps for relevant c= and m= lines */
|
|
/* we must apply lumps for relevant c= and m= lines */
|
|
global_params.sdp_ip.len = 0;
|
|
global_params.sdp_ip.len = 0;
|
|
|
|
+ memset(&null_addr, 0, sizeof(null_addr));
|
|
|
|
+ null_addr.ver = 4;
|
|
|
|
+// TODO: 4 or 6 ??
|
|
|
|
+
|
|
for (i=0; i<sdp_sess->media_count; i++) {
|
|
for (i=0; i<sdp_sess->media_count; i++) {
|
|
if (sdp_sess->media[i].active) {
|
|
if (sdp_sess->media[i].active) {
|
|
if (ipt_sess->sdp_media[i] < 0) {
|
|
if (ipt_sess->sdp_media[i] < 0) {
|
|
@@ -989,9 +1025,9 @@ static int update_sdp_content(struct sip_msg* msg, int gate_a_to_b, struct sdp_s
|
|
/* takes 1st ip to be rewritten, for aux purposes only */
|
|
/* takes 1st ip to be rewritten, for aux purposes only */
|
|
global_params.sdp_ip = sdp_sess->media[i].ip_s;
|
|
global_params.sdp_ip = sdp_sess->media[i].ip_s;
|
|
}
|
|
}
|
|
- if (sdp_sess->media[i].ip != 0) { /* we won't update 0.0.0.0 to anything because such a UA cannot receive. The session may be allocated and reused (unless expires) */
|
|
|
|
|
|
+ if (sdp_sess->media[i].addr.ver != 0) { /* we won't update 0.0.0.0 to anything because such a UA cannot receive. The session may be allocated and reused (unless expires) */
|
|
/* apply lump for ip address in c= line */
|
|
/* apply lump for ip address in c= line */
|
|
- ip42s(ipt_sess->sessions[ipt_sess->sdp_media[i]].dir[!gate_a_to_b].switchboard.addr.ip, &s);
|
|
|
|
|
|
+ ip2s(&ipt_sess->sessions[ipt_sess->sdp_media[i]].dir[!gate_a_to_b].switchboard.addr, &s);
|
|
if (prepare_lumps(msg, &sdp_sess->media[i].ip_s, &s) < 0)
|
|
if (prepare_lumps(msg, &sdp_sess->media[i].ip_s, &s) < 0)
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
@@ -1004,7 +1040,7 @@ static int update_sdp_content(struct sip_msg* msg, int gate_a_to_b, struct sdp_s
|
|
}
|
|
}
|
|
/* do topo hiding if all media are disabled for c= line then set address 0.0.0.0 to hide UA location */
|
|
/* do topo hiding if all media are disabled for c= line then set address 0.0.0.0 to hide UA location */
|
|
for (i=0; i<sdp_sess->media_count; i++) {
|
|
for (i=0; i<sdp_sess->media_count; i++) {
|
|
- if (sdp_sess->media[i].ip && (!sdp_sess->media[i].active || ipt_sess->sdp_media[i] < 0)) { /* not affected but previous loop */
|
|
|
|
|
|
+ if (sdp_sess->media[i].addr.ver && (!sdp_sess->media[i].active || ipt_sess->sdp_media[i] < 0)) { /* not affected but previous loop */
|
|
if (sdp_sess->media[i].ip_s.s == sdp_sess->cline_ip_s.s) { /* the c= may be shared */
|
|
if (sdp_sess->media[i].ip_s.s == sdp_sess->cline_ip_s.s) { /* the c= may be shared */
|
|
for (j=0; j<i; j++) {
|
|
for (j=0; j<i; j++) {
|
|
if (sdp_sess->media[i].ip_s.s == sdp_sess->media[j].ip_s.s) {
|
|
if (sdp_sess->media[i].ip_s.s == sdp_sess->media[j].ip_s.s) {
|
|
@@ -1019,7 +1055,7 @@ static int update_sdp_content(struct sip_msg* msg, int gate_a_to_b, struct sdp_s
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/* apply lump for ip address in c= line */
|
|
/* apply lump for ip address in c= line */
|
|
- ip42s(0, &s);
|
|
|
|
|
|
+ ip2s(&null_addr, &s);
|
|
if (prepare_lumps(msg, &sdp_sess->media[i].ip_s, &s) < 0)
|
|
if (prepare_lumps(msg, &sdp_sess->media[i].ip_s, &s) < 0)
|
|
return -1;
|
|
return -1;
|
|
cline_fixed2:
|
|
cline_fixed2:
|
|
@@ -1029,12 +1065,12 @@ static int update_sdp_content(struct sip_msg* msg, int gate_a_to_b, struct sdp_s
|
|
/* do topo hiding of session c= lines which are not used in any media section */
|
|
/* do topo hiding of session c= lines which are not used in any media section */
|
|
if (sdp_sess->cline_ip_s.len > 0) {
|
|
if (sdp_sess->cline_ip_s.len > 0) {
|
|
for (i=0; i<sdp_sess->media_count; i++) {
|
|
for (i=0; i<sdp_sess->media_count; i++) {
|
|
- if (sdp_sess->media[i].ip && sdp_sess->media[i].ip_s.s == sdp_sess->cline_ip_s.s) {
|
|
|
|
|
|
+ if (sdp_sess->media[i].addr.ver && sdp_sess->media[i].ip_s.s == sdp_sess->cline_ip_s.s) {
|
|
goto cline_fixed3;
|
|
goto cline_fixed3;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/* apply lump for ip address in c= line */
|
|
/* apply lump for ip address in c= line */
|
|
- ip42s(0, &s);
|
|
|
|
|
|
+ ip2s(&null_addr, &s);
|
|
if (prepare_lumps(msg, &sdp_sess->cline_ip_s, &s) < 0)
|
|
if (prepare_lumps(msg, &sdp_sess->cline_ip_s, &s) < 0)
|
|
return -1;
|
|
return -1;
|
|
cline_fixed3:
|
|
cline_fixed3:
|
|
@@ -1232,7 +1268,7 @@ inline static void fill_in_session(int flags, int media_idx, struct sdp_session
|
|
for (j=0; j<2; j++) {
|
|
for (j=0; j<2; j++) {
|
|
if (sdp_sess) {
|
|
if (sdp_sess) {
|
|
in_session->dir[GATE_A_TO_B(flags)].stream[j].flags |= XT_RTPPROXY_SOCKOPT_FLAG_SESSION_ADDR;
|
|
in_session->dir[GATE_A_TO_B(flags)].stream[j].flags |= XT_RTPPROXY_SOCKOPT_FLAG_SESSION_ADDR;
|
|
- in_session->dir[GATE_A_TO_B(flags)].stream[j].source.ip = sdp_sess->media[media_idx].ip;
|
|
|
|
|
|
+ in_session->dir[GATE_A_TO_B(flags)].stream[j].source = sdp_sess->media[media_idx].addr;
|
|
in_session->dir[GATE_A_TO_B(flags)].stream[j].source.port = sdp_sess->media[media_idx].port+j;
|
|
in_session->dir[GATE_A_TO_B(flags)].stream[j].source.port = sdp_sess->media[media_idx].port+j;
|
|
}
|
|
}
|
|
if (global_params.learning_timeout >= 0) {
|
|
if (global_params.learning_timeout >= 0) {
|
|
@@ -1262,6 +1298,12 @@ inline static void fill_in_session_throttle(int flags, int media_idx, struct xt_
|
|
in_session->dir[GATE_A_TO_B(flags)].stream[j].flags |= XT_RTPPROXY_SOCKOPT_FLAG_THROTTLE_MARK;
|
|
in_session->dir[GATE_A_TO_B(flags)].stream[j].flags |= XT_RTPPROXY_SOCKOPT_FLAG_THROTTLE_MARK;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ if (global_params.session_mark > 0) {
|
|
|
|
+ for (j=0; j<2; j++) {
|
|
|
|
+ in_session->dir[GATE_A_TO_B(flags)].stream[j].mark = global_params.session_mark;
|
|
|
|
+ in_session->dir[GATE_A_TO_B(flags)].stream[j].flags |= XT_RTPPROXY_SOCKOPT_FLAG_MARK;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
for (j=0; j<2; j++) {
|
|
for (j=0; j<2; j++) {
|
|
if (global_params.codec_set &&
|
|
if (global_params.codec_set &&
|
|
(global_params.codec_set->media_types[global_sdp_sess.media[media_idx].media_type].throttle.bandwidth[j].packets > 0 ||
|
|
(global_params.codec_set->media_types[global_sdp_sess.media[media_idx].media_type].throttle.bandwidth[j].packets > 0 ||
|
|
@@ -1321,8 +1363,8 @@ ERR("RTPPROXY_DEBUG: xt_RTPPROXY_update_sessions(sess#:%d, sdp#:%d, XT_RTPPROXY_
|
|
for (j = 0; j < i; j++) {
|
|
for (j = 0; j < i; j++) {
|
|
/* if two media streams have equal source address than we will allocate only one ipt session */
|
|
/* if two media streams have equal source address than we will allocate only one ipt session */
|
|
if (global_sdp_sess.media[j].active) {
|
|
if (global_sdp_sess.media[j].active) {
|
|
- if (global_sdp_sess.media[i].ip == global_sdp_sess.media[j].ip && global_sdp_sess.media[i].port == global_sdp_sess.media[j].port) {
|
|
|
|
- if (global_sdp_sess.media[i].ip != 0) {
|
|
|
|
|
|
+ if (xt_rtpproxy_addr_test(&global_sdp_sess.media[i].addr, &global_sdp_sess.media[j].addr)==3) {
|
|
|
|
+ if (global_sdp_sess.media[i].addr.ver != 0) {
|
|
ipt_sess.sdp_media[i] = ipt_sess.sdp_media[j];
|
|
ipt_sess.sdp_media[i] = ipt_sess.sdp_media[j];
|
|
goto cont;
|
|
goto cont;
|
|
} else if (i < global_params.protected_sess.sdp_media_count) {
|
|
} else if (i < global_params.protected_sess.sdp_media_count) {
|
|
@@ -1330,7 +1372,7 @@ ERR("RTPPROXY_DEBUG: xt_RTPPROXY_update_sessions(sess#:%d, sdp#:%d, XT_RTPPROXY_
|
|
k = global_params.protected_sess.sdp_media[i];
|
|
k = global_params.protected_sess.sdp_media[i];
|
|
l = global_params.protected_sess.sdp_media[j];
|
|
l = global_params.protected_sess.sdp_media[j];
|
|
if ((global_params.protected_sess.sessions[k].sh.flags & XT_RTPPROXY_SOCKOPT_FLAG_NOT_FOUND) == 0 &&
|
|
if ((global_params.protected_sess.sessions[k].sh.flags & XT_RTPPROXY_SOCKOPT_FLAG_NOT_FOUND) == 0 &&
|
|
- global_params.protected_sess.sessions[k].dir[GATE_A_TO_B(flags)].stream[0].source.ip == global_params.protected_sess.sessions[l].dir[GATE_A_TO_B(flags)].stream[0].source.ip &&
|
|
|
|
|
|
+ global_params.protected_sess.sessions[k].dir[GATE_A_TO_B(flags)].stream[0].source.ip == global_params.protected_sess.sessions[l].dir[GATE_A_TO_B(flags)].stream[0].source.ver &&
|
|
global_params.protected_sess.sessions[k].dir[GATE_A_TO_B(flags)].stream[0].source.port == global_params.protected_sess.sessions[l].dir[GATE_A_TO_B(flags)].stream[0].source.port) {
|
|
global_params.protected_sess.sessions[k].dir[GATE_A_TO_B(flags)].stream[0].source.port == global_params.protected_sess.sessions[l].dir[GATE_A_TO_B(flags)].stream[0].source.port) {
|
|
|
|
|
|
/* if ip == 0, for example phone goes on-hold we'll take IP from protected sessions if possible */
|
|
/* if ip == 0, for example phone goes on-hold we'll take IP from protected sessions if possible */
|
|
@@ -1359,12 +1401,12 @@ ERR("RTPPROXY_DEBUG: protected.sess media:%d -> sess:%d, flags: %d\n", i, k, glo
|
|
can't tricle. It would not force new RTP session allocation.
|
|
can't tricle. It would not force new RTP session allocation.
|
|
So we won't update SDP c= line but get sees_id from protected sess to reuse it when on-hold terminates.
|
|
So we won't update SDP c= line but get sees_id from protected sess to reuse it when on-hold terminates.
|
|
But when on-hold is too long and session expires then new session will be allocated */
|
|
But when on-hold is too long and session expires then new session will be allocated */
|
|
-ERR("DEBUG_RTPPROXY: module: CMP %x=%x & %d=%d\n", global_sdp_sess.media[i].ip, global_params.protected_sess.sessions[k].dir[GATE_A_TO_B(flags)].stream[0].source.ip, global_sdp_sess.media[i].port, global_params.protected_sess.sessions[k].dir[GATE_A_TO_B(flags)].stream[0].source.port);
|
|
|
|
- if ((global_sdp_sess.media[i].ip == 0 ||
|
|
|
|
- global_params.protected_sess.sessions[k].dir[GATE_A_TO_B(flags)].stream[0].source.ip == 0 ||
|
|
|
|
- global_params.protected_sess.sessions[k].dir[GATE_A_TO_B(flags)].stream[0].source.ip == global_sdp_sess.media[i].ip) &&
|
|
|
|
|
|
+ERR("DEBUG_RTPPROXY: module: CMP %x=%x & %d=%d\n", global_sdp_sess.media[i].addr.ip, global_params.protected_sess.sessions[k].dir[GATE_A_TO_B(flags)].stream[0].source.ip, global_sdp_sess.media[i].addr.port, global_params.protected_sess.sessions[k].dir[GATE_A_TO_B(flags)].stream[0].source.port);
|
|
|
|
+ if ((global_sdp_sess.media[i].addr.ver == 0 ||
|
|
|
|
+ global_params.protected_sess.sessions[k].dir[GATE_A_TO_B(flags)].stream[0].source.ver == 0 ||
|
|
|
|
+ (xt_rtpproxy_addr_test(&global_params.protected_sess.sessions[k].dir[GATE_A_TO_B(flags)].stream[0].source, &global_sdp_sess.media[i].addr) & 1)) &&
|
|
/* global_sdp_sess.media[i].port always because active && */
|
|
/* global_sdp_sess.media[i].port always because active && */
|
|
- global_params.protected_sess.sessions[k].dir[GATE_A_TO_B(flags)].stream[0].source.port == global_sdp_sess.media[i].port) {
|
|
|
|
|
|
+ global_params.protected_sess.sessions[k].dir[GATE_A_TO_B(flags)].stream[0].source.port == global_sdp_sess.media[i].addr.port) {
|
|
/* keep all reused sess at the beginning of list, i.e. make slot */
|
|
/* keep all reused sess at the beginning of list, i.e. make slot */
|
|
ERR("RTPPROXY_DEBUG: REUSE!\n");
|
|
ERR("RTPPROXY_DEBUG: REUSE!\n");
|
|
for (j=ipt_sess.session_count; j > 0; j--) {
|
|
for (j=ipt_sess.session_count; j > 0; j--) {
|
|
@@ -1392,7 +1434,7 @@ ERR("RTPPROXY_DEBUG: REUSE!\n");
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
- if (global_sdp_sess.media[i].ip == 0) {
|
|
|
|
|
|
+ if (global_sdp_sess.media[i].addr.ver == 0) {
|
|
switch (global_sdp_sess.media[i].send_rec_modifier) {
|
|
switch (global_sdp_sess.media[i].send_rec_modifier) {
|
|
case sdpaattr_sendonly:
|
|
case sdpaattr_sendonly:
|
|
case sdpaattr_sendrecv: /* it's error because it cannot receive anything but client are weird */
|
|
case sdpaattr_sendrecv: /* it's error because it cannot receive anything but client are weird */
|
|
@@ -1665,7 +1707,7 @@ static int rtpproxy_update(struct sip_msg* msg, char* _flags, char* _session_ids
|
|
for (j = i+1; j < global_sdp_sess.media_count; j++) {
|
|
for (j = i+1; j < global_sdp_sess.media_count; j++) {
|
|
if (ipt_sess.sdp_media[j] >= 0 && global_sdp_sess.media[j].active) {
|
|
if (ipt_sess.sdp_media[j] >= 0 && global_sdp_sess.media[j].active) {
|
|
/* if two media streams have equal source address XOR have equal session */
|
|
/* if two media streams have equal source address XOR have equal session */
|
|
- if ( (global_sdp_sess.media[i].ip == global_sdp_sess.media[j].ip && global_sdp_sess.media[i].port == global_sdp_sess.media[j].port) ^
|
|
|
|
|
|
+ if ( (xt_rtpproxy_addr_test(&global_sdp_sess.media[i].addr, &global_sdp_sess.media[j].addr) == 3) ^
|
|
(ipt_sess.sdp_media[i] == ipt_sess.sdp_media[j]) ) {
|
|
(ipt_sess.sdp_media[i] == ipt_sess.sdp_media[j]) ) {
|
|
ERR(MODULE_NAME": rtpproxy_update: media (%d,%d) violation number\n", i, j);
|
|
ERR(MODULE_NAME": rtpproxy_update: media (%d,%d) violation number\n", i, j);
|
|
return -1;
|
|
return -1;
|
|
@@ -1874,7 +1916,7 @@ static int rtpproxy_authorize_media(struct sip_msg* msg, char* _dummy1, char* _d
|
|
|
|
|
|
static int rtpproxy_set_param(struct sip_msg* msg, char* _idx, char* _value) {
|
|
static int rtpproxy_set_param(struct sip_msg* msg, char* _idx, char* _value) {
|
|
int idx, dir;
|
|
int idx, dir;
|
|
- unsigned int ip;
|
|
|
|
|
|
+ struct xt_rtpproxy_addr ip;
|
|
idx = PTR2INT(_idx);
|
|
idx = PTR2INT(_idx);
|
|
union {
|
|
union {
|
|
str s;
|
|
str s;
|
|
@@ -1910,12 +1952,12 @@ static int rtpproxy_set_param(struct sip_msg* msg, char* _idx, char* _value) {
|
|
break;
|
|
break;
|
|
case PAR_SWITCHBOARD_BY_SIP_IP_A:
|
|
case PAR_SWITCHBOARD_BY_SIP_IP_A:
|
|
case PAR_SWITCHBOARD_BY_SIP_IP_B:
|
|
case PAR_SWITCHBOARD_BY_SIP_IP_B:
|
|
- ip = s2ip4(&u.s);
|
|
|
|
|
|
+ s2ip(&u.s, &ip);
|
|
for (global_params.switchboard[dir] = switchboards;
|
|
for (global_params.switchboard[dir] = switchboards;
|
|
global_params.switchboard[dir];
|
|
global_params.switchboard[dir];
|
|
global_params.switchboard[dir] = global_params.switchboard[dir]->next) {
|
|
global_params.switchboard[dir] = global_params.switchboard[dir]->next) {
|
|
|
|
|
|
- if (ip == global_params.switchboard[dir]->sip_ip) {
|
|
|
|
|
|
+ if (xt_rtpproxy_addr_test(&ip, &global_params.switchboard[dir]->sip_ip)) {
|
|
global_params.aggregation[dir] = NULL; /* invalidate aggregation */
|
|
global_params.aggregation[dir] = NULL; /* invalidate aggregation */
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
@@ -1928,18 +1970,18 @@ static int rtpproxy_set_param(struct sip_msg* msg, char* _idx, char* _value) {
|
|
break;
|
|
break;
|
|
case PAR_AGGREGATION_BY_SIP_IP_A:
|
|
case PAR_AGGREGATION_BY_SIP_IP_A:
|
|
case PAR_AGGREGATION_BY_SIP_IP_B:
|
|
case PAR_AGGREGATION_BY_SIP_IP_B:
|
|
- ip = s2ip4(&u.s);
|
|
|
|
|
|
+ s2ip(&u.s, &ip);
|
|
for (global_params.aggregation[dir] = aggregations;
|
|
for (global_params.aggregation[dir] = aggregations;
|
|
global_params.aggregation[dir];
|
|
global_params.aggregation[dir];
|
|
global_params.aggregation[dir] = global_params.aggregation[dir]->next) {
|
|
global_params.aggregation[dir] = global_params.aggregation[dir]->next) {
|
|
|
|
|
|
- if (ip == global_params.aggregation[dir]->sip_ip) {
|
|
|
|
|
|
+ if (xt_rtpproxy_addr_test(&ip, &global_params.aggregation[dir]->sip_ip)) {
|
|
global_params.switchboard[dir] = NULL; /* invalidate switchboard */
|
|
global_params.switchboard[dir] = NULL; /* invalidate switchboard */
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return -1;
|
|
return -1;
|
|
- case PAR_THROTTLE_MARK:
|
|
|
|
|
|
+ case PAR_THROTTLE_MARK:
|
|
global_params.throttle.mark = u.i;
|
|
global_params.throttle.mark = u.i;
|
|
break;
|
|
break;
|
|
case PAR_THROTTLE_RTP_MAX_BYTES:
|
|
case PAR_THROTTLE_RTP_MAX_BYTES:
|
|
@@ -1951,6 +1993,10 @@ static int rtpproxy_set_param(struct sip_msg* msg, char* _idx, char* _value) {
|
|
global_params.throttle.bandwidth[param_list[idx].id==PAR_THROTTLE_RTCP_MAX_PACKETS].packets = u.i;
|
|
global_params.throttle.bandwidth[param_list[idx].id==PAR_THROTTLE_RTCP_MAX_PACKETS].packets = u.i;
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ case PAR_SESSION_MARK:
|
|
|
|
+ global_params.session_mark = u.i;
|
|
|
|
+ break;
|
|
|
|
+
|
|
case PAR_CODEC_SET:
|
|
case PAR_CODEC_SET:
|
|
if (!(global_params.codec_set = find_codec_set(&u.s, NULL)))
|
|
if (!(global_params.codec_set = find_codec_set(&u.s, NULL)))
|
|
return -1;
|
|
return -1;
|
|
@@ -2067,6 +2113,10 @@ static int sel_rtpproxy(str* res, select_t* s, struct sip_msg* msg) { /* dummy
|
|
if (check_parse_sdp_content(msg, &global_sdp_sess) < 0) return -1;
|
|
if (check_parse_sdp_content(msg, &global_sdp_sess) < 0) return -1;
|
|
u.s = global_sdp_sess.oline_addr_s;
|
|
u.s = global_sdp_sess.oline_addr_s;
|
|
break;
|
|
break;
|
|
|
|
+ case PAR_OLINE_IP_VER:
|
|
|
|
+ if (check_parse_sdp_content(msg, &global_sdp_sess) < 0) return -1;
|
|
|
|
+ u.i = global_sdp_sess.oline_ip_ver;
|
|
|
|
+ break;
|
|
case PAR_SESSION_IDS:
|
|
case PAR_SESSION_IDS:
|
|
u.s = global_params.session_ids;
|
|
u.s = global_params.session_ids;
|
|
break;
|
|
break;
|
|
@@ -2081,6 +2131,9 @@ static int sel_rtpproxy(str* res, select_t* s, struct sip_msg* msg) { /* dummy
|
|
case PAR_THROTTLE_RTCP_MAX_PACKETS:
|
|
case PAR_THROTTLE_RTCP_MAX_PACKETS:
|
|
u.i = global_params.throttle.bandwidth[param_list[idx].id==PAR_THROTTLE_RTCP_MAX_PACKETS].packets;
|
|
u.i = global_params.throttle.bandwidth[param_list[idx].id==PAR_THROTTLE_RTCP_MAX_PACKETS].packets;
|
|
break;
|
|
break;
|
|
|
|
+ case PAR_SESSION_MARK:
|
|
|
|
+ u.i = global_params.session_mark;
|
|
|
|
+ break;
|
|
case PAR_CODEC_SET:
|
|
case PAR_CODEC_SET:
|
|
if (global_params.codec_set)
|
|
if (global_params.codec_set)
|
|
u.s = global_params.codec_set->name;
|
|
u.s = global_params.codec_set->name;
|
|
@@ -2140,8 +2193,7 @@ static int cfg_parse_addr(void* param, cfg_parser_t* st, unsigned int flags) {
|
|
val.s = buff;
|
|
val.s = buff;
|
|
val.len = sizeof(buff)-1;
|
|
val.len = sizeof(buff)-1;
|
|
if (cfg_parse_str(&val, st, CFG_EXTENDED_ALPHA|CFG_STR_STATIC) < 0) return -1;
|
|
if (cfg_parse_str(&val, st, CFG_EXTENDED_ALPHA|CFG_STR_STATIC) < 0) return -1;
|
|
- *(uint32_t*)param = s2ip4(&val);
|
|
|
|
- if (*(uint32_t*)param == 0) {
|
|
|
|
|
|
+ if (!s2ip(&val, (struct xt_rtpproxy_addr*)param)) {
|
|
ERR(MODULE_NAME": parse_addr: bad ip address '%.*s'\n", STR_FMT(&val));
|
|
ERR(MODULE_NAME": parse_addr: bad ip address '%.*s'\n", STR_FMT(&val));
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
@@ -2248,6 +2300,7 @@ static int safe_parsed_values() {
|
|
si->name = parse_config_vals.name;
|
|
si->name = parse_config_vals.name;
|
|
si->next = (*prev_si);
|
|
si->next = (*prev_si);
|
|
(*prev_si) = si;
|
|
(*prev_si) = si;
|
|
|
|
+ PROC_DEFAULT(switchboard.addr.ver, 0);
|
|
PROC_DEFAULT(switchboard.addr.ip, 0);
|
|
PROC_DEFAULT(switchboard.addr.ip, 0);
|
|
PROC_DEFAULT(switchboard.addr.port, 0);
|
|
PROC_DEFAULT(switchboard.addr.port, 0);
|
|
if (parse_config_vals.parsed.switchboard.host.len) {
|
|
if (parse_config_vals.parsed.switchboard.host.len) {
|
|
@@ -2270,8 +2323,9 @@ static int safe_parsed_values() {
|
|
hi->name = parse_config_vals.name;
|
|
hi->name = parse_config_vals.name;
|
|
hi->next = (*prev_hi);
|
|
hi->next = (*prev_hi);
|
|
(*prev_hi) = hi;
|
|
(*prev_hi) = hi;
|
|
- PROC_DEFAULT(host.addr, 0);
|
|
|
|
- PROC_DEFAULT(host.port, 0);
|
|
|
|
|
|
+ PROC_DEFAULT(host.addr.ver, 0);
|
|
|
|
+ PROC_DEFAULT(host.addr.ip, 0);
|
|
|
|
+ PROC_DEFAULT(host.addr.port, 0);
|
|
PROC_DEFAULT(host.request_size, XT_RTPPROXY_RPC_DEFAULT_REQUEST_SIZE);
|
|
PROC_DEFAULT(host.request_size, XT_RTPPROXY_RPC_DEFAULT_REQUEST_SIZE);
|
|
PROC_DEFAULT(host.reply_size, XT_RTPPROXY_RPC_DEFAULT_REPLY_SIZE);
|
|
PROC_DEFAULT(host.reply_size, XT_RTPPROXY_RPC_DEFAULT_REPLY_SIZE);
|
|
PROC_DEFAULT(host.total_timeout, XT_RTPPROXY_RPC_DEFAULT_TOTAL_TIMEOUT);
|
|
PROC_DEFAULT(host.total_timeout, XT_RTPPROXY_RPC_DEFAULT_TOTAL_TIMEOUT);
|
|
@@ -2292,7 +2346,7 @@ static cfg_option_t section_switchboard_options[] = {
|
|
/* 1st pass */
|
|
/* 1st pass */
|
|
{NULL, .flags = CFG_DEFAULT, .f = cfg_parse_default},
|
|
{NULL, .flags = CFG_DEFAULT, .f = cfg_parse_default},
|
|
/* 2nd pass */
|
|
/* 2nd pass */
|
|
- {"addr", .f = cfg_parse_addr, .flags = CFG_CASE_SENSITIVE, .param = &parse_config_vals.parsed.switchboard.addr.ip},
|
|
|
|
|
|
+ {"addr", .f = cfg_parse_addr, .flags = CFG_CASE_SENSITIVE, .param = &parse_config_vals.parsed.switchboard.addr},
|
|
{"port", .f = cfg_parse_uint16, .flags = CFG_CASE_SENSITIVE, .param = &parse_config_vals.parsed.switchboard.addr.port},
|
|
{"port", .f = cfg_parse_uint16, .flags = CFG_CASE_SENSITIVE, .param = &parse_config_vals.parsed.switchboard.addr.port},
|
|
{"host", .f = cfg_parse_str, .flags = CFG_CASE_SENSITIVE|CFG_STR_PKGMEM, .param = &parse_config_vals.parsed.switchboard.host},
|
|
{"host", .f = cfg_parse_str, .flags = CFG_CASE_SENSITIVE|CFG_STR_PKGMEM, .param = &parse_config_vals.parsed.switchboard.host},
|
|
{NULL, .flags = CFG_DEFAULT, .f = cfg_parse_default}
|
|
{NULL, .flags = CFG_DEFAULT, .f = cfg_parse_default}
|
|
@@ -2309,7 +2363,7 @@ static cfg_option_t section_host_options[] = {
|
|
{NULL, .flags = CFG_DEFAULT, .f = cfg_parse_default},
|
|
{NULL, .flags = CFG_DEFAULT, .f = cfg_parse_default},
|
|
/* 2nd pass */
|
|
/* 2nd pass */
|
|
{"rpc-addr", .f = cfg_parse_addr, .flags = CFG_CASE_SENSITIVE, .param = &parse_config_vals.parsed.host.addr},
|
|
{"rpc-addr", .f = cfg_parse_addr, .flags = CFG_CASE_SENSITIVE, .param = &parse_config_vals.parsed.host.addr},
|
|
- {"rpc-port", .f = cfg_parse_uint16, .flags = CFG_CASE_SENSITIVE, .param = &parse_config_vals.parsed.host.port},
|
|
|
|
|
|
+ {"rpc-port", .f = cfg_parse_uint16, .flags = CFG_CASE_SENSITIVE, .param = &parse_config_vals.parsed.host.addr.port},
|
|
{"rpc-proto", .f = cfg_parse_enum, .flags = CFG_CASE_SENSITIVE, .param = protos},
|
|
{"rpc-proto", .f = cfg_parse_enum, .flags = CFG_CASE_SENSITIVE, .param = protos},
|
|
{"rpc-request-size", .f = cfg_parse_int, .flags = CFG_CASE_SENSITIVE, .param = &parse_config_vals.parsed.host.request_size},
|
|
{"rpc-request-size", .f = cfg_parse_int, .flags = CFG_CASE_SENSITIVE, .param = &parse_config_vals.parsed.host.request_size},
|
|
{"rpc-reply-size", .f = cfg_parse_int, .flags = CFG_CASE_SENSITIVE, .param = &parse_config_vals.parsed.host.reply_size},
|
|
{"rpc-reply-size", .f = cfg_parse_int, .flags = CFG_CASE_SENSITIVE, .param = &parse_config_vals.parsed.host.reply_size},
|
|
@@ -2332,9 +2386,6 @@ static cfg_option_t section_dummy_options[] = {
|
|
static int parse_section_name(void* param, cfg_parser_t* st, unsigned int flags) {
|
|
static int parse_section_name(void* param, cfg_parser_t* st, unsigned int flags) {
|
|
cfg_token_t t;
|
|
cfg_token_t t;
|
|
int ret, fl;
|
|
int ret, fl;
|
|
- str tok;
|
|
|
|
- char buf[MAX_TOKEN_LEN];
|
|
|
|
-
|
|
|
|
ret = safe_parsed_values();
|
|
ret = safe_parsed_values();
|
|
if (ret != 0) return ret;
|
|
if (ret != 0) return ret;
|
|
|
|
|
|
@@ -2357,31 +2408,8 @@ static int parse_section_name(void* param, cfg_parser_t* st, unsigned int flags)
|
|
if (ret != 0) return ret;
|
|
if (ret != 0) return ret;
|
|
if (t.type != ':')
|
|
if (t.type != ':')
|
|
goto skip;
|
|
goto skip;
|
|
-
|
|
|
|
- /* we need override cfg_parse_section() because of possible dash '-' in section name */
|
|
|
|
- tok.s = buf;
|
|
|
|
- tok.len = 0;
|
|
|
|
- while (1) {
|
|
|
|
- ret = cfg_get_token(&t, st, 0);
|
|
|
|
- if (ret != 0) return ret;
|
|
|
|
- if (t.type == ']')
|
|
|
|
- break;
|
|
|
|
- if (tok.len+t.val.len >= sizeof(buf)-1) goto skip;
|
|
|
|
- memcpy(tok.s+tok.len, t.val.s, t.val.len);
|
|
|
|
- tok.len += t.val.len;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- tok.s[tok.len] = '\0';
|
|
|
|
-
|
|
|
|
- ret = cfg_eat_eol(st, 0);
|
|
|
|
- if (ret != 0) {
|
|
|
|
- return ret;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- parse_config_vals.name.s = pkg_malloc(tok.len+1);
|
|
|
|
- if (!parse_config_vals.name.s) return -1;
|
|
|
|
- memcpy(parse_config_vals.name.s, tok.s, tok.len+1);
|
|
|
|
- parse_config_vals.name.len = tok.len;
|
|
|
|
|
|
+ ret = cfg_parse_section(&parse_config_vals.name, st, CFG_STR_PKGMEM);
|
|
|
|
+ if (ret != 0) return ret;
|
|
|
|
|
|
if (fl==iptrtpproxy_default) {
|
|
if (fl==iptrtpproxy_default) {
|
|
if (parse_config_vals.name.len == (sizeof(SWITCHBOARD_PREFIX)-1) && strncmp(parse_config_vals.name.s, SWITCHBOARD_PREFIX, parse_config_vals.name.len) == 0) {
|
|
if (parse_config_vals.name.len == (sizeof(SWITCHBOARD_PREFIX)-1) && strncmp(parse_config_vals.name.s, SWITCHBOARD_PREFIX, parse_config_vals.name.len) == 0) {
|
|
@@ -2453,7 +2481,7 @@ static int parse_iptrtpproxy_cfg() {
|
|
ERR(MODULE_NAME"parse_iptrtpproxy_cfg: host '%.*s' not found.\n", STR_FMT(&si->hostname));
|
|
ERR(MODULE_NAME"parse_iptrtpproxy_cfg: host '%.*s' not found.\n", STR_FMT(&si->hostname));
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
- si->sip_ip = si->switchboard_addr.ip;
|
|
|
|
|
|
+ si->sip_ip = si->switchboard_addr;
|
|
}
|
|
}
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -2543,10 +2571,10 @@ static int mod_init(void) {
|
|
if (!si->stat) return E_OUT_OF_MEM;
|
|
if (!si->stat) return E_OUT_OF_MEM;
|
|
memset(si->stat, 0, sizeof(*si->stat));
|
|
memset(si->stat, 0, sizeof(*si->stat));
|
|
|
|
|
|
- ip42s(si->switchboard_addr.ip, ips+0);
|
|
|
|
|
|
+ ip2s(&si->switchboard_addr, ips+0);
|
|
strncpy(buf1, ips[0].s, sizeof(buf1)-1);
|
|
strncpy(buf1, ips[0].s, sizeof(buf1)-1);
|
|
ips[0].s = buf1;
|
|
ips[0].s = buf1;
|
|
- ip42s(si->sip_ip, ips+1);
|
|
|
|
|
|
+ ip2s(&si->sip_ip, ips+1);
|
|
|
|
|
|
INFO(MODULE_NAME": mod_init: switchboard_name=%.*s;addr=%.*s;port=%d;sip-addr=%.*s;hostname=%.*s\n",
|
|
INFO(MODULE_NAME": mod_init: switchboard_name=%.*s;addr=%.*s;port=%d;sip-addr=%.*s;hostname=%.*s\n",
|
|
STR_FMT(&si->name),
|
|
STR_FMT(&si->name),
|
|
@@ -2559,7 +2587,7 @@ static int mod_init(void) {
|
|
}
|
|
}
|
|
for (ai = aggregations; ai; ai=ai->next) {
|
|
for (ai = aggregations; ai; ai=ai->next) {
|
|
str ips[1];
|
|
str ips[1];
|
|
- ip42s(ai->sip_ip, ips+0);
|
|
|
|
|
|
+ ip2s(&ai->sip_ip, ips+0);
|
|
INFO(MODULE_NAME": mod_init: aggregation '%.*s';sip-addr=%.*s\n",
|
|
INFO(MODULE_NAME": mod_init: aggregation '%.*s';sip-addr=%.*s\n",
|
|
STR_FMT(&ai->name),
|
|
STR_FMT(&ai->name),
|
|
STR_FMT(ips+0)
|
|
STR_FMT(ips+0)
|
|
@@ -2574,17 +2602,17 @@ static int mod_init(void) {
|
|
if (!hi->stat) return E_OUT_OF_MEM;
|
|
if (!hi->stat) return E_OUT_OF_MEM;
|
|
memset(hi->stat, 0, sizeof(*hi->stat));
|
|
memset(hi->stat, 0, sizeof(*hi->stat));
|
|
|
|
|
|
- ip42s(hi->rpc_params.addr, &ips);
|
|
|
|
|
|
+ ip2s(&hi->rpc_params.addr, &ips);
|
|
INFO(MODULE_NAME": mod_init: host_name=%.*s;rpc-addr=%.*s;rpc-port=%d;rpc-proto=%d,request-size=%d,reply-size=%d,total-timeout=%d,udp-retry-timeout=%d\n",
|
|
INFO(MODULE_NAME": mod_init: host_name=%.*s;rpc-addr=%.*s;rpc-port=%d;rpc-proto=%d,request-size=%d,reply-size=%d,total-timeout=%d,udp-retry-timeout=%d\n",
|
|
STR_FMT(&hi->name),
|
|
STR_FMT(&hi->name),
|
|
STR_FMT(&ips),
|
|
STR_FMT(&ips),
|
|
- hi->rpc_params.port,
|
|
|
|
|
|
+ hi->rpc_params.addr.port,
|
|
hi->rpc_params.proto,
|
|
hi->rpc_params.proto,
|
|
hi->rpc_params.request_size,
|
|
hi->rpc_params.request_size,
|
|
hi->rpc_params.reply_size,
|
|
hi->rpc_params.reply_size,
|
|
hi->rpc_params.total_timeout,
|
|
hi->rpc_params.total_timeout,
|
|
hi->rpc_params.udp_retry_timeout
|
|
hi->rpc_params.udp_retry_timeout
|
|
- );
|
|
|
|
|
|
+ );
|
|
}
|
|
}
|
|
|
|
|
|
if (!reg_codecs) {
|
|
if (!reg_codecs) {
|
|
@@ -2850,7 +2878,7 @@ static int declare_switchboard_param(modparam_t type, void* val) {
|
|
for (i=0; i<ai->switchboard_count; i++) {
|
|
for (i=0; i<ai->switchboard_count; i++) {
|
|
if ((*ai->switchboards)[i] == si) goto aggr_found;
|
|
if ((*ai->switchboards)[i] == si) goto aggr_found;
|
|
}
|
|
}
|
|
- if (!ai->sip_ip) {
|
|
|
|
|
|
+ if (!ai->sip_ip.ver) {
|
|
ai->sip_ip = si->sip_ip;
|
|
ai->sip_ip = si->sip_ip;
|
|
}
|
|
}
|
|
ai->switchboards = pkg_realloc(ai->switchboards, sizeof((*ai->switchboards)[0])*(ai->switchboard_count+1));
|
|
ai->switchboards = pkg_realloc(ai->switchboards, sizeof((*ai->switchboards)[0])*(ai->switchboard_count+1));
|
|
@@ -2861,8 +2889,7 @@ static int declare_switchboard_param(modparam_t type, void* val) {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
case par_SipAddr:
|
|
case par_SipAddr:
|
|
- si->sip_ip = s2ip4(&val);
|
|
|
|
- if (si->sip_ip == 0) {
|
|
|
|
|
|
+ if (!s2ip(&val, &si->sip_ip)) {
|
|
goto err_E_CFG;
|
|
goto err_E_CFG;
|
|
}
|
|
}
|
|
break;
|
|
break;
|