Hi,
I found a small bug in the msrp_cmap_lookup() function - fix now in git master.
The final version of my MSRP event-route is:
event_route[msrp:frame-in] { msrp_reply_flags("1");
if ((($Rp == MY_WS_PORT || $Rp == MY_WSS_PORT) && !(proto == WS || proto == WSS)) && $Rp != MY_MSRP_PORT) { xlog("L_WARN", "MSRP request received on $Rp\n"); msrp_reply("403", "Action-not-allowed"); exit; }
if (msrp_is_reply()) { msrp_relay(); } else if($msrp(method)=="AUTH") { if($msrp(nexthops)>0) { msrp_relay(); exit; }
if (!www_authenticate("MY_DOMAIN", "subscriber", "$msrp(method)")) { if (auth_get_www_authenticate("MY_DOMAIN", "1", "$var(wauth)")) { msrp_reply("401", "Unauthorized", "$var(wauth)"); } else { msrp_reply("500", "Server Error"); } exit; }
msrp_cmap_save(); } else if ($msrp(method)=="SEND" || $msrp(method)=="REPORT") { if ($msrp(nexthops)>1) { if ($msrp(method)!="REPORT") { msrp_reply("200", "OK"); } msrp_relay(); exit; }
if (msrp_cmap_lookup()) { if ($msrp(method)!="REPORT") { msrp_reply("200", "OK"); } msrp_relay_flags("1"); msrp_relay(); } else { msrp_reply("481", "Session-does-not-exist"); } } else { msrp_reply("501", "Request-method-not-understood"); } }
Regards,
Peter
On Wed, 2013-02-06 at 10:35 +0000, Peter Dunkley wrote:
Hello,
I have the following configuration:
MSRP Client 1 ---> MSRP Relay ---> MSRP Relay ---> MSRP Client 2
Note: There is only one MSRP Relay here but as each client AUTHs with the relay it appears twice in the To-Path for MSRP SENDs and REPORTs and the MSRP requests get hair-pinned as they are routed.
Each MSRP client AUTHs against the MSRP Relay (authentication steps skipped for clarity):
MSRP Client 1 Authenticates MSRP embt3epk AUTH To-Path: msrp://james@192.168.0.74 From-Path: msrp://4qc1y0p3.invalid:2855/pdbcph4zb2;ws Authorization: Digest username="james", realm="example.com", nonce="URIsFlESKuoaIDis1UKPL0uU8e+IavWWW3aO/4A=", uri="msrp://james@192.168.0.74", response="8d6e1842dd2791f35772a0d8aa3d0237", qop=auth, cnonce="9he680vjcwdv", nc=00000001 -------embt3epk$ MSRP embt3epk 200 OK To-Path: msrp://4qc1y0p3.invalid:2855/pdbcph4zb2;ws From-Path: msrp://james@192.168.0.74 Use-Path: msrp://192.168.0.74:2855/msrp-51122ad5-a4c-1;tcp Expires: 360 -------embt3epk$ MSRP Client 2 Authenticates MSRP t1fm54qj AUTH To-Path: msrp://peter@192.168.0.74 From-Path: msrp://hegodxou.invalid:2855/hc3n26dpvd;ws Authorization: Digest username="peter", realm="example.com", nonce="URIsGVESKu3ejM4oZiRERc40yd1jeCbHW3aRAYA=", uri="msrp://peter@192.168.0.74", response="f230810364a0ea18afb451299a0be19c", qop=auth, cnonce="j5efxrn0mufs", nc=00000001 -------t1fm54qj$ MSRP t1fm54qj 200 OK To-Path: msrp://hegodxou.invalid:2855/hc3n26dpvd;ws From-Path: msrp://peter@192.168.0.74 Use-Path: msrp://192.168.0.74:2855/msrp-51122ad5-a4b-1;tcp Expires: 360 -------t1fm54qj$
The MSRP module parses these correctly and saves the entry in the connection map:
12(2636) DEBUG: msrp [msrp_parser.c:173]: MSRP FLine: [1] [MSRP] [embt3epk] [AUTH] [2] [] 12(2636) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b97f0) [To-Path] [2] [msrp://james@192.168.0.74] 12(2636) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b3570) [From-Path] [1] [msrp://4qc1y0p3.invalid:2855/pdbcph4zb2;ws] 12(2636) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b35f0) [Authorization] [9] [Digest username="james", realm="example.com", nonce="URIsFlESKuoaIDis1UKPL0uU8e+IavWWW3aO/4A=", uri="msrp://james@192.168.0.74", response="8d6e1842dd2791f35772a0d8aa3d0237", qop=auth, cnonce="9he680vjcwdv", nc=00000001] 12(2636) DEBUG: msrp [msrp_mod.c:459]: executing event_route[msrp:frame-in] (3) 12(2636) DEBUG: msrp [msrp_cmap.c:230]: saving connection info for [msrp://4qc1y0p3.invalid:2855/pdbcph4zb2;ws] [msrp-51122ad5-a4c-1] (174/4060267182) 12(2636) DEBUG: msrp [msrp_cmap.c:232]: frame received from [msrp://192.168.0.158:49662] via [tcp:192.168.0.74:80] 11(2635) DEBUG: msrp [msrp_parser.c:173]: MSRP FLine: [1] [MSRP] [t1fm54qj] [AUTH] [2] [] 11(2635) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b3570) [To-Path] [2] [msrp://peter@192.168.0.74] 11(2635) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b35f0) [From-Path] [1] [msrp://hegodxou.invalid:2855/hc3n26dpvd;ws] 11(2635) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b3670) [Authorization] [9] [Digest username="peter", realm="example.com", nonce="URIsGVESKu3ejM4oZiRERc40yd1jeCbHW3aRAYA=", uri="msrp://peter@192.168.0.74", response="f230810364a0ea18afb451299a0be19c", qop=auth, cnonce="j5efxrn0mufs", nc=00000001] 11(2635) DEBUG: msrp [msrp_mod.c:459]: executing event_route[msrp:frame-in] (3) 11(2635) DEBUG: msrp [msrp_cmap.c:230]: saving connection info for [msrp://hegodxou.invalid:2855/hc3n26dpvd;ws] [msrp-51122ad5-a4b-1] (139/4060209803) 11(2635) DEBUG: msrp [msrp_cmap.c:232]: frame received from [msrp://192.168.0.158:49663] via [tcp:192.168.0.74:80]
Then MSRP Client 1 sends an MSRP SEND to MSRP client 2:
SEND from MSRP Client 1 to MSRP Relay SRP sis9mer0 SEND To-Path: msrp://192.168.0.74:2855/msrp-51122ad5-a4c-1;tcp msrp://192.168.0.74:2855/msrp-51122ad5-a4b-1;tcp msrp://hegodxou.invalid:2855/hc3n26dpvd;ws From-Path: msrp://4qc1y0p3.invalid:2855/pdbcph4zb2;ws Message-ID: 3569133935.vs42vpro Success-Report: yes Failure-Report: yes Byte-Range: 1-0/0 -------sis9mer0$ MSRP sis9mer0 200 OK To-Path: msrp://4qc1y0p3.invalid:2855/pdbcph4zb2;ws From-Path: msrp://192.168.0.74:2855/msrp-51122ad5-a4c-1;tcp Message-ID: 3569133935.vs42vpro -------sis9mer0$ SEND from MSRP Relay to MSRP Relay MSRP sis9mer0 SEND To-Path: msrp://192.168.0.74:2855/msrp-51122ad5-a4b-1;tcp msrp://hegodxou.invalid:2855/hc3n26dpvd;ws From-Path: msrp://192.168.0.74:2855/msrp-51122ad5-a4c-1;tcp msrp://4qc1y0p3.invalid:2855/pdbcph4zb2;ws Message-ID: 3569133935.vs42vpro Success-Report: yes Failure-Report: yes Byte-Range: 1-0/0 -------sis9mer0$ MSRP sis9mer0 481 Session-does-not-exist To-Path: msrp://192.168.0.74:2855/msrp-51122ad5-a4c-1;tcp From-Path: msrp://192.168.0.74:2855/msrp-51122ad5-a4b-1;tcp Message-ID: 3569133935.vs42vpro -------sis9mer0$
It looks like the MSRP module cannot find the entry in the connection map:
12(2636) DEBUG: msrp [msrp_parser.c:173]: MSRP FLine: [1] [MSRP] [sis9mer0] [SEND] [1] [] 12(2636) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b97f0) [To-Path] [2] [msrp://192.168.0.74:2855/msrp-51122ad5-a4c-1;tcp msrp://192.168.0.74:2855/msrp-51122ad5-a4b-1;tcp msrp://hegodxou.invalid:2855/hc3n26dpvd;ws] 12(2636) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b3570) [From-Path] [1] [msrp://4qc1y0p3.invalid:2855/pdbcph4zb2;ws] 12(2636) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b35f0) [Message-ID] [4] [3569133935.vs42vpro] 12(2636) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b3670) [Success-Report] [7] [yes] 12(2636) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b36f0) [Failure-Report] [0] [yes] 12(2636) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b9940) [Byte-Range] [5] [1-0/0] 12(2636) DEBUG: msrp [msrp_mod.c:459]: executing event_route[msrp:frame-in] (3) 12(2636) ERROR: <script>: Relaying to next relay hop 12(2636) DEBUG: msrp [msrp_parser.c:536]: MSRP URI: [msrp] [] [192.168.0.74] [2855] [msrp-51122ad5-a4b-1] [tcp] [] 10(2634) DEBUG: msrp [msrp_parser.c:173]: MSRP FLine: [1] [MSRP] [sis9mer0] [SEND] [1] [] 10(2634) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9ac4d0) [To-Path] [2] [msrp://192.168.0.74:2855/msrp-51122ad5-a4b-1;tcp msrp://hegodxou.invalid:2855/hc3n26dpvd;ws] 10(2634) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9ac550) [From-Path] [1] [msrp://192.168.0.74:2855/msrp-51122ad5-a4c-1;tcp msrp://4qc1y0p3.invalid:2855/pdbcph4zb2;ws] 10(2634) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9ac5d0) [Message-ID] [4] [3569133935.vs42vpro] 10(2634) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b3570) [Success-Report] [7] [yes] 10(2634) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b35f0) [Failure-Report] [0] [yes] 10(2634) DEBUG: msrp [msrp_parser.c:296]: MSRP Header: (0x7f536e9b3670) [Byte-Range] [5] [1-0/0] 10(2634) DEBUG: msrp [msrp_mod.c:459]: executing event_route[msrp:frame-in] (3) 10(2634) ERROR: <script>: Relaying to destination 10(2634) ERROR: <script>: ... Current hop: msrp://192.168.0.74:2855/msrp-51122ad5-a4b-1;tcp, Next hop: msrp://hegodxou.invalid:2855/hc3n26dpvd;ws, Last hop: msrp://hegodxou.invalid:2855/hc3n26dpvd;ws 10(2634) DEBUG: msrp [msrp_parser.c:536]: MSRP URI: [msrp] [] [192.168.0.74] [2855] [msrp-51122ad5-a4b-1] [tcp] [] 10(2634) DEBUG: msrp [msrp_cmap.c:346]: searching for session [msrp-51122ad5-a4b-1] 10(2634) ERROR: <script>: ... destination not in map
Here is my MSRP event route:
event_route[msrp:frame-in] { msrp_reply_flags("1"); if ((($Rp == MY_WS_PORT || $Rp == MY_WSS_PORT) && !(proto == WS || proto == WSS)) && $Rp != MY_MSRP_PORT) { xlog("L_WARN", "MSRP request received on $Rp\n"); msrp_reply("403", "Action-not-allowed"); exit; } if (msrp_is_reply()) { msrp_relay(); } else if($msrp(method)=="AUTH") { if($msrp(nexthops)>0) { msrp_relay(); exit; } if (!www_authenticate("MY_DOMAIN", "subscriber", "$msrp(method)")) { if (auth_get_www_authenticate("MY_DOMAIN", "1", "$var(wauth)")) { msrp_reply("401", "Unauthorized", "$var(wauth)"); } else { msrp_reply("500", "Server Error"); } exit; } msrp_cmap_save(); } else if ($msrp(method)=="SEND" || $msrp(method)=="REPORT") { if ($msrp(nexthops)>1) { if ($msrp(method)!="REPORT") { msrp_reply("200", "OK"); } xlog("Relaying to next relay hop\n"); msrp_relay(); exit; } xlog("Relaying to destination\n"); xlog("... Current hop: $msrp(crthop), Next hop: $msrp(nexthop), Last hop: $msrp(lasthop)\n"); if (msrp_cmap_lookup()) { if ($msrp(method)!="REPORT") { msrp_reply("200", "OK"); } xlog("... found destination in map\n"); msrp_relay(); } else { xlog("... destination not in map\n"); msrp_reply("481", "Session-does-not-exist"); } } else { msrp_reply("501", "Request-method-not-understood"); } }
Regards,
Peter
sr-dev mailing list sr-dev@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev