@@ -1349,6 +1349,7 @@ static int sender_iface(struct device *dev, struct net_pkt *pkt)
13491349 }
13501350 }
13511351
1352+ net_pkt_unref (pkt );
13521353 zassert_false (test_failed , "Fragment verify failed" );
13531354
13541355 return 0 ;
@@ -1930,11 +1931,117 @@ static void test_send_ipv6_fragment_without_hbho(void)
19301931 }
19311932}
19321933
1934+ static u8_t ipv6_reass_frag1 [] = {
1935+ 0x60 , 0x00 , 0x00 , 0x00 , 0x04 , 0xd8 , 0x2c , 0x40 ,
1936+ 0x20 , 0x01 , 0x0d , 0xb8 , 0x00 , 0x00 , 0x00 , 0x00 ,
1937+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02 ,
1938+ 0x20 , 0x01 , 0x0d , 0xb8 , 0x00 , 0x00 , 0x00 , 0x00 ,
1939+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 ,
1940+ 0x3a , 0x00 , 0x00 , 0x01 , 0x7c , 0x8e , 0x53 , 0x49 ,
1941+ 0x81 , 0x00 , 0xb1 , 0xb2 , 0x28 , 0x5b , 0x00 , 0x01
1942+ };
1943+
1944+ static u8_t ipv6_reass_frag2 [] = {
1945+ 0x60 , 0x00 , 0x00 , 0x00 , 0x00 , 0x54 , 0x2c , 0x40 ,
1946+ 0x20 , 0x01 , 0x0d , 0xb8 , 0x00 , 0x00 , 0x00 , 0x00 ,
1947+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02 ,
1948+ 0x20 , 0x01 , 0x0d , 0xb8 , 0x00 , 0x00 , 0x00 , 0x00 ,
1949+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 ,
1950+ 0x3a , 0x00 , 0x04 , 0xd0 , 0x7c , 0x8e , 0x53 , 0x49
1951+ };
1952+
19331953static void test_recv_ipv6_fragment (void )
19341954{
1935- /* TODO: Verify that we can receive individual fragments and
1936- * then reassemble them back.
1937- */
1955+ struct net_ipv6_hdr ipv6_hdr ;
1956+ struct net_pkt_cursor backup ;
1957+ struct net_pkt * pkt1 ;
1958+ struct net_pkt * pkt2 ;
1959+ u16_t total_payload_len ;
1960+ u16_t payload1_len ;
1961+ u16_t payload2_len ;
1962+ u8_t data ;
1963+ int ret ;
1964+
1965+ /* Fragment 1 */
1966+ data = 0U ;
1967+ total_payload_len = 1300U ;
1968+ payload1_len = NET_IPV6_MTU - sizeof (ipv6_reass_frag1 );
1969+ payload2_len = total_payload_len - payload1_len ;
1970+
1971+ pkt1 = net_pkt_alloc_with_buffer (iface1 , NET_IPV6_MTU , AF_UNSPEC ,
1972+ 0 , ALLOC_TIMEOUT );
1973+ zassert_not_null (pkt1 , "packet" );
1974+
1975+ net_pkt_set_family (pkt1 , AF_INET6 );
1976+ net_pkt_set_ip_hdr_len (pkt1 , sizeof (struct net_ipv6_hdr ));
1977+ net_pkt_cursor_init (pkt1 );
1978+
1979+ memcpy (& ipv6_hdr , ipv6_reass_frag1 , sizeof (struct net_ipv6_hdr ));
1980+
1981+ ret = net_pkt_write (pkt1 , ipv6_reass_frag1 ,
1982+ sizeof (struct net_ipv6_hdr ) + 1 );
1983+ zassert_true (ret == 0 , "IPv6 header append failed" );
1984+
1985+ net_pkt_cursor_backup (pkt1 , & backup );
1986+
1987+ ret = net_pkt_write (pkt1 ,
1988+ ipv6_reass_frag1 + sizeof (struct net_ipv6_hdr ) + 1 ,
1989+ sizeof (ipv6_reass_frag1 ) -
1990+ sizeof (struct net_ipv6_hdr ) - 1 );
1991+ zassert_true (ret == 0 , "IPv6 fragment header append failed" );
1992+
1993+ while (payload1_len -- ) {
1994+ ret = net_pkt_write_u8 (pkt1 , data ++ );
1995+ zassert_true (ret == 0 , "IPv6 header append failed" );
1996+ }
1997+
1998+ net_pkt_set_ipv6_fragment_start (pkt1 , sizeof (struct net_ipv6_hdr ));
1999+ net_pkt_set_overwrite (pkt1 , true);
2000+
2001+ net_pkt_cursor_restore (pkt1 , & backup );
2002+
2003+ ret = net_ipv6_handle_fragment_hdr (pkt1 , & ipv6_hdr ,
2004+ NET_IPV6_NEXTHDR_FRAG );
2005+ zassert_true (ret == NET_OK , "IPv6 frag1 reassembly failed" );
2006+
2007+ /* Fragment 2 */
2008+
2009+ pkt2 = net_pkt_alloc_with_buffer (iface1 , payload2_len +
2010+ sizeof (ipv6_reass_frag2 ),
2011+ AF_UNSPEC , 0 , ALLOC_TIMEOUT );
2012+ zassert_not_null (pkt2 , "packet" );
2013+
2014+ net_pkt_set_family (pkt2 , AF_INET6 );
2015+ net_pkt_set_ip_hdr_len (pkt2 , sizeof (struct net_ipv6_hdr ));
2016+ net_pkt_cursor_init (pkt2 );
2017+
2018+ memcpy (& ipv6_hdr , ipv6_reass_frag2 , sizeof (struct net_ipv6_hdr ));
2019+
2020+ ret = net_pkt_write (pkt2 , ipv6_reass_frag2 ,
2021+ sizeof (struct net_ipv6_hdr ) + 1 );
2022+ zassert_true (ret == 0 , "IPv6 header append failed" );
2023+
2024+ net_pkt_cursor_backup (pkt2 , & backup );
2025+
2026+ ret = net_pkt_write (pkt2 ,
2027+ ipv6_reass_frag2 + sizeof (struct net_ipv6_hdr ) + 1 ,
2028+ sizeof (ipv6_reass_frag2 ) -
2029+ sizeof (struct net_ipv6_hdr ) - 1 );
2030+ zassert_true (ret == 0 , "IPv6 fragment header append failed" );
2031+
2032+ while (payload2_len -- ) {
2033+ ret = net_pkt_write_u8 (pkt2 , data ++ );
2034+ zassert_true (ret == 0 , "IPv6 header append failed" );
2035+ }
2036+
2037+ net_pkt_set_ipv6_fragment_start (pkt2 , sizeof (struct net_ipv6_hdr ));
2038+ net_pkt_set_overwrite (pkt2 , true);
2039+
2040+ net_pkt_cursor_restore (pkt2 , & backup );
2041+
2042+ ret = net_ipv6_handle_fragment_hdr (pkt2 , & ipv6_hdr ,
2043+ NET_IPV6_NEXTHDR_FRAG );
2044+ zassert_true (ret == NET_OK , "IPv6 frag2 reassembly failed" );
19382045}
19392046
19402047void test_main (void )
0 commit comments