diff options
| author | Gordon Tetlow <gordon@FreeBSD.org> | 2017-09-18 04:10:54 +0000 | 
|---|---|---|
| committer | Gordon Tetlow <gordon@FreeBSD.org> | 2017-09-18 04:10:54 +0000 | 
| commit | 4533b6d8a9b95fc043b72b3656b98e79ac839041 (patch) | |
| tree | 4ac156eafa4323886af859c09363dff43cc44106 /print-mobility.c | |
| parent | d79b843cb78484ea27f877f1541055e1a6a5a4d3 (diff) | |
Diffstat (limited to 'print-mobility.c')
| -rw-r--r-- | print-mobility.c | 46 | 
1 files changed, 27 insertions, 19 deletions
| diff --git a/print-mobility.c b/print-mobility.c index 71cc85b5bb05..feb4c98fea36 100644 --- a/print-mobility.c +++ b/print-mobility.c @@ -28,6 +28,7 @@   */  /* \summary: IPv6 mobility printer */ +/* RFC 3775 */  #ifdef HAVE_CONFIG_H  #include "config.h" @@ -35,11 +36,12 @@  #include <netdissect-stdinc.h> -#include "ip6.h"  #include "netdissect.h"  #include "addrtoname.h"  #include "extract.h" +#include "ip6.h" +  static const char tstr[] = "[|MOBILITY]";  /* Mobility header */ @@ -148,6 +150,7 @@ mobility_opt_print(netdissect_options *ndo,  				goto trunc;  			}  			/* units of 4 secs */ +			ND_TCHECK_16BITS(&bp[i+2]);  			ND_PRINT((ndo, "(refresh: %u)",  				EXTRACT_16BITS(&bp[i+2]) << 2));  			break; @@ -156,6 +159,7 @@ mobility_opt_print(netdissect_options *ndo,  				ND_PRINT((ndo, "(altcoa: trunc)"));  				goto trunc;  			} +			ND_TCHECK_128BITS(&bp[i+2]);  			ND_PRINT((ndo, "(alt-CoA: %s)", ip6addr_string(ndo, &bp[i+2])));  			break;  		case IP6MOPT_NONCEID: @@ -163,6 +167,8 @@ mobility_opt_print(netdissect_options *ndo,  				ND_PRINT((ndo, "(ni: trunc)"));  				goto trunc;  			} +			ND_TCHECK_16BITS(&bp[i+2]); +			ND_TCHECK_16BITS(&bp[i+4]);  			ND_PRINT((ndo, "(ni: ho=0x%04x co=0x%04x)",  				EXTRACT_16BITS(&bp[i+2]),  				EXTRACT_16BITS(&bp[i+4]))); @@ -241,7 +247,7 @@ mobility_print(netdissect_options *ndo,  	case IP6M_CAREOF_TEST_INIT:  		hlen = IP6M_MINLEN;  		if (ndo->ndo_vflag) { -			ND_TCHECK2(*mh, hlen + 8); +			ND_TCHECK_32BITS(&bp[hlen + 4]);  			ND_PRINT((ndo, " %s Init Cookie=%08x:%08x",  			       type == IP6M_HOME_TEST_INIT ? "Home" : "Care-of",  			       EXTRACT_32BITS(&bp[hlen]), @@ -255,7 +261,7 @@ mobility_print(netdissect_options *ndo,  		ND_PRINT((ndo, " nonce id=0x%x", EXTRACT_16BITS(&mh->ip6m_data16[0])));  		hlen = IP6M_MINLEN;  		if (ndo->ndo_vflag) { -			ND_TCHECK2(*mh, hlen + 8); +			ND_TCHECK_32BITS(&bp[hlen + 4]);  			ND_PRINT((ndo, " %s Init Cookie=%08x:%08x",  			       type == IP6M_HOME_TEST ? "Home" : "Care-of",  			       EXTRACT_32BITS(&bp[hlen]), @@ -263,7 +269,7 @@ mobility_print(netdissect_options *ndo,  		}  		hlen += 8;  		if (ndo->ndo_vflag) { -			ND_TCHECK2(*mh, hlen + 8); +			ND_TCHECK_32BITS(&bp[hlen + 4]);  			ND_PRINT((ndo, " %s Keygen Token=%08x:%08x",  			       type == IP6M_HOME_TEST ? "Home" : "Care-of",  			       EXTRACT_32BITS(&bp[hlen]), @@ -275,22 +281,23 @@ mobility_print(netdissect_options *ndo,  		ND_TCHECK(mh->ip6m_data16[0]);  		ND_PRINT((ndo, " seq#=%u", EXTRACT_16BITS(&mh->ip6m_data16[0])));  		hlen = IP6M_MINLEN; -		ND_TCHECK2(*mh, hlen + 1); -		if (bp[hlen] & 0xf0) +		ND_TCHECK_16BITS(&bp[hlen]); +		if (bp[hlen] & 0xf0) {  			ND_PRINT((ndo, " ")); -		if (bp[hlen] & 0x80) -			ND_PRINT((ndo, "A")); -		if (bp[hlen] & 0x40) -			ND_PRINT((ndo, "H")); -		if (bp[hlen] & 0x20) -			ND_PRINT((ndo, "L")); -		if (bp[hlen] & 0x10) -			ND_PRINT((ndo, "K")); +			if (bp[hlen] & 0x80) +				ND_PRINT((ndo, "A")); +			if (bp[hlen] & 0x40) +				ND_PRINT((ndo, "H")); +			if (bp[hlen] & 0x20) +				ND_PRINT((ndo, "L")); +			if (bp[hlen] & 0x10) +				ND_PRINT((ndo, "K")); +		}  		/* Reserved (4bits) */  		hlen += 1;  		/* Reserved (8bits) */  		hlen += 1; -		ND_TCHECK2(*mh, hlen + 2); +		ND_TCHECK_16BITS(&bp[hlen]);  		/* units of 4 secs */  		ND_PRINT((ndo, " lifetime=%u", EXTRACT_16BITS(&bp[hlen]) << 2));  		hlen += 2; @@ -298,14 +305,15 @@ mobility_print(netdissect_options *ndo,  	case IP6M_BINDING_ACK:  		ND_TCHECK(mh->ip6m_data8[0]);  		ND_PRINT((ndo, " status=%u", mh->ip6m_data8[0])); +		ND_TCHECK(mh->ip6m_data8[1]);  		if (mh->ip6m_data8[1] & 0x80)  			ND_PRINT((ndo, " K"));  		/* Reserved (7bits) */  		hlen = IP6M_MINLEN; -		ND_TCHECK2(*mh, hlen + 2); +		ND_TCHECK_16BITS(&bp[hlen]);  		ND_PRINT((ndo, " seq#=%u", EXTRACT_16BITS(&bp[hlen])));  		hlen += 2; -		ND_TCHECK2(*mh, hlen + 2); +		ND_TCHECK_16BITS(&bp[hlen]);  		/* units of 4 secs */  		ND_PRINT((ndo, " lifetime=%u", EXTRACT_16BITS(&bp[hlen]) << 2));  		hlen += 2; @@ -315,7 +323,7 @@ mobility_print(netdissect_options *ndo,  		ND_PRINT((ndo, " status=%u", mh->ip6m_data8[0]));  		/* Reserved */  		hlen = IP6M_MINLEN; -		ND_TCHECK2(*mh, hlen + 16); +		ND_TCHECK2(bp[hlen], 16);  		ND_PRINT((ndo, " homeaddr %s", ip6addr_string(ndo, &bp[hlen])));  		hlen += 16;  		break; @@ -332,5 +340,5 @@ mobility_print(netdissect_options *ndo,   trunc:  	ND_PRINT((ndo, "%s", tstr)); -	return(mhlen); +	return(-1);  } | 
