From ce689b65fa217348fa3a68ed4a70236b66b81585 Mon Sep 17 00:00:00 2001 From: froudaut Date: Mon, 2 Dec 2024 10:02:44 +0100 Subject: [PATCH 1/5] =?UTF-8?q?=09modifi=C3=A9=C2=A0:=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20owamp/owamp/conf/twampd.conf=20=09modifi=C3=A9=C2=A0:=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20owamp/owamp/configure.ac=20=09modifi?= =?UTF-8?q?=C3=A9=C2=A0:=20=20=20=20=20=20=20=20=20owamp/owamp/owamp/api.c?= =?UTF-8?q?=20=09modifi=C3=A9=C2=A0:=20=20=20=20=20=20=20=20=20owamp/owamp?= =?UTF-8?q?/owamp/capi.c=20=09modifi=C3=A9=C2=A0:=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20owamp/owamp/owamp/endpoint.c=20=09modifi=C3=A9=C2=A0:=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20owamp/owamp/owamp/owamp.h=20=09modifi?= =?UTF-8?q?=C3=A9=C2=A0:=20=20=20=20=20=20=20=20=20owamp/owamp/owamp/owamp?= =?UTF-8?q?P.h=20=09modifi=C3=A9=C2=A0:=20=20=20=20=20=20=20=20=20owamp/ow?= =?UTF-8?q?amp/owamp/protocol.c=20=09modifi=C3=A9=C2=A0:=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20owamp/owamp/owamp/sapi.c=20=09modifi=C3=A9=C2=A0:=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20owamp/owamp/owampd/owampd.c=20=09modifi?= =?UTF-8?q?=C3=A9=C2=A0:=20=20=20=20=20=20=20=20=20owamp/owamp/owampd/owam?= =?UTF-8?q?pdP.h=20=09modifi=C3=A9=C2=A0:=20=20=20=20=20=20=20=20=20owamp/?= =?UTF-8?q?owamp/owping/owping.c=20=09modifi=C3=A9=C2=A0:=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20owamp/owamp/owping/owpingP.h=20=09modifi=C3=A9?= =?UTF-8?q?=C2=A0:=20=20=20=20=20=20=20=20=20owamp/owamp/powstream/powstre?= =?UTF-8?q?am.c=20=09modifi=C3=A9=C2=A0:=20=20=20=20=20=20=20=20=20owamp/o?= =?UTF-8?q?wamp/powstream/powstreamP.h=20=09modifi=C3=A9=C2=A0:=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20owamp/owamp/test/session=5Fsetup.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- owamp/owamp/conf/twampd.conf | 10 ++ owamp/owamp/configure.ac | 1 + owamp/owamp/owamp/api.c | 2 +- owamp/owamp/owamp/capi.c | 109 ++++++++++-- owamp/owamp/owamp/endpoint.c | 44 +++-- owamp/owamp/owamp/owamp.h | 27 ++- owamp/owamp/owamp/owampP.h | 6 +- owamp/owamp/owamp/protocol.c | 64 +++++-- owamp/owamp/owamp/sapi.c | 276 ++++++++++++++++++++++++++++- owamp/owamp/owampd/owampd.c | 96 +++++++++- owamp/owamp/owampd/owampdP.h | 4 + owamp/owamp/owping/owping.c | 124 +++++++++++-- owamp/owamp/owping/owpingP.h | 6 +- owamp/owamp/powstream/powstream.c | 49 ++++- owamp/owamp/powstream/powstreamP.h | 4 + owamp/owamp/test/session_setup.c | 2 +- 16 files changed, 736 insertions(+), 88 deletions(-) diff --git a/owamp/owamp/conf/twampd.conf b/owamp/owamp/conf/twampd.conf index 1bf748dd..b78d52f2 100644 --- a/owamp/owamp/conf/twampd.conf +++ b/owamp/owamp/conf/twampd.conf @@ -32,6 +32,16 @@ verbose # (defaults to daemon) facility local5 +# The minimum severity of log messages to report to syslog. Useful for remote +# syslog servers especially since can reduce log traffic on wire. Valid values: +# FATAL - Just report error messages +# WARN - In addition to FATAL messages, print non-fatal warnings +# INFO - **DEFAULT** In addition to to everything in WARN, print some potentially helpful non-error messages +# DEBUG - Print everything in INFO, and lots of other output that may or may not be useful +# ALL - Print any error message regardless of level +# NONE - Don't send any messages to syslog +#loglevel INFO + # include src file:line in log messages # keep this on, and help us with more specific bug reports! # (defaults to !loglocation) diff --git a/owamp/owamp/configure.ac b/owamp/owamp/configure.ac index 550035ad..55c48def 100644 --- a/owamp/owamp/configure.ac +++ b/owamp/owamp/configure.ac @@ -222,3 +222,4 @@ AC_SUBST(ac_aux_dir) AC_OUTPUT([Makefile owamp/Makefile owampd/Makefile owping/Makefile powstream/Makefile conf/Makefile test/Makefile doc/Makefile selinux/Makefile], [test -z "$CONFIG_HEADERS" || echo timestamp > owamp/stamp-h.in]) + diff --git a/owamp/owamp/owamp/api.c b/owamp/owamp/owamp/api.c index f179de03..4e31f3e7 100644 --- a/owamp/owamp/owamp/api.c +++ b/owamp/owamp/owamp/api.c @@ -2904,7 +2904,7 @@ OWPWriteDataHeader( (struct sockaddr*)&hdr->addr_sender, (struct sockaddr*)&hdr->addr_receiver, hdr->twoway?True:hdr->conf_sender,hdr->conf_receiver,False, - False,hdr->sid,&hdr->test_spec) != 0) || !len){ + False,False,hdr->sid,&hdr->test_spec) != 0) || !len){ return False; } ver = htonl((hdr->twoway?_OWP_VERSION_TWOWAY:0)|3); diff --git a/owamp/owamp/owamp/capi.c b/owamp/owamp/owamp/capi.c index 749d5977..c54bac46 100644 --- a/owamp/owamp/owamp/capi.c +++ b/owamp/owamp/owamp/capi.c @@ -171,7 +171,8 @@ TryAddr( struct addrinfo *ai, const char *local_addr, const char *interface, - I2Addr server_addr + I2Addr server_addr, + uint32_t dscp_ctrl /* DSCP Value */ ) { OWPErrSeverity addr_ok=OWPErrOK; @@ -180,7 +181,73 @@ TryAddr( fd = socket(ai->ai_family,ai->ai_socktype,ai->ai_protocol); if(fd < 0) return 1; - + + if(dscp_ctrl != 0) + /* SET DSCP Value On CTRL Session */ + { + /* For now, just verify dscp_ctrl set to valid value + * for DSCP mode: + * Only 6 bits can be set for it to be valid + * (bits 2-7 of the high-order byte) + */ + int optname = IP_TOS; + int optlevel = IP_TOS; + int sopt; + if(dscp_ctrl & ~0x3F000000){ + OWPError(cntrl->ctx,OWPErrFATAL,OWPErrUNSUPPORTED, + "Unsupported DSCP CTRL requested"); + /* + * This was a valid request, this implementation just doesn't + * support it. + */ + goto cleanup; + } + /* + * TODO: When I find a kernel that actually has IPV6_TCLASS + * make sure it works. (This looks like the RFC 3542 way...) + */ + switch(ai->ai_family){ + case AF_INET: + optlevel = IPPROTO_IP; + optname = IP_TOS; + break; +#ifdef AF_INET6 + case AF_INET6: + optlevel = IPPROTO_IPV6; + /* + * Look for RFC 3542 sockopts - have no systems with them, but look + * for them anyway... + */ +#ifdef IPV6_TCLASS + optname = IPV6_TCLASS; +#else + optname = IP_TOS; +#endif + break; +#endif + default: + /*NOTREACHED*/ + break; + } + + /* Copy high-order byte (minus first two bits) */ + sopt = (uint8_t)(dscp_ctrl >> 24); + sopt &= 0x3F; /* this should be a no-op until PHB... */ + + /* shift for setting TOS */ + sopt <<= 2; + if(setsockopt(fd,optlevel,optname, + (void*)&sopt,sizeof(sopt)) < 0){ + OWPError(cntrl->ctx,OWPErrFATAL,OWPErrUNKNOWN, + "setsockopt(%s,%s=%d): %M", + ((optlevel==IPPROTO_IP)? + "IPPROTO_IP":"IPPROTO_IPV6"), + ((optname==IP_TOS)?"IP_TOS":"IPV6_TCLASS"), + sopt); + goto cleanup; + } + } + if(interface){ if(!OWPSocketInterfaceBind(cntrl,fd,interface)) goto cleanup; @@ -261,6 +328,7 @@ _OWPClientConnect( const char *local_addr, const char *interface, I2Addr server_addr, + uint32_t dscp_ctrl, /* DSCP Value */ OWPErrSeverity *err_ret ) { @@ -314,7 +382,7 @@ _OWPClientConnect( if(ai->ai_family != AF_INET6) continue; - if( (rc = TryAddr(cntrl,ai,local_addr,interface,server_addr)) == 0) + if( (rc = TryAddr(cntrl,ai,local_addr,interface,server_addr,dscp_ctrl)) == 0) return 0; if(rc < 0) goto error; @@ -329,7 +397,7 @@ _OWPClientConnect( if(ai->ai_family != AF_INET) continue; - if( (rc = TryAddr(cntrl,ai,local_addr,interface,server_addr)) == 0) + if( (rc = TryAddr(cntrl,ai,local_addr,interface,server_addr,dscp_ctrl)) == 0) return 0; if(rc < 0) goto error; @@ -390,6 +458,7 @@ OWPControlOpenCommon( const char *interface, /* interface to bind to or null */ I2Addr server_addr, /* server addr */ uint32_t mode_req_mask, /* requested modes */ + uint32_t dscp_ctrl, /* DSCP Value */ OWPUserID userid, /* userid or NULL */ OWPNum64 *uptime_ret, /* server uptime - ret */ OWPErrSeverity *err_ret, /* err - return */ @@ -439,7 +508,7 @@ OWPControlOpenCommon( * Connect to the server. * Address policy check happens in here. */ - if(_OWPClientConnect(cntrl,local_addr,interface,server_addr,err_ret) != 0) + if(_OWPClientConnect(cntrl,local_addr,interface,server_addr,dscp_ctrl,err_ret) != 0) goto error; if(!cntrl->local_addr){ @@ -691,12 +760,13 @@ OWPControlOpen( const char *local_addr, /* local addr or null */ I2Addr server_addr, /* server addr */ uint32_t mode_req_mask, /* requested modes */ + uint32_t dscp_ctrl, /* DSCP Value */ OWPUserID userid, /* userid or NULL */ OWPNum64 *uptime_ret, /* server uptime - ret */ OWPErrSeverity *err_ret /* err - return */ ) { - return OWPControlOpenCommon(ctx,local_addr,NULL,server_addr,mode_req_mask, + return OWPControlOpenCommon(ctx,local_addr,NULL,server_addr,mode_req_mask,dscp_ctrl, userid,uptime_ret,err_ret,False); } @@ -718,13 +788,14 @@ OWPControlOpenInterface( const char *interface, /* interface to bind to or null */ I2Addr server_addr, /* server addr */ uint32_t mode_req_mask, /* requested modes */ + uint32_t dscp_ctrl, /* DSCP Value */ OWPUserID userid, /* userid or NULL */ OWPNum64 *uptime_ret, /* server uptime - ret */ OWPErrSeverity *err_ret /* err - return */ ) { - return OWPControlOpenCommon(ctx,local_addr,interface,server_addr, - mode_req_mask,userid,uptime_ret,err_ret,False); + return OWPControlOpenCommon(ctx,local_addr,interface,server_addr,mode_req_mask,dscp_ctrl, + userid,uptime_ret,err_ret,False); } /* @@ -747,12 +818,13 @@ TWPControlOpen( const char *local_addr, /* local addr or null */ I2Addr server_addr, /* server addr */ uint32_t mode_req_mask, /* requested modes */ + uint32_t dscp_ctrl, /* DSCP Value */ OWPUserID userid, /* userid or NULL */ OWPNum64 *uptime_ret, /* server uptime - ret */ OWPErrSeverity *err_ret /* err - return */ ) { - return OWPControlOpenCommon(ctx,local_addr,NULL,server_addr,mode_req_mask, + return OWPControlOpenCommon(ctx,local_addr,NULL,server_addr,mode_req_mask,dscp_ctrl, userid,uptime_ret,err_ret,True); } @@ -774,13 +846,14 @@ TWPControlOpenInterface( const char *interface, /* interface to bind to or null */ I2Addr server_addr, /* server addr */ uint32_t mode_req_mask, /* requested modes */ + uint32_t dscp_ctrl, /* DSCP Value */ OWPUserID userid, /* userid or NULL */ OWPNum64 *uptime_ret, /* server uptime - ret */ OWPErrSeverity *err_ret /* err - return */ ) { - return OWPControlOpenCommon(ctx,local_addr,interface,server_addr, - mode_req_mask,userid,uptime_ret,err_ret,True); + return OWPControlOpenCommon(ctx,local_addr,interface,server_addr,mode_req_mask,dscp_ctrl, + userid,uptime_ret,err_ret,True); } /* @@ -807,7 +880,8 @@ _OWPClientRequestTestReadResponse( OWPBoolean server_conf_sender, I2Addr receiver, OWPBoolean server_conf_receiver, - OWPBoolean zero_addr, + OWPBoolean zero_sender_addr, + OWPBoolean zero_receiver_addr, OWPTestSpec *test_spec, OWPSID sid, /* ret iff cntrl->twoway || conf_receiver else set */ OWPErrSeverity *err_ret @@ -836,7 +910,7 @@ _OWPClientRequestTestReadResponse( I2AddrSAddr(sender,NULL), I2AddrSAddr(receiver,NULL), server_conf_sender, server_conf_receiver, - zero_addr, + zero_sender_addr, zero_receiver_addr, cntrl->twoway ? NULL : sid, test_spec)) < OWPErrOK){ *err_ret = (OWPErrSeverity)rc; return 1; @@ -853,7 +927,7 @@ _OWPClientRequestTestReadResponse( /* * Figure out if the server will be returning Port field. - * If so - set set_addr to the sockaddr that needs to be set. + * If so - set set_addr to the sockaddr that needs to be set. */ if(server_conf_sender && !server_conf_receiver){ if( !I2AddrSetPort(sender,port_ret)){ @@ -909,7 +983,8 @@ OWPSessionRequest( OWPBoolean server_conf_sender, I2Addr receiver, OWPBoolean server_conf_receiver, - OWPBoolean zero_addr, + OWPBoolean zero_sender_addr, + OWPBoolean zero_receiver_addr, OWPTestSpec *test_spec, FILE *fp, OWPSID sid_ret, @@ -1125,7 +1200,7 @@ OWPSessionRequest( !cntrl->twoway && server_conf_sender, receiver, !cntrl->twoway && server_conf_receiver, - zero_addr, + zero_sender_addr, zero_receiver_addr, test_spec,tsession->sid,err_ret)) != 0){ goto error; } @@ -1208,7 +1283,7 @@ OWPSessionRequest( if((rc = _OWPClientRequestTestReadResponse(cntrl,retn_on_intr, sender,server_conf_sender, receiver,server_conf_receiver, - zero_addr, + zero_sender_addr,zero_receiver_addr, test_spec,tsession->sid,err_ret)) != 0){ goto error; } diff --git a/owamp/owamp/owamp/endpoint.c b/owamp/owamp/owamp/endpoint.c index d5d15901..c4ade475 100644 --- a/owamp/owamp/owamp/endpoint.c +++ b/owamp/owamp/owamp/endpoint.c @@ -2393,12 +2393,21 @@ run_receiver( /* * Verify peer before looking at packet. */ - if(I2SockAddrEqual(rsaddr,rsaddrlen, - (struct sockaddr*)&peer_addr, - peer_addr_len,I2SADDR_ALL) <= 0){ - goto again; - } - + // If Remote PAT-T set, do not check Sending Port from Sender Node + if((OWPBoolean)OWPContextConfigGetV(ep->cntrl->ctx,OWPPATTRemote)) + { + if(I2SockAddrEqual(rsaddr,rsaddrlen, + (struct sockaddr*)&peer_addr, + peer_addr_len,I2SADDR_ADDR) <= 0){ + goto again; + } + } + else if(I2SockAddrEqual(rsaddr,rsaddrlen, + (struct sockaddr*)&peer_addr, + peer_addr_len,I2SADDR_ALL) <= 0){ + goto again; + } + /* * Decrypt the packet if needed. */ @@ -2617,7 +2626,7 @@ run_reflector( uint8_t ttl; size_t snd_payload_len; uint32_t testtimeout; - + if( !(lsaddr = I2AddrSAddr(ep->tsession->sender,&lsaddrlen))){ exit(OWP_CNTRL_FAILURE); } @@ -2825,12 +2834,21 @@ run_reflector( /* * Verify peer before looking at packet. - */ - if(I2SockAddrEqual(rsaddr,rsaddrlen, - (struct sockaddr*)&peer_addr, - peer_addr_len,I2SADDR_ALL) <= 0){ - goto again; - } + */ + // If Remote PAT-T set, do not check Sending Port from Sender Node + if((OWPBoolean)OWPContextConfigGetV(ep->cntrl->ctx,OWPPATTRemote)) + { + if(I2SockAddrEqual(rsaddr,rsaddrlen, + (struct sockaddr*)&peer_addr, + peer_addr_len,I2SADDR_ADDR) <= 0){ + goto again; + } + } + else if(I2SockAddrEqual(rsaddr,rsaddrlen, + (struct sockaddr*)&peer_addr, + peer_addr_len,I2SADDR_ALL) <= 0){ + goto again; + } #ifdef OWP_EXTRA_DEBUG { diff --git a/owamp/owamp/owamp/owamp.h b/owamp/owamp/owamp/owamp.h index e5be0a90..50c0246b 100644 --- a/owamp/owamp/owamp/owamp.h +++ b/owamp/owamp/owamp/owamp.h @@ -725,6 +725,22 @@ typedef void (*OWPCloseFileFunc)( */ #define OWPIPv6Only "OWPIPv6Only" +/* + * Such option may be used if PAT is done on Remote side and Ports are not preserved. It concerns only traffic issued by the Remote Node. + * Do not check Remote test port [bypass Remote Port Translation] + */ +#define OWPPATTRemote "OWPPATTRemote" + +/* + * Such option may be used if Client is not aware of NAT on Server Side. Otherwise this may be handled using unspecified address for target. + * Any Receiver Session Address is seen as Local Address [bypass Address Translation on Receiver side] + */ +#define OWPNATTServer "OWPNATTServer" + +/* Such option may be used to bypass Address Translation on Client/server if Client is aware of it and use Unspecified Address + * In this case Unspecified Session Addresses are switched with Control Addresses seen by the Server if set at the server level */ +#define OWPSwitchUnspec "OWPSwitchUnspec" + extern int OWPReportLevelByName( const char *name @@ -858,7 +874,8 @@ OWPControlOpen( OWPContext ctx, const char *local_addr, /* src addr or NULL */ I2Addr server_addr, /* server addr or NULL */ - uint32_t mode_mask, /* OR of OWPSessionMode vals */ + uint32_t mode_mask, /* OR of OWPSessionMode vals */ + uint32_t dscp_ctrl, /* DSCP Value */ OWPUserID userid, /* null if unwanted */ OWPNum64 *uptime_ret, /* server uptime - ret or NULL */ OWPErrSeverity *err_ret @@ -874,6 +891,7 @@ OWPControlOpenInterface( const char *interface, /* interface to bind to or NULL */ I2Addr server_addr, /* server addr */ uint32_t mode_req_mask, /* requested modes */ + uint32_t dscp_ctrl, /* DSCP Value */ OWPUserID userid, /* userid or NULL */ OWPNum64 *uptime_ret, /* server uptime - ret */ OWPErrSeverity *err_ret /* err - return */ @@ -888,7 +906,8 @@ TWPControlOpen( OWPContext ctx, const char *local_addr, /* src addr or NULL */ I2Addr server_addr, /* server addr or NULL */ - uint32_t mode_mask, /* OR of OWPSessionMode vals */ + uint32_t mode_mask, /* OR of OWPSessionMode vals */ + uint32_t dscp_ctrl, /* DSCP Value */ OWPUserID userid, /* null if unwanted */ OWPNum64 *uptime_ret, /* server uptime - ret or NULL */ OWPErrSeverity *err_ret @@ -904,6 +923,7 @@ TWPControlOpenInterface( const char *interface, /* interface to bind to or NULL */ I2Addr server_addr, /* server addr or NULL */ uint32_t mode_mask, /* OR of OWPSessionMode vals */ + uint32_t dscp_ctrl, /* DSCP Value */ OWPUserID userid, /* null if unwanted */ OWPNum64 *uptime_ret, /* server uptime - ret or NULL */ OWPErrSeverity *err_ret @@ -949,7 +969,8 @@ OWPSessionRequest( OWPBoolean server_conf_sender, I2Addr receiver, OWPBoolean server_conf_receiver, - OWPBoolean zero_addr, + OWPBoolean zero_sender_addr, + OWPBoolean zero_receiver_addr, OWPTestSpec *test_spec, FILE *fp, OWPSID sid_ret, diff --git a/owamp/owamp/owamp/owampP.h b/owamp/owamp/owamp/owampP.h index 79dea601..9f106951 100644 --- a/owamp/owamp/owamp/owampP.h +++ b/owamp/owamp/owamp/owampP.h @@ -633,7 +633,8 @@ _OWPEncodeTestRequestPreamble( OWPBoolean server_conf_sender, OWPBoolean server_conf_receiver, OWPBoolean twoway, - OWPBoolean zero_addr, + OWPBoolean zero_sender_addr, + OWPBoolean zero_receiver_addr, OWPSID sid, OWPTestSpec *tspec ); @@ -674,7 +675,8 @@ _OWPWriteTestRequest( struct sockaddr *receiver, OWPBoolean server_conf_sender, OWPBoolean server_conf_receiver, - OWPBoolean zero_addr, + OWPBoolean zero_sender_addr, + OWPBoolean zero_receiver_addr, OWPSID sid, OWPTestSpec *test_spec ); diff --git a/owamp/owamp/owamp/protocol.c b/owamp/owamp/owamp/protocol.c index 8eb6dce9..5f1c9ab5 100644 --- a/owamp/owamp/owamp/protocol.c +++ b/owamp/owamp/owamp/protocol.c @@ -588,7 +588,8 @@ _OWPEncodeTestRequestPreamble( OWPBoolean server_conf_sender, OWPBoolean server_conf_receiver, OWPBoolean twoway, - OWPBoolean zero_addr, + OWPBoolean zero_sender_addr, + OWPBoolean zero_receiver_addr, OWPSID sid, OWPTestSpec *tspec ) @@ -680,7 +681,7 @@ _OWPEncodeTestRequestPreamble( case 6: /* sender address and port */ saddr6 = (struct sockaddr_in6*)sender; - if (zero_addr) + if (zero_sender_addr) memset(&buf[16], 0, 16); else memcpy(&buf[16],saddr6->sin6_addr.s6_addr,16); @@ -688,7 +689,7 @@ _OWPEncodeTestRequestPreamble( /* receiver address and port */ saddr6 = (struct sockaddr_in6*)receiver; - if (zero_addr) + if (zero_receiver_addr) memset(&buf[32], 0, 16); else memcpy(&buf[32],saddr6->sin6_addr.s6_addr,16); @@ -699,13 +700,13 @@ _OWPEncodeTestRequestPreamble( case 4: /* sender address and port */ saddr4 = (struct sockaddr_in*)sender; - *(uint32_t*)&buf[16] = zero_addr ? 0 : saddr4->sin_addr.s_addr; + *(uint32_t*)&buf[16] = zero_sender_addr ? 0 : saddr4->sin_addr.s_addr; *(uint16_t*)&buf[12] = saddr4->sin_port; memset(&buf[20],0,12); /* receiver address and port */ saddr4 = (struct sockaddr_in*)receiver; - *(uint32_t*)&buf[32] = zero_addr ? 0 : saddr4->sin_addr.s_addr; + *(uint32_t*)&buf[32] = zero_receiver_addr ? 0 : saddr4->sin_addr.s_addr; *(uint16_t*)&buf[14] = saddr4->sin_port; memset(&buf[36],0,12); @@ -1011,7 +1012,8 @@ _OWPWriteTestRequest( struct sockaddr *receiver, OWPBoolean server_conf_sender, OWPBoolean server_conf_receiver, - OWPBoolean zero_addr, + OWPBoolean zero_sender_addr, + OWPBoolean zero_receiver_addr, OWPSID sid, OWPTestSpec *test_spec ) @@ -1036,7 +1038,7 @@ _OWPWriteTestRequest( if((_OWPEncodeTestRequestPreamble(cntrl->ctx,cntrl->msg,&buf_len, sender,receiver,server_conf_sender, server_conf_receiver,cntrl->twoway, - zero_addr,sid,test_spec) != 0) || + zero_sender_addr,zero_receiver_addr,sid,test_spec) != 0) || (buf_len != 112)){ return OWPErrFATAL; } @@ -1456,15 +1458,45 @@ _OWPReadTestRequest( *accept_ptr = OWP_CNTRL_UNSUPPORTED; return err_ret; } - if (cntrl->twoway) { - const struct sockaddr *local_saddr; - socklen_t local_saddrlen; - _OWPSetSAddrIfUnspec(cntrl->ctx,remote_saddr, - (struct sockaddr*)&sendaddr_rec); - local_saddr = I2AddrSAddr(cntrl->local_addr,&local_saddrlen); - _OWPSetSAddrIfUnspec(cntrl->ctx,local_saddr, - (struct sockaddr*)&recvaddr_rec); - } + + // Accept Zero Addr + if((OWPBoolean)OWPContextConfigGetV(cntrl->ctx,OWPSwitchUnspec)) + { + + if (cntrl->twoway) { + const struct sockaddr *local_saddr; + socklen_t local_saddrlen; + _OWPSetSAddrIfUnspec(cntrl->ctx,remote_saddr, + (struct sockaddr*)&sendaddr_rec); + local_saddr = I2AddrSAddr(cntrl->local_addr,&local_saddrlen); + _OWPSetSAddrIfUnspec(cntrl->ctx,local_saddr, + (struct sockaddr*)&recvaddr_rec); + } + + // This is an extension to the OWAMP RFC to handle Address Translation on the client/server side + else + { + const struct sockaddr *local_saddr; + socklen_t local_saddrlen; + local_saddr = I2AddrSAddr(cntrl->local_addr,&local_saddrlen); + + if(conf_sender && !conf_receiver) + { + _OWPSetSAddrIfUnspec(cntrl->ctx,local_saddr, + (struct sockaddr*)&sendaddr_rec); + _OWPSetSAddrIfUnspec(cntrl->ctx,remote_saddr, + (struct sockaddr*)&recvaddr_rec); + } + else if(!conf_sender && conf_receiver) + { + _OWPSetSAddrIfUnspec(cntrl->ctx,remote_saddr, + (struct sockaddr*)&sendaddr_rec); + _OWPSetSAddrIfUnspec(cntrl->ctx,local_saddr, + (struct sockaddr*)&recvaddr_rec); + } + } + } + /* * TestRequest Preamble is read, now ready to read slots. diff --git a/owamp/owamp/owamp/sapi.c b/owamp/owamp/owamp/sapi.c index 0e5dae16..226beb89 100644 --- a/owamp/owamp/owamp/sapi.c +++ b/owamp/owamp/owamp/sapi.c @@ -1,3 +1,4 @@ + /* * $Id$ */ @@ -29,6 +30,91 @@ #include #include #include +#include + +/* + * Function : __util_I2AddrIPName + * + * Description : provides the ip in char* for a given I2Addr + */ +char * +__util_I2AddrIPName( + I2Addr addr, + char *buf, + size_t *len + ) +{ + assert(buf); + assert(len); + int size_min = INET6_ADDRSTRLEN > INET_ADDRSTRLEN ? INET6_ADDRSTRLEN : INET_ADDRSTRLEN; + assert(*len >size_min); + buf[0]='\0'; + + socklen_t saddrlen; + struct sockaddr *saddr = I2AddrSAddr(addr, &saddrlen); + switch(saddr->sa_family) + { + case AF_INET: + struct sockaddr_in *addr_in = (struct sockaddr_in *)saddr; + inet_ntop(AF_INET, &(addr_in->sin_addr),buf,INET_ADDRSTRLEN); + break; + + case AF_INET6: + struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)saddr; + inet_ntop(AF_INET6, &(addr_in6->sin6_addr),buf,INET6_ADDRSTRLEN); + break; + + default: + break; + } + + *len = MIN(*len,strlen(buf)); + return buf; +} + + +/* + * Function : __util_modeName + * + * Description : provides the Mode in char* for a given Mode + */ +char * +__util_modeName( + int mode, + char *buf, + size_t *len + ) +{ + assert(buf); + assert(len); + assert(*len>0); + + switch(mode) + { + case OWP_MODE_OPEN: + strncpy(buf,"open",*len); + break; + + case OWP_MODE_AUTHENTICATED: + strncpy(buf,"authenticated",*len); + break; + + case OWP_MODE_ENCRYPTED: + strncpy(buf,"encrypted",*len); + break; + + case TWP_MODE_MIXED: + strncpy(buf,"mixed",*len); + break; + + default: + strncpy(buf,"undefined",*len); + break; + } + + *len = MIN(*len,strlen(buf)); + return buf; +} static int @@ -56,7 +142,7 @@ OpenSocket( if(fd < 0) continue; - + on=1; if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)) != 0){ goto failsock; @@ -653,6 +739,70 @@ OWPProcessTestRequest( goto error; } + // Logs to get Information on OWAMP Sessions + char mode[NI_MAXSERV]; + size_t mode_len = sizeof(mode); + + char recvnode[NI_MAXHOST]; + size_t recvnode_len = sizeof(recvnode); + char recvnode_info[NI_MAXHOST]; + size_t recvnode_info_len = sizeof(recvnode_info); + + char sendnode[NI_MAXHOST]; + size_t sendnode_len = sizeof(sendnode); + char sendnode_info[NI_MAXHOST]; + size_t sendnode_info_len = sizeof(sendnode_info); + + char remotenode[NI_MAXHOST]; + size_t remotenode_len = sizeof(remotenode); + char remotenode_info[NI_MAXHOST]; + size_t remotenode_info_len = sizeof(remotenode_info); + + char localnode[NI_MAXHOST]; + size_t localnode_len = sizeof(localnode); + char localnode_info[NI_MAXHOST]; + size_t localnode_info_len = sizeof(localnode_info); + + int recvport = 0; + int sendport = 0; + int remoteport = 0; + int localport = 0; + + __util_modeName(cntrl->mode,mode,&mode_len); + + I2AddrNodeName(tsession->receiver,recvnode,&recvnode_len); + recvport=I2AddrPort(tsession->receiver); + __util_I2AddrIPName(tsession->receiver,recvnode_info,&recvnode_info_len); + + I2AddrNodeName(tsession->sender,sendnode,&sendnode_len); + sendport=I2AddrPort(tsession->sender); + __util_I2AddrIPName(tsession->sender,sendnode_info,&sendnode_info_len); + + I2AddrNodeName(cntrl->remote_addr,remotenode,&remotenode_len); + remoteport=I2AddrPort(cntrl->remote_addr); + __util_I2AddrIPName(cntrl->remote_addr,remotenode_info,&remotenode_info_len); + + I2AddrNodeName(cntrl->local_addr,localnode,&localnode_len); + localport=I2AddrPort(cntrl->local_addr); + __util_I2AddrIPName(cntrl->local_addr,localnode_info,&localnode_info_len); + + OWPError(cntrl->ctx,OWPErrINFO,OWPErrUNKNOWN,"===== New OWAMP Process Test Request [Mode: %s]\n\tCtrl = Remote: %s:%d (%s) ==> Local: %s:%d (%s)\n\tSession = [Sender]: %s:%d (%s) ==> [Receiver]: %s:%d (%s)", + mode, + remotenode, + remoteport, + remotenode_info, + localnode, + localport, + localnode_info, + sendnode, + sendport, + sendnode_info, + recvnode, + recvport, + recvnode_info + ); + + /* * if conf_receiver - open port and get SID. */ @@ -671,7 +821,22 @@ OWPProcessTestRequest( err_ret = OWPErrWARNING; goto error; } - + + // If NAT-T set on server side, use the local address for Receiving on server + if((OWPBoolean)OWPContextConfigGetV(cntrl->ctx,OWPNATTServer)) + { + struct sockaddr *local_saddr; + + if(!(local_saddr=I2AddrSAddr(cntrl->local_addr,&saddrlen))) + { + OWPError(cntrl->ctx,OWPErrFATAL,OWPErrUNKNOWN, + "Unable to determine sockaddr information"); + err_ret = OWPErrFATAL; + goto error; + } + ((struct sockaddr_in *)rsaddr)->sin_addr=((struct sockaddr_in *)local_saddr)->sin_addr; + } + if(!_OWPCallCheckTestPolicy(cntrl,False, rsaddr,ssaddr,saddrlen, &tsession->test_spec,&tsession->closure, @@ -723,14 +888,29 @@ OWPProcessTestRequest( if(I2SockAddrEqual(csaddr,csaddrlen,rsaddr,saddrlen, I2SADDR_ADDR) <= 0){ OWPError(cntrl->ctx,OWPErrWARNING,OWPErrPOLICY, - "Test Denied: OpenMode recieve_addr(%s) != control_client(%s)", + "Test Denied: OpenMode receive_addr(%s) != control_client(%s)", recvnode,remotenode); acceptval = OWP_CNTRL_REJECT; err_ret = OWPErrWARNING; goto error; } } - + + // If NAT-T set on server side, use the local address for sending from server + if((OWPBoolean)OWPContextConfigGetV(cntrl->ctx,OWPNATTServer)) + { + struct sockaddr *local_saddr; + + if(!(local_saddr=I2AddrSAddr(cntrl->local_addr,&saddrlen))) + { + OWPError(cntrl->ctx,OWPErrFATAL,OWPErrUNKNOWN, + "Unable to determine sockaddr information"); + err_ret = OWPErrFATAL; + goto error; + } + ((struct sockaddr_in *)ssaddr)->sin_addr=((struct sockaddr_in *)local_saddr)->sin_addr; + } + if(!_OWPCallCheckTestPolicy(cntrl,True, ssaddr,rsaddr,saddrlen, &tsession->test_spec, @@ -750,6 +930,9 @@ OWPProcessTestRequest( goto error; } port = I2AddrPort(tsession->sender); + + OWPError(cntrl->ctx,OWPErrINFO,OWPErrUNKNOWN,"Endpoint Test Sender Port Computed: %d", port); + } /* @@ -763,6 +946,8 @@ OWPProcessTestRequest( goto error; } port = I2AddrPort(tsession->receiver); + + OWPError(cntrl->ctx,OWPErrINFO,OWPErrUNKNOWN,"Endpoint Test Receiver Port Computed: %d", port); } if( (rc = _OWPWriteAcceptSession(cntrl,intr,OWP_CNTRL_ACCEPT, @@ -794,6 +979,7 @@ OWPProcessTestRequest( return err_ret; } + OWPErrSeverity OWPProcessTestRequestTW( OWPControl cntrl, @@ -816,7 +1002,7 @@ OWPProcessTestRequestTW( } /* - * Read the TestRequest and alloate tsession to hold the information. + * Read the TestRequest and allocate tsession to hold the information. */ if((rc = _OWPReadTestRequest(cntrl,intr,&tsession,&acceptval)) != OWPErrOK){ @@ -841,6 +1027,84 @@ OWPProcessTestRequestTW( goto error; } + // Logs to get Information on TWAMP Sessions + char mode[NI_MAXHOST]; + size_t mode_len = sizeof(mode); + + char recvnode[NI_MAXHOST]; + size_t recvnode_len = sizeof(recvnode); + char recvnode_info[NI_MAXHOST]; + size_t recvnode_info_len = sizeof(recvnode_info); + + char sendnode[NI_MAXHOST]; + size_t sendnode_len = sizeof(sendnode); + char sendnode_info[NI_MAXHOST]; + size_t sendnode_info_len = sizeof(sendnode_info); + + char remotenode[NI_MAXHOST]; + size_t remotenode_len = sizeof(remotenode); + char remotenode_info[NI_MAXHOST]; + size_t remotenode_info_len = sizeof(remotenode_info); + + char localnode[NI_MAXHOST]; + size_t localnode_len = sizeof(localnode); + char localnode_info[NI_MAXHOST]; + size_t localnode_info_len = sizeof(localnode_info); + + int recvport = 0; + int sendport = 0; + int remoteport = 0; + int localport = 0; + + __util_modeName(cntrl->mode,mode,&mode_len); + + I2AddrNodeName(tsession->receiver,recvnode,&recvnode_len); + recvport=I2AddrPort(tsession->receiver); + __util_I2AddrIPName(tsession->receiver,recvnode_info,&recvnode_info_len); + + I2AddrNodeName(tsession->sender,sendnode,&sendnode_len); + sendport=I2AddrPort(tsession->sender); + __util_I2AddrIPName(tsession->sender,sendnode_info,&sendnode_info_len); + + I2AddrNodeName(cntrl->remote_addr,remotenode,&remotenode_len); + remoteport=I2AddrPort(cntrl->remote_addr); + __util_I2AddrIPName(cntrl->remote_addr,remotenode_info,&remotenode_info_len); + + I2AddrNodeName(cntrl->local_addr,localnode,&localnode_len); + localport=I2AddrPort(cntrl->local_addr); + __util_I2AddrIPName(cntrl->local_addr,localnode_info,&localnode_info_len); + + OWPError(cntrl->ctx,OWPErrINFO,OWPErrUNKNOWN,"===== New TWAMP Process Test Request [Mode: %s]\n\tCtrl = Remote: %s:%d (%s) ==> Local: %s:%d (%s)\n\tSession = [Sender]: %s:%d (%s) ==> [Reflector]: %s:%d (%s)", + mode, + remotenode, + remoteport, + remotenode_info, + localnode, + localport, + localnode_info, + sendnode, + sendport, + sendnode_info, + recvnode, + recvport, + recvnode_info + ); + + // If NAT-T set on server side, use the local address for Receiving on server + if((OWPBoolean)OWPContextConfigGetV(cntrl->ctx,OWPNATTServer)) + { + struct sockaddr *local_saddr; + + if(!(local_saddr=I2AddrSAddr(cntrl->local_addr,&saddrlen))) + { + OWPError(cntrl->ctx,OWPErrFATAL,OWPErrUNKNOWN, + "Unable to determine sockaddr information"); + err_ret = OWPErrFATAL; + goto error; + } + ((struct sockaddr_in *)rsaddr)->sin_addr=((struct sockaddr_in *)local_saddr)->sin_addr; + } + if(_OWPCreateSID(tsession) != 0){ err_ret = OWPErrWARNING; acceptval = OWP_CNTRL_FAILURE; @@ -884,6 +1148,8 @@ OWPProcessTestRequestTW( acceptval = OWP_CNTRL_FAILURE; goto error; } + + OWPError(cntrl->ctx,OWPErrINFO,OWPErrUNKNOWN,"Reflector Test Port Computed: %d", port); if( (rc = _OWPWriteAcceptSession(cntrl,intr,OWP_CNTRL_ACCEPT, port,tsession->sid)) < OWPErrOK){ diff --git a/owamp/owamp/owampd/owampd.c b/owamp/owamp/owampd/owampd.c index 5f29fbdf..79d600c3 100644 --- a/owamp/owamp/owampd/owampd.c +++ b/owamp/owamp/owampd/owampd.c @@ -19,7 +19,39 @@ * Date: Mon Jun 03 10:57:07 MDT 2002 * * Description: - */ + * + * + * + * Addons : frederic.roudaut@orange.com + * Trying to provide solutions to improve NAT/PAT Bypass : + * - twampd : + * - Option [W] : has to be used now to handle Zero Addr in Twamp Request when Session Sender/Reflector + * are also Control Client/Server. Control-Server had then to switch the Zero Addr with + * the corresponding Control IP Addr. + * It helps to bypass NAT on both Session Sender/Reflector when they are also Control Client/Server. + * - Option [x] to handle PAT from the Session-Sender. In that case, Session-Sender Port + * is not checked. Indeed, even with Zero Address, PAT on Session-Sender was not considered. + * - Option [Y] : Such option may be used if Control-Client is not aware of NAT on Session-Reflector Side and/or + * does not use zero address. In that case any Session-Reflector Address is seen as Local Address. + * + * + * - owampd : + * - Option [W] has been added as an extension to OWAMP RFC when Session Sender/Receiver are + * also Control Client/Server. + * As for TWAMP, it permits to handle Zero Addr for Session Sender/Receiver in Owamp Requests + * from Control-Client + * In that case Control-Server had to switch the Zero Addr with the corresponding Session IP Addr + * according the way test is done. + * It helps to bypass NAT on both Session Sender/Receiver. + * - Option [x] to handle PAT from the Session-Remote. In that case, Session-Remote Port + * is not checked. Indeed, even with Zero Address, PAT on Session-Remote was not considered. + * - Option [Y] : Such option may be used if Control-Client is not aware of NAT on Session-Local Side and/or + * does not use zero address. In that case any Session-Local Address is seen as Local Address. + * + * + * + */ + #include #include @@ -112,6 +144,20 @@ usage( " -S nodename:port Srcaddr to bind to\n" " -U user Run as user \"user\" :-uid also valid\n" " -v verbose output\n" +#ifdef TWAMP + // Such option may be used if PAT is done on Session-Sender and Ports are not preserved. It concerns only traffic issued by the Session-Sender. + " -x Do not check Session-Sender port [bypass Port Translation for packets issued by the Session-Sender]\n" + // Such option may be used if Control-Client is not aware of NAT on Session-Reflector Side and/or does not use zero address. + " -Y Any Session-Reflector Address is seen as Local Address [bypass Address Translation on Session-Reflector side]\n" + " -W Unspecified Session Addresses are switched with Control Addresses seen [bypass Address Translation on Session Sender/Reflector]\n" +#else + // Such option may be used if PAT is done on Session-Remote side and Ports are not preserved. It concerns only traffic issued by the Session-Remote. + " -x Do not check Session-Remote test port [bypass Port Translation for packets issued by the Session-Remote]\n" + // Such option may be used if Control-Remote is not aware of NAT on Session-Local Side and/or does not use zero address. + " -Y Any Session-Local Address is seen as Local Address [bypass Address Translation on Session-Local side]\n" + " -W Unspecified Session Addresses are switched with Control Addresses seen [bypass Address Translation on Session Sender/Receiver]\n" + +#endif #ifdef DEBUG " -w Debugging: busy-wait children after fork to allow attachment\n" " -Z Debugging: Run in foreground\n" @@ -538,7 +584,7 @@ NewConnection( break; } } - + if (opts.maxcontrolsessions && (control_sessions + 1 > opts.maxcontrolsessions)) { /* @@ -1258,9 +1304,9 @@ int main( sigset_t sigs; #ifdef DEBUG - char *optstring = "a:c:d:e:fG:hP:R:S:U:vwZ"; + char *optstring = "a:c:d:e:fG:hP:R:S:U:vwZxYW"; #else - char *optstring = "a:c:d:e:fG:hP:R:S:U:vZ"; + char *optstring = "a:c:d:e:fG:hP:R:S:U:vZxYW"; #endif /* @@ -1292,6 +1338,9 @@ int main( opts.controltimeout = OWP_DFLT_CONTROL_TIMEOUT; opts.portspec = NULL; opts.maxcontrolsessions = 0; + opts.natt_server = False; + opts.patt_remote = False; + opts.switchUnspec = False; if(!getcwd(opts.cwd,sizeof(opts.cwd))){ perror("getcwd()"); @@ -1438,6 +1487,15 @@ int main( opts.childwait = (void*)True; break; #endif + case 'x': + opts.patt_remote = True; + break; + case 'Y': + opts.natt_server = True; + break; + case 'W': + opts.switchUnspec = True; + break; case 'h': case '?': default: @@ -1495,7 +1553,35 @@ int main( "OWPContextConfigSetV(): Can't set OWPEndDelay?!"); exit(1); } - + + /* + * Setup PATT Remote + */ + if(opts.patt_remote && !OWPContextConfigSetV(ctx,OWPPATTRemote, + (void*)True)){ + I2ErrLog(errhand, + "OWPContextConfigSetV(): Can't set OWPPATTRemote?!"); + exit(1); + } + /* + * Setup NAT Server + */ + if(opts.natt_server && !OWPContextConfigSetV(ctx,OWPNATTServer, + (void*)True)){ + I2ErrLog(errhand, + "OWPContextConfigSetV(): Can't set OWPNATTServer?!"); + exit(1); + } + /* + * Setup switchUnspec + */ + if(opts.switchUnspec && !OWPContextConfigSetV(ctx,OWPSwitchUnspec, + (void*)True)){ + I2ErrLog(errhand, + "OWPContextConfigSetV(): Can't set OWPSwitchUnspec?!"); + exit(1); + } + if(!opts.vardir) opts.vardir = opts.cwd; if(!opts.confdir) diff --git a/owamp/owamp/owampd/owampdP.h b/owamp/owamp/owampd/owampdP.h index f33b6eee..94e8bb4e 100644 --- a/owamp/owamp/owampd/owampdP.h +++ b/owamp/owamp/owampd/owampdP.h @@ -70,6 +70,10 @@ typedef struct { I2Boolean setEndDelay; double endDelay; + + I2Boolean patt_remote; /* -x */ + I2Boolean natt_server; /* -Y */ + I2Boolean switchUnspec; /* -W */ } owampd_opts; #endif /* _OWAMPDP_H_ */ diff --git a/owamp/owamp/owping/owping.c b/owamp/owamp/owping/owping.c index 8f3d8bf2..f0fb9529 100644 --- a/owamp/owamp/owping/owping.c +++ b/owamp/owamp/owping/owping.c @@ -23,6 +23,40 @@ * * Initial implementation of owping commandline application. This * application will measure active one-way udp latencies. + * + * + * + * Addons : frederic.roudaut@orange.com + * Trying to provide solutions to improve NAT/PAT Bypass : + * - TWAMP, twping : + * - option [Z] was already implemented to set Session Sender/Reflector IP to Zero Addr in Twamp + * Requests from Control-Client. In that case, Control-Client is also Session-Sender and + * Control-Server is Session-Reflector. Control-Server had then to switch the Zero Addr with + * the corresponding Control IP Addr. + * Such option is still available but now also split in 2 options : [X] For Session-Sender, + * [Y] For Session-Reflector. + * It helps to bypass NAT on both Session Sender/Reflector when they are also Control Client/Server. + * - Option [y] to handle PAT from the Session-Reflector. In that case, Session-Reflector Port + * is not checked. + * + * - OWAMP: owping : + * - Option [X], [Y] has been added as an extension to OWAMP RFC when Session Sender/Receiver are + * also Control Client/Server. + * As for TWAMP, it permits to set Session Sender/Receiver IP to Zero Addr in Owamp Requests + * from Control-Client : [X] For Session-Sender, [Y] For Session-Server. + * In that case Control-Server had to switch the Zero Addr with the corresponding Session IP Addr + * according the way test is done. For example when tests are done in both ways using Owamp, option [X] + * tells the Control-Server to use the zero address for Control-Client in test session from Control-Client + * to Control-Server and for Control-Server in test session from Control-Server to Control-client + * It helps to bypass NAT on both Session Sender/Receiver. + * - Option [y] to handle PAT from the Session-Remote. In that case, Session-Remote Port + * is not checked. + * + * + * Add an option [m] to set DSCP field on Control packets (from Control Client to Server). + * To reflect ToS received from Control-Client, on Linux we may have to set 1 into + * /proc/sys/net/ipv4/tcp_reflect_tos on Control-Server side + * */ #include #include @@ -70,9 +104,9 @@ print_conn_args( ) { #ifdef TWAMP - fprintf(stderr, "%s\n\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", + fprintf(stderr, "%s\n\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", #else - fprintf(stderr, "%s\n\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", + fprintf(stderr, "%s\n\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", #endif " [Connection Args]", #ifdef TWAMP @@ -84,12 +118,24 @@ print_conn_args( #endif " -S srcaddr specify the local address or interface for control connection and tests", " -B interface specify the interface to use for control connection and tests", -#ifdef TWAMP +#ifdef TWAMP " -Z do not specify IP addresses for tests packets (NAT traversal)", " -u username username to use with Authenticated/Encrypted/Mixed modes", #else " -u username username to use with Authenticated/Encrypted modes", #endif +#ifdef TWAMP + " -X do not specify IP addresses for Session-Sender (NAT traversal on Test Sender Side)", + " -Y do not specify IP addresses for Session-Reflector (NAT traversal on Test Reflector Side)", + // Such option may be used if PAT is done on Session-Reflector side and Ports are not preserved. It concerns only traffic issued by the Session-Reflector. + " -y do not check Session-Reflector port [bypass Port Translation for packets issued by the Test Reflector]", +#else + " -X do not specify IP addresses for Session-Sender (NAT traversal on Test Sender Side)", + " -Y do not specify IP addresses for Session-Receiver (NAT traversal on Test Receiver Side)", + // Such option may be used if PAT is done on Remote Side and Ports are not preserved. It concerns only traffic issued by the Remote. + " -y do not check Session-Remote port [bypass Port Translation for test packets issued by the Remote Test Side]", +#endif + " -m DSCP RFC 2474 style DSCP value for TOS byte on control connection", " -4 connect using IPv4 addresses only", " -6 connect using IPv6 addresses only" ); @@ -956,9 +1002,14 @@ parse_slots( return False; } +/* + * Type-P (To define DSCP in Test Session) Parsing + * This Parsing is also used to define DSCP Value in Ctrl Session + */ static OWPBoolean parse_typeP( - char *tspec + char *tspec, + uint32_t *dscpvalue ) { char *tstr,*endptr; @@ -984,7 +1035,7 @@ parse_typeP( } /* - * It is useful to define some symbolic constants for the -D (DSCP) + * It is useful to define some symbolic constants for the -D/-m (DSCP) * value. RFC 4594 seemed a reasonable collection of these useful * constants. * @@ -1159,11 +1210,11 @@ parse_typeP( * pType of OWAMP expects them in the low-order 6 bits of the * high-order byte. So, shift 24 left, and 2 right == 22. */ - ping_ctx.typeP = tosbyte << 22; + *dscpvalue = tosbyte << 22; return True; FAILED: - I2ErrLogP(eh,EINVAL,"Invalid DSCP value (-D): \"%s\": %M",tspec); + I2ErrLogP(eh,EINVAL,"Invalid DSCP value (-D/-m): \"%s\": %M",tspec); return False; } @@ -1217,7 +1268,7 @@ main( int ch; char *endptr = NULL; char optstring[128]; - static char *conn_opts = "64A:k:S:u:B:"; + static char *conn_opts = "64A:k:S:u:B:XYym:"; static char *test_opts = "c:D:E:F:i:L:P:s:z:"; static char *out_opts = "a:b:d:Mn:N:pQRv::U"; static char *gen_opts = "h"; @@ -1272,7 +1323,7 @@ main( ctx = ping_ctx.lib_ctx; /* Set default options. */ - ping_ctx.opt.v4only = ping_ctx.opt.v6only = ping_ctx.opt.zero_addr = + ping_ctx.opt.v4only = ping_ctx.opt.v6only = ping_ctx.opt.zero_sender_addr = ping_ctx.opt.zero_receiver_addr = ping_ctx.opt.records = ping_ctx.opt.from = ping_ctx.opt.to = ping_ctx.opt.quiet = ping_ctx.opt.raw = ping_ctx.opt.machine = False; #ifdef DEBUG @@ -1297,6 +1348,9 @@ main( ping_ctx.opt.portspec->low = 8760; ping_ctx.opt.portspec->high = 9960; + ping_ctx.opt.pattRemote = False; + ping_ctx.opt.dscp_ctrl = 0; + /* Create options strings for this program. */ if (!strcmp(progname, "owping") || !strcmp(progname, "twping")) { strcpy(optstring, conn_opts); @@ -1369,10 +1423,30 @@ main( exit(1); } break; + case 'X': + ping_ctx.opt.zero_sender_addr = True; + break; + case 'Y': + ping_ctx.opt.zero_receiver_addr = True; + break; case 'Z': - ping_ctx.opt.zero_addr = True; + ping_ctx.opt.zero_sender_addr = True; + ping_ctx.opt.zero_receiver_addr = True; break; - + case 'y': + ping_ctx.opt.pattRemote = True; + break; + case 'm': + if(ping_ctx.opt.dscp_ctrl){ + usage(progname, + "Invalid option \'-m\'. Can only set one \'-m\'"); + exit(1); + } + if(!parse_typeP(optarg, &(ping_ctx.opt.dscp_ctrl))){ + exit(1); + } + break; + /* Test options. */ case 'c': @@ -1389,7 +1463,7 @@ main( "Invalid option \'-D\'. Can only set one \'-D\'"); exit(1); } - if(!parse_typeP(optarg)){ + if(!parse_typeP(optarg,&ping_ctx.typeP)){ exit(1); } break; @@ -1723,6 +1797,14 @@ main( exit(1); } + /* + * Setup pattRemote + */ + if(ping_ctx.opt.pattRemote && !OWPContextConfigSetV(ctx,OWPPATTRemote, + (void*)True)){ + I2ErrLog(eh,"OWPContextConfigSetV(): Can't set OWPPATTRemote?!"); + exit(1); + } /* * Set the detach processes flag. @@ -1753,7 +1835,9 @@ main( ping_ctx.opt.srcaddr, ping_ctx.opt.interface, I2AddrByNode(eh, ping_ctx.remote_serv), - ping_ctx.auth_mode,ping_ctx.opt.identity, + ping_ctx.auth_mode, + ping_ctx.opt.dscp_ctrl, + ping_ctx.opt.identity, NULL,&err_ret); if (!ping_ctx.cntrl){ I2ErrLog(eh, "Unable to open control connection to %s.", @@ -1851,7 +1935,7 @@ main( if (!OWPSessionRequest(ping_ctx.cntrl, NULL, False, I2AddrByNode(eh,ping_ctx.remote_test), - True,ping_ctx.opt.zero_addr, + True,ping_ctx.opt.zero_sender_addr,ping_ctx.opt.zero_receiver_addr, (OWPTestSpec*)&tspec, fromfp,tosid,&err_ret)) FailSession(ping_ctx.cntrl); @@ -1862,7 +1946,7 @@ main( if(ping_ctx.opt.to) { if (!OWPSessionRequest(ping_ctx.cntrl, NULL, False, I2AddrByNode(eh,ping_ctx.remote_test), - True,ping_ctx.opt.zero_addr, + True,ping_ctx.opt.zero_sender_addr,ping_ctx.opt.zero_receiver_addr, (OWPTestSpec*)&tspec, NULL,tosid,&err_ret)) FailSession(ping_ctx.cntrl); @@ -1887,7 +1971,7 @@ main( if (!OWPSessionRequest(ping_ctx.cntrl, I2AddrByNode(eh,ping_ctx.remote_test), - True, NULL, False, ping_ctx.opt.zero_addr, + True, NULL, False, ping_ctx.opt.zero_sender_addr,ping_ctx.opt.zero_receiver_addr, (OWPTestSpec*)&tspec, fromfp,fromsid,&err_ret)) FailSession(ping_ctx.cntrl); @@ -2089,7 +2173,9 @@ main( ping_ctx.opt.srcaddr, ping_ctx.opt.interface, I2AddrByNode(eh, ping_ctx.remote_serv), - ping_ctx.auth_mode,ping_ctx.opt.identity, + ping_ctx.auth_mode, + ping_ctx.opt.dscp_ctrl, + ping_ctx.opt.identity, NULL,&err_ret); if (!ping_ctx.cntrl){ I2ErrLog(eh, "Unable to open control connection to %s.", @@ -2144,7 +2230,9 @@ main( ping_ctx.opt.srcaddr, ping_ctx.opt.interface, I2AddrByNode(eh, ping_ctx.remote_serv), - ping_ctx.auth_mode,ping_ctx.opt.identity, + ping_ctx.auth_mode, + ping_ctx.opt.dscp_ctrl, + ping_ctx.opt.identity, &tstamp.owptime,&err_ret); if (!ping_ctx.cntrl){ I2ErrLog(eh, "Unable to open control connection to %s.", diff --git a/owamp/owamp/owping/owpingP.h b/owamp/owamp/owping/owpingP.h index a8d9f46a..b281f7e0 100644 --- a/owamp/owamp/owping/owpingP.h +++ b/owamp/owamp/owping/owpingP.h @@ -82,8 +82,10 @@ typedef struct { I2Boolean printfiles; /* -p */ char *srcaddr; /* -S */ char *interface; /* -B */ - I2Boolean zero_addr; /* -Z */ - + I2Boolean zero_sender_addr; /* -X */ + I2Boolean zero_receiver_addr; /* -Y */ + I2Boolean pattRemote; /* -y */ + uint32_t dscp_ctrl; /* -m */ OWPPortRange portspec; /* -P */ #ifdef DEBUG diff --git a/owamp/owamp/powstream/powstream.c b/owamp/owamp/powstream/powstream.c index ff49ffd5..d59394a2 100644 --- a/owamp/owamp/powstream/powstream.c +++ b/owamp/owamp/powstream/powstream.c @@ -22,6 +22,24 @@ * application will measure active one-way udp latencies. And it will * set up perpetual tests and keep them going until this application * is killed. + * + * + * + * Addons : frederic.roudaut@orange.com + * Trying to provide solutions to improve NAT/PAT Bypass : + * + * - Option [X], [Y] has been added as an extension to OWAMP RFC when Session Sender/Receiver are + * also Control Client/Server. + * As for TWAMP, it permits to set Session Sender/Receiver IP to Zero Addr in Owamp Requests + * from Control-Client : [X] For Session-Sender, [Y] For Session-Server. + * In that case Control-Server had to switch the Zero Addr with the corresponding Session IP Addr + * according the way test is done. For example when tests are done in both ways using Owamp, option [X] + * tells the Control-Server to use the zero address for Control-Client in test session from Control-Client + * to Control-Server and for Control-Server in test session from Control-Server to Control-client + * It helps to bypass NAT on both Session Sender/Receiver. + * - Option [y] to handle PAT from the Session-Remote. In that case, Session-Remote Port + * is not checked. + * */ #include @@ -114,6 +132,9 @@ print_conn_args(){ " -B interface specify the interface to use for control connection and tests\n" " -u username username to use with Authenticated/Encrypted modes\n" " -I retryDelay time to wait between failed connections (default: 60 seconds)\n" +" -X do not specify IP addresses for Session-Sender (NAT traversal on Test Sender Side)\n" +" -Y do not specify IP addresses for Session-Receiver (NAT traversal on Test Receiver Side)\n" +" -y do not check Session-Remote port [bypass Server Port Translation for test packets issued by the Remote Test Side]\n" ); } @@ -391,7 +412,9 @@ FetchSession( appctx.opt.srcaddr, appctx.opt.interface, I2AddrByNode(eh, appctx.remote_serv), - appctx.auth_mode,appctx.opt.identity, + appctx.auth_mode, + appctx.opt.dscp_ctrl, + appctx.opt.identity, NULL,&err); if (!p->fetch) { I2ErrLog(eh,"OWPControlOpen(%s): Couldn't open 'fetch' connection to server: %M", @@ -1050,7 +1073,9 @@ SetupSession( appctx.opt.srcaddr, appctx.opt.interface, I2AddrByNode(eh, appctx.remote_serv), - appctx.auth_mode,appctx.opt.identity, + appctx.auth_mode, + appctx.opt.dscp_ctrl, + appctx.opt.identity, NULL,&err))){ if(sig_check()) return 1; @@ -1147,7 +1172,7 @@ SetupSession( if(appctx.opt.sender){ if(!OWPSessionRequest(p->cntrl,NULL,(OWPBoolean)False, I2AddrByNode(eh,appctx.remote_test),(OWPBoolean)True, - (OWPBoolean)False,(OWPTestSpec*)&tspec,NULL,p->sid,&err)){ + (OWPBoolean)False,(OWPBoolean)False,(OWPTestSpec*)&tspec,NULL,p->sid,&err)){ I2ErrLog(eh,"OWPSessionRequest: Failed"); /* if(err == OWPErrFATAL){ @@ -1160,7 +1185,7 @@ SetupSession( } else{ if(!OWPSessionRequest(p->cntrl,I2AddrByNode(eh,appctx.remote_test), - True, NULL, False, False, (OWPTestSpec*)&tspec, p->testfp, + True, NULL, False, False, False, (OWPTestSpec*)&tspec, p->testfp, p->sid,&err)){ I2ErrLog(eh,"OWPSessionRequest: Failed"); /* @@ -1267,7 +1292,7 @@ main( int ch; char *endptr = NULL; char optstring[128]; - static char *conn_opts = "46A:k:S:B:u:I:"; + static char *conn_opts = "46A:k:S:B:u:I:XYy"; static char *test_opts = "c:E:i:L:s:tz:P:"; static char *out_opts = "b:d:e:g:N:pRvU"; static char *gen_opts = "hw"; @@ -1306,6 +1331,10 @@ main( appctx.opt.port_range.low = 8760; appctx.opt.port_range.high = 9960; + appctx.opt.zero_sender_addr = appctx.opt.zero_receiver_addr = False; + appctx.opt.pattRemote = False; + appctx.opt.dscp_ctrl = 0; + /* * Fix getopt if the brain-dead GNU version is being used. */ @@ -1486,6 +1515,16 @@ main( } } break; + case 'X': + appctx.opt.zero_sender_addr = False; + break; + case 'Y': + appctx.opt.zero_receiver_addr = False; + break; + case 'y': + appctx.opt.pattRemote = True; + break; + /* Output options */ case 'b': appctx.opt.bucketWidth = strtod(optarg, &endptr); diff --git a/owamp/owamp/powstream/powstreamP.h b/owamp/owamp/powstream/powstreamP.h index 2293d986..a84f0c72 100644 --- a/owamp/owamp/powstream/powstreamP.h +++ b/owamp/owamp/powstream/powstreamP.h @@ -96,6 +96,10 @@ typedef struct { I2Boolean setEndDelay; double endDelay; /* -E */ + I2Boolean zero_sender_addr; /* -X */ + I2Boolean zero_receiver_addr; /* -Y */ + I2Boolean pattRemote; /* -y */ + uint32_t dscp_ctrl; /* -m */ } opt; char *remote_test; diff --git a/owamp/owamp/test/session_setup.c b/owamp/owamp/test/session_setup.c index cdd82a2d..968d0edc 100644 --- a/owamp/owamp/test/session_setup.c +++ b/owamp/owamp/test/session_setup.c @@ -225,7 +225,7 @@ int session_setup_test( // not a real test, but these params run through the basic setup I2AddrByNode(ctx->eh, "localhost"), True, I2AddrByNode(ctx->eh, "localhost"), True, - False, + False,False, &tspec, NULL, sid_ret, &err_ret)) { From c6b112074c3f18a06d0ffcf5f3cbbe3c71f645b0 Mon Sep 17 00:00:00 2001 From: froudaut Date: Mon, 2 Dec 2024 10:10:34 +0100 Subject: [PATCH 2/5] Create README.md --- README.md | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..229849a3 --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +# Trying to provide solutions to improve NAT/PAT Bypass : + ##TWAMP, twping : + - option [Z] was already implemented to set Session Sender/Reflector IP to Zero Addr in Twamp + Requests from Control-Client. In that case, Control-Client is also Session-Sender and + Control-Server is Session-Reflector. Control-Server had then to switch the Zero Addr with + the corresponding Control IP Addr. + Such option is still available but now also split in 2 options : [X] For Session-Sender, + [Y] For Session-Reflector. + It helps to bypass NAT on both Session Sender/Reflector when they are also Control Client/Server. + - Option [y] to handle PAT from the Session-Reflector. In that case, Session-Reflector Port + is not checked. + + ## OWAMP: owping : + - Option [X], [Y] has been added as an extension to OWAMP RFC when Session Sender/Receiver are + also Control Client/Server. + As for TWAMP, it permits to set Session Sender/Receiver IP to Zero Addr in Owamp Requests + from Control-Client : [X] For Session-Sender, [Y] For Session-Server. + In that case Control-Server had to switch the Zero Addr with the corresponding Session IP Addr + according the way test is done. For example when tests are done in both ways using Owamp, option [X] + tells the Control-Server to use the zero address for Control-Client in test session from Control-Client + to Control-Server and for Control-Server in test session from Control-Server to Control-client + It helps to bypass NAT on both Session Sender/Receiver. + - Option [y] to handle PAT from the Session-Remote. In that case, Session-Remote Port + is not checked. + + ## twampd : + - Option [W] : has to be used now to handle Zero Addr in Twamp Request when Session Sender/Reflector + are also Control Client/Server. Control-Server had then to switch the Zero Addr with + the corresponding Control IP Addr. + It helps to bypass NAT on both Session Sender/Reflector when they are also Control Client/Server. + - Option [x] to handle PAT from the Session-Sender. In that case, Session-Sender Port + is not checked. Indeed, even with Zero Address, PAT on Session-Sender was not considered. + - Option [Y] : Such option may be used if Control-Client is not aware of NAT on Session-Reflector Side and/or + does not use zero address. In that case any Session-Reflector Address is seen as Local Address. + + ## owampd : + - Option [W] has been added as an extension to OWAMP RFC when Session Sender/Receiver are + also Control Client/Server. + As for TWAMP, it permits to handle Zero Addr for Session Sender/Receiver in Owamp Requests + from Control-Client + In that case Control-Server had to switch the Zero Addr with the corresponding Session IP Addr + according the way test is done. + It helps to bypass NAT on both Session Sender/Receiver. + - Option [x] to handle PAT from the Session-Remote. In that case, Session-Remote Port + is not checked. Indeed, even with Zero Address, PAT on Session-Remote was not considered. + - Option [Y] : Such option may be used if Control-Client is not aware of NAT on Session-Local Side and/or + does not use zero address. In that case any Session-Local Address is seen as Local Address. + + +# DSCP On Control Session: + ## owping/twping + Add an option [m] to set DSCP field on Control packets (from Control Client to Server). + To reflect ToS received from Control-Client, on Linux we may have to set 1 into + /proc/sys/net/ipv4/tcp_reflect_tos on Control-Server side From be3ad962d41a8d99e65fa19c50610e1cdfb1e1b6 Mon Sep 17 00:00:00 2001 From: froudaut Date: Mon, 2 Dec 2024 10:15:03 +0100 Subject: [PATCH 3/5] Update README.md --- README.md | 95 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 48 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 229849a3..5dd13309 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,55 @@ # Trying to provide solutions to improve NAT/PAT Bypass : - ##TWAMP, twping : - - option [Z] was already implemented to set Session Sender/Reflector IP to Zero Addr in Twamp - Requests from Control-Client. In that case, Control-Client is also Session-Sender and - Control-Server is Session-Reflector. Control-Server had then to switch the Zero Addr with - the corresponding Control IP Addr. - Such option is still available but now also split in 2 options : [X] For Session-Sender, - [Y] For Session-Reflector. - It helps to bypass NAT on both Session Sender/Reflector when they are also Control Client/Server. - - Option [y] to handle PAT from the Session-Reflector. In that case, Session-Reflector Port - is not checked. +##TWAMP, twping : +- option [Z] was already implemented to set Session Sender/Reflector IP to Zero Addr in Twamp +Requests from Control-Client. In that case, Control-Client is also Session-Sender and +Control-Server is Session-Reflector. Control-Server had then to switch the Zero Addr with +the corresponding Control IP Addr. +Such option is still available but now also split in 2 options : [X] For Session-Sender, +[Y] For Session-Reflector. +It helps to bypass NAT on both Session Sender/Reflector when they are also Control Client/Server. +- Option [y] to handle PAT from the Session-Reflector. In that case, Session-Reflector Port +is not checked. - ## OWAMP: owping : - - Option [X], [Y] has been added as an extension to OWAMP RFC when Session Sender/Receiver are - also Control Client/Server. - As for TWAMP, it permits to set Session Sender/Receiver IP to Zero Addr in Owamp Requests - from Control-Client : [X] For Session-Sender, [Y] For Session-Server. - In that case Control-Server had to switch the Zero Addr with the corresponding Session IP Addr - according the way test is done. For example when tests are done in both ways using Owamp, option [X] - tells the Control-Server to use the zero address for Control-Client in test session from Control-Client - to Control-Server and for Control-Server in test session from Control-Server to Control-client - It helps to bypass NAT on both Session Sender/Receiver. - - Option [y] to handle PAT from the Session-Remote. In that case, Session-Remote Port - is not checked. +## OWAMP: owping : +- Option [X], [Y] has been added as an extension to OWAMP RFC when Session Sender/Receiver are +also Control Client/Server. +As for TWAMP, it permits to set Session Sender/Receiver IP to Zero Addr in Owamp Requests +from Control-Client : [X] For Session-Sender, [Y] For Session-Server. +In that case Control-Server had to switch the Zero Addr with the corresponding Session IP Addr +according the way test is done. For example when tests are done in both ways using Owamp, option [X] +tells the Control-Server to use the zero address for Control-Client in test session from Control-Client +to Control-Server and for Control-Server in test session from Control-Server to Control-client +It helps to bypass NAT on both Session Sender/Receiver. +- Option [y] to handle PAT from the Session-Remote. In that case, Session-Remote Port +is not checked. - ## twampd : - - Option [W] : has to be used now to handle Zero Addr in Twamp Request when Session Sender/Reflector - are also Control Client/Server. Control-Server had then to switch the Zero Addr with - the corresponding Control IP Addr. - It helps to bypass NAT on both Session Sender/Reflector when they are also Control Client/Server. - - Option [x] to handle PAT from the Session-Sender. In that case, Session-Sender Port - is not checked. Indeed, even with Zero Address, PAT on Session-Sender was not considered. - - Option [Y] : Such option may be used if Control-Client is not aware of NAT on Session-Reflector Side and/or - does not use zero address. In that case any Session-Reflector Address is seen as Local Address. +## twampd : +- Option [W] : has to be used now to handle Zero Addr in Twamp Request when Session Sender/Reflector +are also Control Client/Server. Control-Server had then to switch the Zero Addr with +the corresponding Control IP Addr. +It helps to bypass NAT on both Session Sender/Reflector when they are also Control Client/Server. +- Option [x] to handle PAT from the Session-Sender. In that case, Session-Sender Port +is not checked. Indeed, even with Zero Address, PAT on Session-Sender was not considered. +- Option [Y] : Such option may be used if Control-Client is not aware of NAT on Session-Reflector Side and/or +does not use zero address. In that case any Session-Reflector Address is seen as Local Address. - ## owampd : - - Option [W] has been added as an extension to OWAMP RFC when Session Sender/Receiver are - also Control Client/Server. - As for TWAMP, it permits to handle Zero Addr for Session Sender/Receiver in Owamp Requests - from Control-Client - In that case Control-Server had to switch the Zero Addr with the corresponding Session IP Addr - according the way test is done. - It helps to bypass NAT on both Session Sender/Receiver. - - Option [x] to handle PAT from the Session-Remote. In that case, Session-Remote Port - is not checked. Indeed, even with Zero Address, PAT on Session-Remote was not considered. - - Option [Y] : Such option may be used if Control-Client is not aware of NAT on Session-Local Side and/or - does not use zero address. In that case any Session-Local Address is seen as Local Address. +## owampd : +- Option [W] has been added as an extension to OWAMP RFC when Session Sender/Receiver are +also Control Client/Server. +As for TWAMP, it permits to handle Zero Addr for Session Sender/Receiver in Owamp Requests +from Control-Client +In that case Control-Server had to switch the Zero Addr with the corresponding Session IP Addr +according the way test is done. +It helps to bypass NAT on both Session Sender/Receiver. +- Option [x] to handle PAT from the Session-Remote. In that case, Session-Remote Port +is not checked. Indeed, even with Zero Address, PAT on Session-Remote was not considered. +- Option [Y] : Such option may be used if Control-Client is not aware of NAT on Session-Local Side and/or +does not use zero address. In that case any Session-Local Address is seen as Local Address. # DSCP On Control Session: - ## owping/twping - Add an option [m] to set DSCP field on Control packets (from Control Client to Server). - To reflect ToS received from Control-Client, on Linux we may have to set 1 into - /proc/sys/net/ipv4/tcp_reflect_tos on Control-Server side +## owping/twping +Add an option [m] to set DSCP field on Control packets (from Control Client to Server). +To reflect ToS received from Control-Client, on Linux we may have to set 1 into +/proc/sys/net/ipv4/tcp_reflect_tos on Control-Server side + From 21cee26f9402911c68e97e71ce38d87ff71538a7 Mon Sep 17 00:00:00 2001 From: froudaut Date: Mon, 2 Dec 2024 10:15:37 +0100 Subject: [PATCH 4/5] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5dd13309..2d1df117 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Trying to provide solutions to improve NAT/PAT Bypass : -##TWAMP, twping : +## TWAMP, twping : - option [Z] was already implemented to set Session Sender/Reflector IP to Zero Addr in Twamp Requests from Control-Client. In that case, Control-Client is also Session-Sender and Control-Server is Session-Reflector. Control-Server had then to switch the Zero Addr with @@ -10,7 +10,7 @@ It helps to bypass NAT on both Session Sender/Reflector when they are also Contr - Option [y] to handle PAT from the Session-Reflector. In that case, Session-Reflector Port is not checked. -## OWAMP: owping : +## OWAMP, owping : - Option [X], [Y] has been added as an extension to OWAMP RFC when Session Sender/Receiver are also Control Client/Server. As for TWAMP, it permits to set Session Sender/Receiver IP to Zero Addr in Owamp Requests From 4445b3be4744be81f0ceec9cd03054b9be22d7b4 Mon Sep 17 00:00:00 2001 From: froudaut Date: Mon, 2 Dec 2024 10:36:38 +0100 Subject: [PATCH 5/5] Delete README.md --- README.md | 55 ------------------------------------------------------- 1 file changed, 55 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 2d1df117..00000000 --- a/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# Trying to provide solutions to improve NAT/PAT Bypass : -## TWAMP, twping : -- option [Z] was already implemented to set Session Sender/Reflector IP to Zero Addr in Twamp -Requests from Control-Client. In that case, Control-Client is also Session-Sender and -Control-Server is Session-Reflector. Control-Server had then to switch the Zero Addr with -the corresponding Control IP Addr. -Such option is still available but now also split in 2 options : [X] For Session-Sender, -[Y] For Session-Reflector. -It helps to bypass NAT on both Session Sender/Reflector when they are also Control Client/Server. -- Option [y] to handle PAT from the Session-Reflector. In that case, Session-Reflector Port -is not checked. - -## OWAMP, owping : -- Option [X], [Y] has been added as an extension to OWAMP RFC when Session Sender/Receiver are -also Control Client/Server. -As for TWAMP, it permits to set Session Sender/Receiver IP to Zero Addr in Owamp Requests -from Control-Client : [X] For Session-Sender, [Y] For Session-Server. -In that case Control-Server had to switch the Zero Addr with the corresponding Session IP Addr -according the way test is done. For example when tests are done in both ways using Owamp, option [X] -tells the Control-Server to use the zero address for Control-Client in test session from Control-Client -to Control-Server and for Control-Server in test session from Control-Server to Control-client -It helps to bypass NAT on both Session Sender/Receiver. -- Option [y] to handle PAT from the Session-Remote. In that case, Session-Remote Port -is not checked. - -## twampd : -- Option [W] : has to be used now to handle Zero Addr in Twamp Request when Session Sender/Reflector -are also Control Client/Server. Control-Server had then to switch the Zero Addr with -the corresponding Control IP Addr. -It helps to bypass NAT on both Session Sender/Reflector when they are also Control Client/Server. -- Option [x] to handle PAT from the Session-Sender. In that case, Session-Sender Port -is not checked. Indeed, even with Zero Address, PAT on Session-Sender was not considered. -- Option [Y] : Such option may be used if Control-Client is not aware of NAT on Session-Reflector Side and/or -does not use zero address. In that case any Session-Reflector Address is seen as Local Address. - -## owampd : -- Option [W] has been added as an extension to OWAMP RFC when Session Sender/Receiver are -also Control Client/Server. -As for TWAMP, it permits to handle Zero Addr for Session Sender/Receiver in Owamp Requests -from Control-Client -In that case Control-Server had to switch the Zero Addr with the corresponding Session IP Addr -according the way test is done. -It helps to bypass NAT on both Session Sender/Receiver. -- Option [x] to handle PAT from the Session-Remote. In that case, Session-Remote Port -is not checked. Indeed, even with Zero Address, PAT on Session-Remote was not considered. -- Option [Y] : Such option may be used if Control-Client is not aware of NAT on Session-Local Side and/or -does not use zero address. In that case any Session-Local Address is seen as Local Address. - - -# DSCP On Control Session: -## owping/twping -Add an option [m] to set DSCP field on Control packets (from Control Client to Server). -To reflect ToS received from Control-Client, on Linux we may have to set 1 into -/proc/sys/net/ipv4/tcp_reflect_tos on Control-Server side -