Skip to content

Commit 11783c1

Browse files
Major logic rework of one way hiding and compact thinfo
1 parent ac6d588 commit 11783c1

12 files changed

Lines changed: 1939 additions & 562 deletions

modules/rr/loose.c

Lines changed: 0 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -138,88 +138,6 @@ static inline int find_first_route(struct sip_msg* _m)
138138
}
139139

140140

141-
/*
142-
* Find out if a URI contains r2 parameter which indicates
143-
* that we put 2 record routes
144-
*/
145-
static inline int is_2rr(str* _params)
146-
{
147-
str s;
148-
int i, state = 0;
149-
150-
if (_params->len == 0) return 0;
151-
s = *_params;
152-
153-
for(i = 0; i < s.len; i++) {
154-
switch(state) {
155-
case 0:
156-
switch(s.s[i]) {
157-
case ' ':
158-
case '\r':
159-
case '\n':
160-
case '\t': break;
161-
case 'r':
162-
case 'R': state = 1; break;
163-
default: state = 4; break;
164-
}
165-
break;
166-
167-
case 1:
168-
switch(s.s[i]) {
169-
case '2': state = 2; break;
170-
default: state = 4; break;
171-
}
172-
break;
173-
174-
case 2:
175-
switch(s.s[i]) {
176-
case ';': return 1;
177-
case '=': return 1;
178-
case ' ':
179-
case '\r':
180-
case '\n':
181-
case '\t': state = 3; break;
182-
default: state = 4; break;
183-
}
184-
break;
185-
186-
case 3:
187-
switch(s.s[i]) {
188-
case ';': return 1;
189-
case '=': return 1;
190-
case ' ':
191-
case '\r':
192-
case '\n':
193-
case '\t': break;
194-
default: state = 4; break;
195-
}
196-
break;
197-
198-
case 4:
199-
switch(s.s[i]) {
200-
case '\"': state = 5; break;
201-
case ';': state = 0; break;
202-
default: break;
203-
}
204-
break;
205-
206-
case 5:
207-
switch(s.s[i]) {
208-
case '\\': state = 6; break;
209-
case '\"': state = 4; break;
210-
default: break;
211-
}
212-
break;
213-
214-
case 6: state = 5; break;
215-
}
216-
}
217-
218-
if ((state == 2) || (state == 3)) return 1;
219-
else return 0;
220-
}
221-
222-
223141
/*
224142
* Check if URI is myself
225143
*/

modules/rr/loose.h

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,5 +159,85 @@ static inline int is_strict(str* _params)
159159
else return 1;
160160
}
161161

162+
/*
163+
* Find out if a URI contains r2 parameter which indicates
164+
* that we put 2 record routes
165+
*/
166+
static inline int is_2rr(str* _params)
167+
{
168+
str s;
169+
int i, state = 0;
170+
171+
if (_params->len == 0) return 0;
172+
s = *_params;
173+
174+
for(i = 0; i < s.len; i++) {
175+
switch(state) {
176+
case 0:
177+
switch(s.s[i]) {
178+
case ' ':
179+
case '\r':
180+
case '\n':
181+
case '\t': break;
182+
case 'r':
183+
case 'R': state = 1; break;
184+
default: state = 4; break;
185+
}
186+
break;
187+
188+
case 1:
189+
switch(s.s[i]) {
190+
case '2': state = 2; break;
191+
default: state = 4; break;
192+
}
193+
break;
194+
195+
case 2:
196+
switch(s.s[i]) {
197+
case ';': return 1;
198+
case '=': return 1;
199+
case ' ':
200+
case '\r':
201+
case '\n':
202+
case '\t': state = 3; break;
203+
default: state = 4; break;
204+
}
205+
break;
206+
207+
case 3:
208+
switch(s.s[i]) {
209+
case ';': return 1;
210+
case '=': return 1;
211+
case ' ':
212+
case '\r':
213+
case '\n':
214+
case '\t': break;
215+
default: state = 4; break;
216+
}
217+
break;
218+
219+
case 4:
220+
switch(s.s[i]) {
221+
case '\"': state = 5; break;
222+
case ';': state = 0; break;
223+
default: break;
224+
}
225+
break;
226+
227+
case 5:
228+
switch(s.s[i]) {
229+
case '\\': state = 6; break;
230+
case '\"': state = 4; break;
231+
default: break;
232+
}
233+
break;
234+
235+
case 6: state = 5; break;
236+
}
237+
}
238+
239+
if ((state == 2) || (state == 3)) return 1;
240+
else return 0;
241+
}
162242

163243
#endif /* LOOSE_H */

modules/topology_hiding/th_common_logic.c

Lines changed: 80 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,81 @@ int topo_parse_passed_hdr_ct_params(str *params)
7575
return topo_parse_passed_params(params, &th_hdr_param_list);
7676
}
7777

78+
static inline int topo_delete_record_route_or_route_uris(struct sip_msg *msg, hdr_types_t hdr_type, int uris_to_delete) {
79+
struct hdr_field *it = NULL;
80+
rr_t *curr_rr = NULL, *next_rr = NULL;
81+
unsigned int offset;
82+
int total_delete_count = 0;
83+
int delete_count = uris_to_delete > 0 ? uris_to_delete : 64;
84+
85+
if (hdr_type != HDR_RECORDROUTE_T && hdr_type != HDR_ROUTE_T) {
86+
LM_ERR("Header type has to be one of Route or Record-Route\n");
87+
return -1;
88+
}
89+
90+
LM_DBG("Attempting to delete %d '%s' headers\n", delete_count, hdr_type == HDR_RECORDROUTE_T ? "Record-Route" : "Route");
91+
92+
if (parse_headers(msg, HDR_EOH_F, 0) == -1) {
93+
LM_ERR("Failed to parse '%s' headers\n", hdr_type == HDR_RECORDROUTE_T ? "Record-Route" : "Route");
94+
return -1;
95+
}
96+
97+
it = hdr_type == HDR_RECORDROUTE_T ? msg->record_route : msg->route;
98+
while (it != NULL) {
99+
if (parse_rr(it) < 0) {
100+
LM_ERR("Failed to parse '%.*s' headers\n", it->name.len, it->name.s);
101+
return -1;
102+
}
103+
104+
curr_rr = (rr_t*) it->parsed;
105+
next_rr = NULL;
106+
offset = 0;
107+
while (curr_rr) {
108+
next_rr = curr_rr->next;
109+
110+
if (next_rr != NULL) {
111+
offset += next_rr->nameaddr.name.s - curr_rr->nameaddr.name.s;
112+
}
113+
114+
curr_rr = next_rr;
115+
116+
if (++total_delete_count == delete_count) {
117+
break;
118+
}
119+
}
120+
121+
if (curr_rr == NULL) {
122+
if (del_lump(msg, it->name.s - msg->buf, it->len, hdr_type) == NULL) {
123+
LM_ERR("del_lump failed \n");
124+
return -1;
125+
}
126+
} else {
127+
if (del_lump(msg, it->body.s - msg->buf, offset, 0) == NULL) {
128+
LM_ERR("Failed to remove '%.*s' header\n", it->name.len, it->name.s);
129+
return -1;
130+
}
131+
}
132+
133+
if (total_delete_count == delete_count) {
134+
break;
135+
}
136+
137+
it = it->sibling;
138+
}
139+
140+
LM_DBG("Deleted %d '%s' headers\n", total_delete_count, hdr_type == HDR_RECORDROUTE_T ? "Record-Route" : "Route");
141+
142+
return 1;
143+
}
144+
145+
int topo_delete_route_uris(struct sip_msg *msg, int delete_count) {
146+
return topo_delete_record_route_or_route_uris(msg, HDR_ROUTE_T, delete_count);
147+
}
148+
149+
int topo_delete_record_route_uris(struct sip_msg *msg, int delete_count) {
150+
return topo_delete_record_route_or_route_uris(msg, HDR_RECORDROUTE_T, delete_count);
151+
}
152+
78153
int topo_delete_record_routes(struct sip_msg *req) {
79154
struct lump* lump, *crt, *prev_crt =0, *a, *foo;
80155
struct hdr_field *it;
@@ -221,7 +296,8 @@ struct lump* delete_existing_contact(struct sip_msg *msg, int del_hdr) {
221296
return lump;
222297
}
223298

224-
struct lump* restore_vias_from_req(struct sip_msg *req,struct sip_msg *rpl) {
299+
struct lump* restore_vias_from_req(struct sip_msg *req, struct sip_msg *rpl)
300+
{
225301
struct lump* lmp;
226302
struct hdr_field *it;
227303
str via_str;
@@ -378,14 +454,14 @@ struct lump* restore_vias_from_req(struct sip_msg *req,struct sip_msg *rpl) {
378454
it = it->sibling;
379455
}
380456

381-
LM_DBG("built [%.*s], %d %d\n",(int)(p-via_str.s),via_str.s,(int)(p-via_str.s),via_str.len);
457+
LM_DBG("built [%.*s], %d %d\n",(int)(p-via_str.s), via_str.s, (int)(p-via_str.s), via_str.len);
382458

383459
if ((lmp = insert_new_lump_after(lmp, via_str.s, via_str.len, 0)) == 0) {
384460
LM_ERR("failed inserting new old vias\n");
385461
pkg_free(via_str.s);
386462
goto err_free_rport;
387463
}
388-
464+
389465
pkg_free(rport_buf);
390466
pkg_free(received_buf);
391467
} else {
@@ -434,4 +510,4 @@ struct lump* restore_vias_from_req(struct sip_msg *req,struct sip_msg *rpl) {
434510
pkg_free(rport_buf);
435511
pkg_free(received_buf);
436512
return NULL;
437-
}
513+
}

modules/topology_hiding/th_common_logic.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,24 +26,30 @@
2626
#include "../../mem/shm_mem.h"
2727
#include "../../parser/contact/parse_contact.h"
2828

29-
#define RECORD_ROUTE "Record-Route: "
30-
#define RECORD_ROUTE_LEN (sizeof(RECORD_ROUTE)-1)
31-
3229
struct th_params {
3330
str ct_caller_user;
3431
str ct_callee_user;
3532
};
3633

34+
#define RECORD_ROUTE "Record-Route: "
35+
#define RECORD_ROUTE_LEN (sizeof(RECORD_ROUTE)-1)
36+
3737
struct th_ct_params {
3838
str param_name;
3939
struct th_ct_params *next;
4040
};
4141

42+
int topo_delete_route_uris(struct sip_msg *msg, int delete_count);
43+
int topo_delete_record_route_uris(struct sip_msg *msg, int delete_count);
4244
int topo_delete_record_routes(struct sip_msg *req);
4345
int topo_delete_vias(struct sip_msg *req);
4446
struct lump* delete_existing_contact(struct sip_msg *msg, int del_hdr);
4547
struct lump* restore_vias_from_req(struct sip_msg *req,struct sip_msg *rpl);
4648

49+
int topo_parse_passed_ct_params(str *params);
50+
51+
int topo_parse_passed_hdr_ct_params(str *params);
52+
4753
static inline int topo_ct_param_len(str *name, str *val, int should_quote)
4854
{
4955
int len = 1 /* ; */ + name->len;

0 commit comments

Comments
 (0)