net: ipv6: Refactor IPv6 header length handling

Change the length to uint16_t and work with it
through standard htons/ntohs() macros.

Signed-off-by: Oleg Zhurakivskyy <oleg.zhurakivskyy@intel.com>
This commit is contained in:
Oleg Zhurakivskyy 2018-08-13 09:57:00 +03:00 committed by Jukka Rissanen
commit ac92a01f5a
13 changed files with 53 additions and 73 deletions

View file

@ -269,7 +269,7 @@ struct net_ipv6_hdr {
u8_t vtc;
u8_t tcflow;
u16_t flow;
u8_t len[2];
u16_t len;
u8_t nexthdr;
u8_t hop_limit;
struct in6_addr src;

View file

@ -1366,8 +1366,7 @@ end:
/* Set IPv6 header and UDP (if next header is) length */
len = net_pkt_get_len(pkt) - NET_IPV6H_LEN;
ipv6->len[0] = len >> 8;
ipv6->len[1] = (u8_t)len;
ipv6->len = htons(len);
if (ipv6->nexthdr == IPPROTO_UDP && udp) {
udp->len = htons(len);

View file

@ -870,8 +870,7 @@ enum net_verdict net_conn_input(enum net_ip_protocol proto, struct net_pkt *pkt)
data_len = ntohs(NET_IPV4_HDR(pkt)->len);
} else if (IS_ENABLED(CONFIG_NET_IPV6) &&
net_pkt_family(pkt) == AF_INET6) {
data_len = NET_IPV6_HDR(pkt)->len[0] * 256 +
NET_IPV6_HDR(pkt)->len[1];
data_len = ntohs(NET_IPV6_HDR(pkt)->len);
}
NET_DBG("Check %s listener for pkt %p src port %u dst port %u "

View file

@ -86,8 +86,8 @@ static inline void setup_ipv6_header(struct net_pkt *pkt, u16_t extra_len,
NET_IPV6_HDR(pkt)->tcflow = 0;
NET_IPV6_HDR(pkt)->flow = 0;
sys_put_be16(NET_ICMPH_LEN + extra_len + NET_ICMPV6_UNUSED_LEN,
NET_IPV6_HDR(pkt)->len);
NET_IPV6_HDR(pkt)->len = htons(NET_ICMPH_LEN + extra_len +
NET_ICMPV6_UNUSED_LEN);
NET_IPV6_HDR(pkt)->nexthdr = IPPROTO_ICMPV6;
NET_IPV6_HDR(pkt)->hop_limit = hop_limit;
@ -334,9 +334,8 @@ static enum net_verdict handle_echo_request(struct net_pkt *orig)
goto drop_no_pkt;
}
payload_len = sys_get_be16(NET_IPV6_HDR(orig)->len) -
sizeof(NET_ICMPH_LEN) - NET_ICMPV6_UNUSED_LEN;
payload_len = ntohs(NET_IPV6_HDR(orig)->len) - sizeof(NET_ICMPH_LEN) -
NET_ICMPV6_UNUSED_LEN;
frag = net_pkt_copy_all(orig, 0, PKT_WAIT_TIME);
if (!frag) {
goto drop;

View file

@ -786,15 +786,11 @@ int net_ipv6_finalize(struct net_pkt *pkt, u8_t next_header_proto)
}
}
#endif
net_pkt_compact(pkt);
total_len = net_pkt_get_len(pkt);
total_len = net_pkt_get_len(pkt) - sizeof(struct net_ipv6_hdr);
total_len -= sizeof(struct net_ipv6_hdr);
NET_IPV6_HDR(pkt)->len[0] = total_len >> 8;
NET_IPV6_HDR(pkt)->len[1] = total_len & 0xff;
NET_IPV6_HDR(pkt)->len = htons(total_len);
#if defined(CONFIG_NET_UDP)
if (next_header_proto == IPPROTO_UDP &&
@ -1260,8 +1256,7 @@ static void setup_headers(struct net_pkt *pkt, u8_t nd6_len,
NET_IPV6_HDR(pkt)->vtc = 0x60;
NET_IPV6_HDR(pkt)->tcflow = 0;
NET_IPV6_HDR(pkt)->flow = 0;
NET_IPV6_HDR(pkt)->len[0] = 0;
NET_IPV6_HDR(pkt)->len[1] = NET_ICMPH_LEN + nd6_len;
NET_IPV6_HDR(pkt)->len = htons(NET_ICMPH_LEN + nd6_len);
NET_IPV6_HDR(pkt)->nexthdr = IPPROTO_ICMPV6;
NET_IPV6_HDR(pkt)->hop_limit = NET_IPV6_ND_HOP_LIMIT;
@ -2143,11 +2138,11 @@ int net_ipv6_send_ns(struct net_if *iface,
}
if (is_my_address) {
u16_t len = ntohs(NET_IPV6_HDR(pkt)->len);
/* DAD */
net_ipaddr_copy(&NET_IPV6_HDR(pkt)->src,
net_ipv6_unspecified_address());
NET_IPV6_HDR(pkt)->len[1] -= llao_len;
NET_IPV6_HDR(pkt)->len = htons(len - llao_len);
} else {
if (src) {
net_ipaddr_copy(&NET_IPV6_HDR(pkt)->src, src);
@ -3344,8 +3339,7 @@ static void reassemble_packet(struct net_ipv6_reassembly *reass)
len = net_pkt_get_len(pkt) - sizeof(struct net_ipv6_hdr);
NET_IPV6_HDR(pkt)->len[0] = len >> 8;
NET_IPV6_HDR(pkt)->len[1] = len & 0xff;
NET_IPV6_HDR(pkt)->len = htons(len);
NET_DBG("New pkt %p IPv6 len is %d bytes", pkt, len);
@ -4095,7 +4089,7 @@ enum net_verdict net_ipv6_process_pkt(struct net_pkt *pkt)
{
struct net_ipv6_hdr *hdr = NET_IPV6_HDR(pkt);
int real_len = net_pkt_get_len(pkt);
int pkt_len = (hdr->len[0] << 8) + hdr->len[1] + sizeof(*hdr);
int pkt_len = ntohs(hdr->len) + sizeof(*hdr);
struct net_buf *frag;
u8_t start_of_ext, prev_hdr;
u8_t next, next_hdr;

View file

@ -480,8 +480,8 @@ u16_t net_calc_chksum(struct net_pkt *pkt, u8_t proto)
#endif
#if defined(CONFIG_NET_IPV6)
case AF_INET6:
upper_layer_len = (NET_IPV6_HDR(pkt)->len[0] << 8) +
NET_IPV6_HDR(pkt)->len[1] - net_pkt_ipv6_ext_len(pkt);
upper_layer_len = ntohs(NET_IPV6_HDR(pkt)->len) -
net_pkt_ipv6_ext_len(pkt);
sum = calc_chksum(upper_layer_len + proto,
(u8_t *)&NET_IPV6_HDR(pkt)->src,
2 * sizeof(struct in6_addr));

View file

@ -101,9 +101,7 @@ static inline void ethernet_update_length(struct net_if *iface,
if (net_pkt_family(pkt) == AF_INET) {
len = ntohs(NET_IPV4_HDR(pkt)->len);
} else {
len = ((NET_IPV6_HDR(pkt)->len[0] << 8) +
NET_IPV6_HDR(pkt)->len[1]) +
NET_IPV6H_LEN;
len = ntohs(NET_IPV6_HDR(pkt)->len) + NET_IPV6H_LEN;
}
if (len < NET_ETH_MINIMAL_FRAME_SIZE - sizeof(struct net_eth_hdr)) {

View file

@ -317,8 +317,7 @@ static void update_protocol_header_lengths(struct net_pkt *pkt, u16_t size)
{
net_pkt_set_ip_hdr_len(pkt, NET_IPV6H_LEN);
NET_IPV6_HDR(pkt)->len[0] = (size - NET_IPV6H_LEN) >> 8;
NET_IPV6_HDR(pkt)->len[1] = (u8_t) (size - NET_IPV6H_LEN);
NET_IPV6_HDR(pkt)->len = htons(size - NET_IPV6H_LEN);
if (NET_IPV6_HDR(pkt)->nexthdr == IPPROTO_UDP) {
struct net_udp_hdr hdr, *udp_hdr;

View file

@ -100,7 +100,7 @@ static size_t ecm_eth_size(void *ecm_pkt, size_t len)
ip_len = ntohs(((struct net_ipv4_hdr *)ip_data)->len);
break;
case NET_ETH_PTYPE_IPV6:
ip_len = sys_get_be16(((struct net_ipv6_hdr *)ip_data)->len);
ip_len = ntohs(((struct net_ipv6_hdr *)ip_data)->len);
break;
default:
SYS_LOG_DBG("Unknown hdr type 0x%04x", hdr->type);

View file

@ -358,8 +358,7 @@ static struct net_pkt *create_pkt(struct net_6lo_data *data)
frag->data[4] = len >> 8;
frag->data[5] = (u8_t) len;
data->ipv6.len[0] = len >> 8;
data->ipv6.len[1] = (u8_t) len;
data->ipv6.len = htons(len);
if (data->nh_udp) {
frag->data[44] = len >> 8;
@ -397,7 +396,7 @@ static struct net_6lo_data test_data_1 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x00,
.ipv6.flow = 0x00,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sam00,
@ -416,7 +415,7 @@ static struct net_6lo_data test_data_2 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x20,
.ipv6.flow = 0x3412,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sam01,
@ -435,7 +434,7 @@ static struct net_6lo_data test_data_3 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x21,
.ipv6.flow = 0x3412,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sam10,
@ -454,7 +453,7 @@ static struct net_6lo_data test_data_4 = {
.ipv6.vtc = 0x61,
.ipv6.tcflow = 0x20,
.ipv6.flow = 0x00,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sam00,
@ -473,7 +472,7 @@ static struct net_6lo_data test_data_5 = {
.ipv6.vtc = 0x61,
.ipv6.tcflow = 0x23,
.ipv6.flow = 0x4567,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sam01,
@ -492,7 +491,7 @@ static struct net_6lo_data test_data_6 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x0,
.ipv6.flow = 0x0,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sam10,
@ -511,7 +510,7 @@ static struct net_6lo_data test_data_7 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x0,
.ipv6.flow = 0x0,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = 0,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sam10,
@ -526,7 +525,7 @@ static struct net_6lo_data test_data_8 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x0,
.ipv6.flow = 0x0,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_ICMPV6,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sam10,
@ -544,7 +543,7 @@ static struct net_6lo_data test_data_9 = {
.ipv6.vtc = 0x61,
.ipv6.tcflow = 0x20,
.ipv6.flow = 0x00,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sac1_sam00,
@ -563,7 +562,7 @@ static struct net_6lo_data test_data_10 = {
.ipv6.vtc = 0x61,
.ipv6.tcflow = 0x20,
.ipv6.flow = 0x00,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sac1_sam00,
@ -582,7 +581,7 @@ static struct net_6lo_data test_data_11 = {
.ipv6.vtc = 0x61,
.ipv6.tcflow = 0x20,
.ipv6.flow = 0x00,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = 0,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sac1_sam00,
@ -597,7 +596,7 @@ static struct net_6lo_data test_data_12 = {
.ipv6.vtc = 0x61,
.ipv6.tcflow = 0x20,
.ipv6.flow = 0x00,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_ICMPV6,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sac1_sam00,
@ -615,7 +614,7 @@ static struct net_6lo_data test_data_13 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x21,
.ipv6.flow = 0x3412,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sam11,
@ -634,7 +633,7 @@ static struct net_6lo_data test_data_14 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x00,
.ipv6.flow = 0x00,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = NET_IPV6_NEXTHDR_NONE,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sac1_sam00,
@ -650,7 +649,7 @@ static struct net_6lo_data test_data_15 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x20,
.ipv6.flow = 0x3412,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sac1_sam01,
@ -669,7 +668,7 @@ static struct net_6lo_data test_data_16 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x21,
.ipv6.flow = 0x3412,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sac1_sam10,
@ -688,7 +687,7 @@ static struct net_6lo_data test_data_17 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x21,
.ipv6.flow = 0x3412,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sac1_sam11,
@ -707,7 +706,7 @@ static struct net_6lo_data test_data_18 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x20,
.ipv6.flow = 0x3412,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sam01,
@ -726,7 +725,7 @@ static struct net_6lo_data test_data_19 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x20,
.ipv6.flow = 0x3412,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sac1_sam01,
@ -745,7 +744,7 @@ static struct net_6lo_data test_data_20 = {
.ipv6.vtc = 0x61,
.ipv6.tcflow = 0x23,
.ipv6.flow = 0x4567,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sac1_sam01,
@ -763,7 +762,7 @@ static struct net_6lo_data test_data_21 = {
.ipv6.vtc = 0x61,
.ipv6.tcflow = 0x23,
.ipv6.flow = 0x4567,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sac1_sam01,
@ -782,7 +781,7 @@ static struct net_6lo_data test_data_22 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x0,
.ipv6.flow = 0x0,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sac1_sam10,
@ -801,7 +800,7 @@ static struct net_6lo_data test_data_23 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x0,
.ipv6.flow = 0x0,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = 0,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sac1_sam11,
@ -816,7 +815,7 @@ static struct net_6lo_data test_data_24 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x20,
.ipv6.flow = 0x3412,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sam00,
@ -835,7 +834,7 @@ static struct net_6lo_data test_data_25 = {
.ipv6.vtc = 0x60,
.ipv6.tcflow = 0x00,
.ipv6.flow = 0x00,
.ipv6.len = { 0x00, 0x00 },
.ipv6.len = 0,
.ipv6.nexthdr = IPPROTO_UDP,
.ipv6.hop_limit = 0xff,
.ipv6.src = src_sac1_sam00,

View file

@ -1554,8 +1554,7 @@ static void test_send_ipv6_fragment(void)
zassert_equal(pkt_data_len, count * data_len, "Data size mismatch");
total_len = net_pkt_get_len(pkt);
total_len -= sizeof(struct net_ipv6_hdr);
total_len = net_pkt_get_len(pkt) - sizeof(struct net_ipv6_hdr);
DBG("Sending %zd bytes of which ext %d and data %d bytes\n",
total_len, net_pkt_ipv6_ext_len(pkt), pkt_data_len);
@ -1563,9 +1562,7 @@ static void test_send_ipv6_fragment(void)
zassert_equal(total_len - net_pkt_ipv6_ext_len(pkt) - 8, pkt_data_len,
"Packet size invalid");
NET_IPV6_HDR(pkt)->len[0] = total_len / 256;
NET_IPV6_HDR(pkt)->len[1] = total_len -
NET_IPV6_HDR(pkt)->len[0] * 256;
NET_IPV6_HDR(pkt)->len = htons(total_len);
net_udp_set_chksum(pkt, pkt->frags);

View file

@ -247,8 +247,7 @@ static void setup_ipv6_tcp(struct net_pkt *pkt,
ipv6.vtc = 0x60;
ipv6.tcflow = 0;
ipv6.flow = 0;
ipv6.len[0] = 0;
ipv6.len[1] = NET_TCPH_LEN + sizeof(data);
ipv6.len = htons(NET_TCPH_LEN + sizeof(data));
ipv6.nexthdr = IPPROTO_TCP;
ipv6.hop_limit = 255;
@ -336,9 +335,8 @@ static void setup_ipv6_tcp_long(struct net_pkt *pkt,
ipv6.vtc = 0x60;
ipv6.tcflow = 0;
ipv6.flow = 0;
ipv6.len[0] = 0;
ipv6.len[1] = NET_TCPH_LEN + sizeof(data) +
sizeof(ipv6_hop_by_hop_ext_hdr);
ipv6.len = htons(NET_TCPH_LEN + sizeof(data) +
sizeof(ipv6_hop_by_hop_ext_hdr));
ipv6.nexthdr = 0; /* Hop-by-hop option */
ipv6.hop_limit = 255;

View file

@ -192,8 +192,7 @@ static void setup_ipv6_udp(struct net_pkt *pkt,
NET_IPV6_HDR(pkt)->vtc = 0x60;
NET_IPV6_HDR(pkt)->tcflow = 0;
NET_IPV6_HDR(pkt)->flow = 0;
NET_IPV6_HDR(pkt)->len[0] = 0;
NET_IPV6_HDR(pkt)->len[1] = NET_UDPH_LEN + strlen(payload);
NET_IPV6_HDR(pkt)->len = htons(NET_UDPH_LEN + strlen(payload));
NET_IPV6_HDR(pkt)->nexthdr = IPPROTO_UDP;
NET_IPV6_HDR(pkt)->hop_limit = 255;
@ -256,9 +255,8 @@ static void setup_ipv6_udp_long(struct net_pkt *pkt,
ipv6.vtc = 0x60;
ipv6.tcflow = 0;
ipv6.flow = 0;
ipv6.len[0] = 0;
ipv6.len[1] = NET_UDPH_LEN + strlen(payload) +
sizeof(ipv6_hop_by_hop_ext_hdr);
ipv6.len = htons(NET_UDPH_LEN + strlen(payload) +
sizeof(ipv6_hop_by_hop_ext_hdr));
ipv6.nexthdr = 0; /* HBHO */
ipv6.hop_limit = 255;