Hello, after receiving
INVITE sip:test-gnome-ca...@bapha.be SIP/2.0 Via: SIP/2.0/WSS bapha.be;branch=z9hG4bK974100 Max-Forwards: 70 To: <sip:test-gnome-ca...@bapha.be> From: "Online https://sip.bapha.be" <sip:onl...@bapha.be>;tag=12q2efc423 Call-ID: fkhe8faq0fh80glmq59i CSeq: 5622 INVITE Contact: <sip:4q5ne...@bapha.be;transport=ws;ob> Allow: ACK,CANCEL,INVITE,MESSAGE,BYE,OPTIONS,INFO,NOTIFY,REFER Supported: outbound User-Agent: SIP.js/0.7.8 Content-Type: application/sdp Content-Length: 1964 v=0 o=mozilla...THIS_IS_SDPARTA-99.0 8263261229339246488 0 IN IP4 0.0.0.0 s=- … kamailio calls th_mask_encode( char *in = "sip:test-gnome-ca...@bapha.be;gr=urn:uuid:f2f5a3cf-a0fb-0047-be50- 740fb9bdc562;alias=87.118.146.153~60722~2>;+sip.instance=\"<urn:uuid:f2f5a3cf-a0fb-0047-be50- 740fb9bdc562>";+org.linphone.specs=\"conference/1.0,ephemeral/1.1,groupchat/1.1,groupchat/1.2,lime\n"\ "Content-Type: application/sdp and so on", int ilen = 107, str prefix = { .len = 23, .s ="sip:127.3.4.84;line=sr-" }, int *olen). It returns olen=167, and the string "sip:127.3.4.84;line=sr- if7s1mg7i36PNf0AbdwPpfzlbqWEpLzsSGItpLwyN39ZMY4t1mCTSd6DNo4LWdIOpfpPp5FLpUQscX63Kd47W5EPWO6sNL90pLgoW5p-1fzlSdzO25n3KoIk1vHkWXptc5wOeopsWO9-eo9*". Then Kamailio forwards (sends): Contact: <sip:127.3.4.84;line=sr-if7s1mg7i36PNf0AbdwPpfzlbqWEpLzsSGItpLwyN39ZMY4t1mCTSd6DNo4LWdIOpfpPp5FLpUQscX63Kd47W5EPWO6sNL90pLgoW5p- 1fzlSdzO25n3KoIk1vHkWXptc5wOeopsWO9-eo9*>;+sip.instance="<urn:uuid:f2f5a3cf-a0fb-0047-be50- 740fb9bdc562>";+org.linphone.specs="conference/1.0,ephemeral/1.1,groupchat/1.1,groupchat/1.2,lime" which at some point leads to ACK sip:127.3.4.84;line=sr-if7s1mg7i36pnf0abdwppfzlbqweplzssgitplwyn39zmy4t1mctsd6dno4lwdiopfppp5flpuqscx63kd47w5epwo6snl90plgow5p- 1fzlsdzo25n3koik1vhkwxptc5woeopswo9-eo9* SIP/2.0 and BYE sip:127.3.4.84;line=sr-if7s1mg7i36pnf0abdwppfzlbqweplzssgitplwyn39zmy4t1mctsd6dno4lwdiopfppp5flpuqscx63kd47w5epwo6snl90plgow5p- 1fzlsdzo25n3koik1vhkwxptc5woeopswo9-eo9* SIP/2.0 Below you can find th_test.c . The functions th_mask_encode() and th_mask_decode() there are identical to the same functions in src/modules/topoh/th_mask.c . main() provides some tests: Passing «sip:test-gnome-ca...@bapha.be;gr=urn:uuid:f2f5a3cf-a0fb-0047-be50- 740fb9bdc562;alias=87.118.146.153~60472~2>;+sip.instance="<urn:uuid:f2f5a3cf-a0fb-0047-be50- 740fb9bdc562>";+org.linphone.specs="conference/1.0,ephemeral/1.1,groupchat/1.1,groupchat/1.2,lime» to th_mask_encode() returns sip:127.3.4.84;line=sr-if7s1mg7i36PNf0AbdwPpfzlbqWEpLzsSGItpLwyN39ZMY4t1mCTSd6DNo4LWdIOpfpPp5FLpUQscX63Kd47W5EPWO6sNL90pLgoW5p- 1fzlSdzO25n3KoIk1vHkWXptc5wOeopsWXi-eo9* (this is what Kamailio does send out). Passing the last string to th_mask_decode() returns sip:test-gnome-ca...@bapha.be;gr=urn:uuid:f2f5a3cf-a0fb-0047-be50-740fb9bdc562;alias=87.118.1 the ;alias= is incomplete, compared to the origin. The above ACK leads to passing "sr-if7s1mg7i36pnf0abdwppfzlbqweplzssgitplwyn39zmy4t1mctsd6dno4lwdiopfppp5flpuqscx63kd47w5epwo6snl90plgow5p-1fzlsdzo25n3koik1vhkwxptc5woeopswo9-eo9* SIP/2.0\n"\ "Route: <sip:Q+L06HX94DMPtQWQTI5OE8SQTI5O4MY=@144.76.142.78;transport=ws;r2=on;lr;nat=yes>\n"\ "Route: <sip:127.3.4.84;line=sr-if7s17IB5XEfVzn0WIgWwqggCTzwV5C2g5R5wCg4WwrQ5CuZ6XIQWvH3WUHkWX9tWOnyMq4RbmWsb34Q2YgoiXP-coTAboPlioPtpY6Z8dCO>\n"\ to th_mask_decode() and the result is callub.p.b;rn:s.d2lQg#cfa=bA07beQ7R409bcQ62;alac=87718*1P.15#~60R22~2 with the dots being unprintable characters. (result is garbage). I have seen that callub.p.b in the unparsable R-URI reports from Kamailio. That is an indication that th_mask_decode() does not decode the Contact encoded by th_mask_encode() correctly. Valgrind does not report improper memory usage. Greetings Dilyan gcc -g -o th-test ./th-test.c && ./th-test th-test.c #include <stdio.h> #include <stdlib.h> #include <string.h> #define TH_EB64I \ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-" char _th_EB64[65] = "EFvXIzGq94xKcW126gV5wCdYpNSbiM8enRUou7LmhajBlPtAsk-OQTf3H0DyrZ.J"; int _th_DB64[256]; char *_th_PD64 = "*"; struct str_ { char* s; /**< Pointer to the first character of the string */ int len; /**< Length of the string */ }; typedef struct str_ str; str prefix = { .len = 23, .s ="sip:127.3.4.84;line=sr-" }; char* th_mask_encode(char *in, int ilen, const str *prefix, int *olen); char* th_mask_decode(char *in, int ilen, const str *prefix, int extra, int *olen); char* th_mask_encode(char *in, int ilen, const str *prefix, int *olen) { char *out; int left; int idx; int i; int r; char *p; int block; *olen = (((ilen+2)/3)<<2) + ((prefix!=NULL&&prefix->len>0)?prefix->len:0); out = (char*)malloc((*olen+1)*sizeof(char)); if(out==NULL) { fprintf(stderr, "malloc error\n"); *olen = 0; return NULL; } memset(out, 0, (*olen+1)*sizeof(char)); if(prefix!=NULL&&prefix->len>0) memcpy(out, prefix->s, prefix->len); p = out + (int)((prefix!=NULL&&prefix->len>0)?prefix->len:0); for(idx=0; idx<ilen; idx+=3) { left = ilen - idx - 1 ; left = (left>1)?2:left; block = 0; for(i=0, r=16; i<=left; i++, r-=8) block += ((unsigned char)in[idx+i]) << r; *(p++) = _th_EB64[(block >> 18) & 0x3f]; *(p++) = _th_EB64[(block >> 12) & 0x3f]; *(p++) = (left>0)?_th_EB64[(block >> 6) & 0x3f]:_th_PD64[0]; *(p++) = (left>1)?_th_EB64[block & 0x3f]:_th_PD64[0]; } return out; } char* th_mask_decode(char *in, int ilen, const str *prefix, int extra, int *olen) { char *out; int n; int block; int idx; int i; int j; int end; char c; for(n=0,i=ilen-1; in[i]==_th_PD64[0]; i--) n++; *olen = (((ilen-((prefix!=NULL&&prefix->len>0)?prefix->len:0)) * 6) >> 3) - n; if (*olen<=0) { return NULL; } out = (char*)malloc((*olen+1+extra)*sizeof(char)); if(out==NULL) { fprintf(stderr, "malloc error\n"); *olen = 0; return NULL; } memset(out, 0, (*olen+1+extra)*sizeof(char)); end = ilen - n; i = (prefix!=NULL&&prefix->len>0)?prefix->len:0; for(idx=0; i<end; idx+=3) { block = 0; for(j=0; j<4 && i<end ; j++) { c = _th_DB64[(int)in[i++]]; if(c<0) { free(out); *olen = 0; return NULL; } block += c << (18 - 6*j); } for(j=0, n=16; j<3 && idx+j< *olen; j++, n-=8) out[idx+j] = (char)((block >> n) & 0xff); } return out; } int main() { //this is from th_mask_init for(int i=0; i<256; i++) _th_DB64[i] = -1; for(int i=0; i<64; i++) _th_DB64[(int)_th_EB64[i]] = i; int olen, o2; char *end; char *input = "sip:test-gnome-ca...@bapha.be;gr=urn:uuid:f2f5a3cf-a0fb-0047-be50- 740fb9bdc562;alias=87.118.146.153~60472~2>;+sip.instance=\"<urn:uuid:f2f5a3cf-a0fb-0047-be50- 740fb9bdc562>\";+org.linphone.specs=\"conference/1.0,ephemeral/1.1,groupchat/1.1,groupchat/1.2,lime\""; printf("input=[%s]\n", input); char* middle = th_mask_encode (input, 107, &prefix, &olen); printf("olen = %i, middle=[%s]\n", olen, middle); end = th_mask_decode(middle, 147, &prefix, 0, &o2); printf("o2 = %i, end=[%s]\n", o2, end); char * b1 = "sr-if7s1mg7i36pnf0abdwppfzlbqweplzssgitplwyn39zmy4t1mctsd6dno4lwdiopfppp5flpuqscx63kd47w5epwo6snl90plgow5p- 1fzlsdzo25n3koik1vhkwxptc5woeopswo9-eo9*"; o2 = 0; end = th_mask_decode(b1, 147, &prefix, 0, &o2); printf("o2 = %i, end=[%s]\n", o2, end); char* b2 = "sr-if7s1mg7i36pnf0abdwppfzlbqweplzssgitplwyn39zmy4t1mctsd6dno4lwdiopfppp5flpuqscx63kd47w5epwo6snl90plgow5p-1fzlsdzo25n3koik1vhkwxptc5woeopswo9-eo9* SIP/2.0\n"\ "Route: <sip:Q+L06HX94DMPtQWQTI5OE8SQTI5O4MY=@144.76.142.78;transport=ws;r2=on;lr;nat=yes>\n"\ "Route: <sip:127.3.4.84;line=sr-if7s17IB5XEfVzn0WIgWwqggCTzwV5C2g5R5wCg4WwrQ5CuZ6XIQWvH3WUHkWX9tWOnyMq4RbmWsb34Q2YgoiXP-coTAboPlioPtpY6Z8dCO>\n"\ "Via: SIP/2.0/WSS bapha.be;branch=z9hG4bK9069155\n"\ "Max-Forwards: 70\n"\ "To: <sip:test-gnome-ca...@bapha.be>;tag=Pn4npAj\n"\ "From: \"Online https://sip.bapha.be\" <sip:onl...@bapha.be>;tag=12q2efc423\n"\ "Call-ID: fkhe8faq0fh80glmq59i\n"\ "CSeq: 5623 ACK\n"\ "Supported: outbound\n"\ "User-Agent: SIP.js/0.7.8\n"\ "Content-Length: 0\n"\ "\n"; o2 = 0; end = th_mask_decode(b2, 147, &prefix, 0, &o2); printf("o2 = %i, end=[%s]\n", o2, end); return 0; } __________________________________________________________ Kamailio - Users Mailing List - Non Commercial Discussions To unsubscribe send an email to sr-users-le...@lists.kamailio.org Important: keep the mailing list in the recipients, do not reply only to the sender! Edit mailing list options or unsubscribe: