X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Tools%2FNetTest_Runner%2Fip.c;h=13de5bc724ae3a27391cded4b4b9203275dda663;hb=9c4eedf4893f851bd1ba60ce541c8d098a9ef7f7;hp=bebcf73924ad1cd4bbc7faa06a972baf7a0ea73a;hpb=50a98c40481c6d1df267f4631228e9a4d107fe74;p=tpg%2Facess2.git diff --git a/Tools/NetTest_Runner/ip.c b/Tools/NetTest_Runner/ip.c index bebcf739..13de5bc7 100644 --- a/Tools/NetTest_Runner/ip.c +++ b/Tools/NetTest_Runner/ip.c @@ -25,8 +25,10 @@ typedef struct { // === CODE === uint16_t IP_Checksum(uint16_t Prev, size_t Length, const void *Data) { + //test_trace_hexdump("IP Checksum", Data, Length); + const uint16_t *words = Data; - uint32_t ret = ~Prev; + uint32_t ret = 0; for( int i = 0; i < Length/2; i ++ ) { ret += ntohs(*words); @@ -38,6 +40,12 @@ uint16_t IP_Checksum(uint16_t Prev, size_t Length, const void *Data) while( ret >> 16 ) ret = (ret & 0xFFFF) + (ret >> 16); + //test_trace("IP Checksum = %04x + 0x%x", ret, (~Prev) & 0xFFFF); + + ret += (~Prev) & 0xFFFF; + while( ret >> 16 ) + ret = (ret & 0xFFFF) + (ret >> 16); + return ~ret; } @@ -84,7 +92,7 @@ void IP_Send(int IfNum, int AF, const void *Src, const void *Dst, uint8_t proto, } } -bool IP_Pkt_Check(size_t len, const void *data, size_t *ofs_out, int AF, const void *Src, const void *Dst, uint8_t proto) +bool IP_Pkt_Check(size_t len, const void *data, size_t *ofs_out, size_t *len_out, int AF, const void *Src, const void *Dst, uint8_t proto) { size_t ofs; if( AF == 4 ) { @@ -94,8 +102,21 @@ bool IP_Pkt_Check(size_t len, const void *data, size_t *ofs_out, int AF, const v tIPv4Hdr hdr; memcpy(&hdr, (const uint8_t*)data + ofs, sizeof(hdr)); TEST_ASSERT_REL(hdr.VerLen >> 4, ==, 4); - - return false; + TEST_ASSERT_REL(IP_Checksum(IP_CHECKSUM_START, sizeof(hdr), &hdr), ==, 0); + + TEST_ASSERT_REL(ntohs(hdr.TotalLength), <=, len - ofs); + TEST_ASSERT_REL(ntohs(hdr.TotalLength), >, (hdr.VerLen & 0xF) * 4); + TEST_ASSERT_REL(ntohs(hdr.FragmentInfo), ==, 0); + + TEST_ASSERT_REL(hdr.TTL, >, 1); // >1 because there's no intervening hops + TEST_ASSERT_REL(hdr.Protocol, ==, proto); + + if(Src) TEST_ASSERT( memcmp(hdr.SrcAddr, Src, 4) == 0 ); + if(Dst) TEST_ASSERT( memcmp(hdr.DstAddr, Dst, 4) == 0 ); + + *len_out = ntohs(hdr.TotalLength) - sizeof(hdr); + *ofs_out = ofs + (hdr.VerLen & 0xF) * 4; + return true; } else { TEST_WARN("Invalid AF(%i) in IP_Pkt_Check", AF);