Jiri Kuthan wrote:
I'm glad but surprised it works. There are two things I do not understand: registration and reply_route.
ad registration) I understood from your previous email you were wishing to save transport origin as user's contact in usrLoc DB. however, 'fix_nated_contact();save();' doesn't do that imho -- it creates a "diff list" and stores contacts from original message.
Yes and no. ;)
Call it dirty trick, or a smart workaround, but after patching the contact in the message using del_lump/insert_new_lump(), I'm replacing msg->contact->parsed->contacts->uri.s with the pointer to the pkg_malloc'ed buffer passed to the insert_new_lump() and also adjusting [...]->uri.len accordingly. Documentation says that buffers passed to insert_new_lump() will be deallocated along with the message itself, therefore memory isn't leaked and reference guranteed to be valid during the lifetime of the message. Later on, registration procedure checks that contact is already parsed (it is) and then takes our replaced [...]->uri.s "as is", and voila, everything works. 8-)
Of course Bad Things[tm] will happen if some module invoked after nathelper will try to calculate offset=[...]->contacts->uri.s - msg->orig, or will try to scratch something in that buffer but no modules do it yet.
ad reply_route) I fear fix_nated_contact does not help here really. From reply_route, you process original requests conserved in share memory now -- you don't affect replies.
Perhaps you are missing something, because my little old buddy gdb disagrees[1] - I am definitely observing "200 OK" reply as msg argument in fix_nated_contact() called from reply_route[].
-Maxim
[1] (gdb) b on_positive_reply Breakpoint 4 at 0x2a18dde2: file t_reply.c, line 939. (gdb) c Continuing. Breakpoint 4, on_positive_reply (t=0x28304e24, msg=0x80b71b0, code=200, param=0x0) at t_reply.c:939 939 if (!t->on_positive) { (gdb) tb fix_nated_contact_f Breakpoint 5 at 0x2a1b4bb3: file nathelper.c, line 145. (gdb) c Continuing. fix_nated_contact_f (msg=0x80b71b0, str1=0x0, str2=0x0) at nathelper.c:145 145 if ((parse_headers(msg, HDR_CONTACT, 0) == -1) || !msg->contact) (gdb) bt #0 fix_nated_contact_f (msg=0x80b71b0, str1=0x0, str2=0x0) at nathelper.c:145 #1 0x0804de0a in do_action (a=0x81b1660, msg=0x80b71b0) at action.c:511 #2 0x0804dff1 in run_actions (a=0x81b1660, msg=0x80b71b0) at action.c:559 #3 0x0804dd97 in do_action (a=0x81b1680, msg=0x80b71b0) at action.c:501 #4 0x0804dff1 in run_actions (a=0x81b1680, msg=0x80b71b0) at action.c:559 #5 0x2a18de75 in on_positive_reply (t=0x28304e24, msg=0x80b71b0, code=200, param=0x0) at t_reply.c:946 #6 0x2a18845e in callback_event (cbt=TMCB_REPLY_IN, trans=0x28304e24, msg=0x80b71b0, code=200) at t_hooks.c:73 #7 0x2a18cee3 in relay_reply (t=0x28304e24, p_msg=0x80b71b0, branch=0, msg_status=200, cancel_bitmap=0xbfbff09c) at t_reply.c:565 #8 0x2a18d995 in t_on_reply (p_msg=0x80b71b0) at t_reply.c:812 #9 0x08052af7 in forward_reply (msg=0x80b71b0) at forward.c:343 #10 0x0805dec5 in receive_msg (buf=0x809a6c0 "SIP/2.0", len=733, src_su=0x81b1220) at receive.c:161 #11 0x08064127 in udp_rcv_loop () at udp_server.c:332 #12 main_loop () at main.c:582 #13 0x080571df in main (argc=3, argv=0xbfbff74c) at main.c:1383 #14 0x0804c679 in _start () (gdb) print *msg $2 = {id = 49, first_line = {type = 2, u = {request = {method = {s = 0x809a6c0 "SIP/2.0", len = 7}, uri = {s = 0x809a6c8 "200", len = 3}, version = {s = 0x809a6cc "OK", len = 2}, method_value = 200}, reply = {version = {s = 0x809a6c0 "SIP/2.0", len = 7}, status = { s = 0x809a6c8 "200", len = 3}, reason = {s = 0x809a6cc "OK", len = 2}, statuscode = 200}}}, via1 = 0x80b7540, via2 = 0x80b8180, headers = 0x80b77a4, last_header = 0x80b78d4, parsed_flag = 575, h_via1 = 0x80b77a4, h_via2 = 0x80b7888, callid = 0x80b7b40, to = 0x80b79f0, cseq = 0x80b78d4, from = 0x80b76c8, contact = 0x0, maxforwards = 0x0, route = 0x0, record_route = 0x80b7714, content_type = 0x0, content_length = 0x0, authorization = 0x0, expires = 0x0, proxy_auth = 0x0, www_auth = 0x0, supported = 0x0, require = 0x0, proxy_require = 0x0, unsupported = 0x0, allow = 0x0, event = 0x0, eoh = 0x0, unparsed = 0x809a82b "Contact: sip:380442466396@192.168.0.9:5060;user=phone;transport=udp\r\nSe rver: Cisco ATA v2.15 ata18x (020927a)\r\nContent-Length: 201\r\nContent-Type: application/sdp\r\n\ r\nv=0\r\no=380442466396 76117 76117"..., src_ip = {af = 2, len = 4, u = {addr32 = {838969536, 0, 0, 0}, addr16 = {43200, 12801, 0, 0, 0, 0, 0, 0}, addr = "(\0012", '\0' <repeats 11 times>}}, src_port_no = 5060, dst_ip = {af = 2, len = 4, u = {addr32 = {1677830336, 0, 0, 0}, addr16 = {43200, 25601, 0, 0, 0, 0, 0, 0}, addr = "(\001d", '\0' <repeats 11 times>}}, orig = 0x80b8a5c "SIP/2.0 200 OK\r\nVia: SIP/2.0/UDP 192.168.1.100;branch=z9hG4bK61d8.02d66d15.0\r \nVia: SIP/2.0/UDP 192.168.1.1:5063\r\nRecord-Route: sip:380442466396@192.168.1.100;branch=0\r\nFr om: Maxim <sip:380442466397@"..., buf = 0x809a6c0 "SIP/2.0", len = 733, new_uri = {s = 0x0, len = 0}, parsed_uri_ok = 0, parsed_uri = {user = {s = 0x0, len = 0}, passwd = {s = 0x0, len = 0}, host = {s = 0x0, len = 0}, port = {s = 0x0, len = 0}, params = {s = 0x0, len = 0}, headers = {s = 0x0, len = 0}, port_no = 0}, add_rm = 0x0, repl_add_rm = 0x0, reply_lump = 0x0, add_to_branch_s = '\0' <repeats 54 times>, add_to_branch_len = 0, hash_index = 0, flags = 0} (gdb) print msg->orig $3 = 0x80b8a5c "SIP/2.0 200 OK\r\nVia: SIP/2.0/UDP 192.168.1.100;branch=z9hG4bK61d8.02d66d15.0\r\nVi a: SIP/2.0/UDP 192.168.1.1:5063\r\nRecord-Route: sip:380442466396@192.168.1.100;branch=0\r\nFrom: Maxim <sip:380442466397@"...