static void setup_ipv4_udp(struct net_pkt *pkt, struct in_addr *remote_addr, struct in_addr *local_addr, u16_t remote_port, u16_t local_port) { NET_IPV4_HDR(pkt)->vhl = 0x45; NET_IPV4_HDR(pkt)->tos = 0; NET_IPV4_HDR(pkt)->len[0] = 0; NET_IPV4_HDR(pkt)->len[1] = NET_UDPH_LEN + sizeof(struct net_ipv4_hdr) + strlen(payload); NET_IPV4_HDR(pkt)->proto = IPPROTO_UDP; net_ipaddr_copy(&NET_IPV4_HDR(pkt)->src, remote_addr); net_ipaddr_copy(&NET_IPV4_HDR(pkt)->dst, local_addr); net_pkt_set_ip_hdr_len(pkt, sizeof(struct net_ipv4_hdr)); net_pkt_set_ipv6_ext_len(pkt, 0); net_buf_add(pkt->frags, net_pkt_ip_hdr_len(pkt) + sizeof(struct net_udp_hdr)); NET_UDP_HDR(pkt)->src_port = htons(remote_port); NET_UDP_HDR(pkt)->dst_port = htons(local_port); net_buf_add_mem(pkt->frags, payload, strlen(payload)); }
struct net_pkt *net_ipv4_create_raw(struct net_pkt *pkt, const struct in_addr *src, const struct in_addr *dst, struct net_if *iface, u8_t next_header) { struct net_buf *header; header = net_pkt_get_frag(pkt, K_FOREVER); net_pkt_frag_insert(pkt, header); NET_IPV4_HDR(pkt)->vhl = 0x45; NET_IPV4_HDR(pkt)->tos = 0x00; NET_IPV4_HDR(pkt)->proto = 0; NET_IPV4_HDR(pkt)->ttl = net_if_ipv4_get_ttl(iface); NET_IPV4_HDR(pkt)->offset[0] = NET_IPV4_HDR(pkt)->offset[1] = 0; NET_IPV4_HDR(pkt)->id[0] = NET_IPV4_HDR(pkt)->id[1] = 0; net_ipaddr_copy(&NET_IPV4_HDR(pkt)->dst, dst); net_ipaddr_copy(&NET_IPV4_HDR(pkt)->src, src); NET_IPV4_HDR(pkt)->proto = next_header; net_pkt_set_ip_hdr_len(pkt, sizeof(struct net_ipv4_hdr)); net_pkt_set_family(pkt, AF_INET); net_buf_add(header, sizeof(struct net_ipv4_hdr)); return pkt; }
static void setup_ipv6_udp(struct net_pkt *pkt, struct in6_addr *remote_addr, struct in6_addr *local_addr, u16_t remote_port, u16_t local_port) { 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)->nexthdr = IPPROTO_UDP; NET_IPV6_HDR(pkt)->hop_limit = 255; net_ipaddr_copy(&NET_IPV6_HDR(pkt)->src, remote_addr); net_ipaddr_copy(&NET_IPV6_HDR(pkt)->dst, local_addr); net_pkt_set_ip_hdr_len(pkt, sizeof(struct net_ipv6_hdr)); net_pkt_set_ipv6_ext_len(pkt, 0); net_buf_add(pkt->frags, net_pkt_ip_hdr_len(pkt) + sizeof(struct net_udp_hdr)); NET_UDP_HDR(pkt)->src_port = htons(remote_port); NET_UDP_HDR(pkt)->dst_port = htons(local_port); net_buf_add_mem(pkt->frags, payload, strlen(payload)); }
static void setup_ipv6_udp_long(struct net_pkt *pkt, struct in6_addr *remote_addr, struct in6_addr *local_addr, u16_t remote_port, u16_t local_port) { struct net_udp_hdr hdr, *udp_hdr; struct net_ipv6_hdr ipv6; 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.nexthdr = 0; /* HBHO */ ipv6.hop_limit = 255; net_ipaddr_copy(&ipv6.src, remote_addr); net_ipaddr_copy(&ipv6.dst, local_addr); net_pkt_set_ip_hdr_len(pkt, sizeof(struct net_ipv6_hdr)); hdr.src_port = htons(remote_port); hdr.dst_port = htons(local_port); net_pkt_append_all(pkt, sizeof(ipv6), (u8_t *)&ipv6, K_FOREVER); net_pkt_append_all(pkt, sizeof(ipv6_hop_by_hop_ext_hdr), ipv6_hop_by_hop_ext_hdr, K_FOREVER); net_pkt_append_all(pkt, sizeof(hdr), (u8_t *)&hdr, K_FOREVER); net_pkt_append_all(pkt, strlen(payload), (u8_t *)payload, K_FOREVER); net_pkt_set_ipv6_ext_len(pkt, sizeof(ipv6_hop_by_hop_ext_hdr)); udp_hdr = net_udp_get_hdr(pkt, &hdr); /**TESTPOINT: Check if pointer is valid*/ zassert_equal_ptr(udp_hdr, &hdr, "Invalid UDP header pointer"); udp_hdr->src_port = htons(remote_port); udp_hdr->dst_port = htons(local_port); net_udp_set_hdr(pkt, &hdr); udp_hdr = net_udp_get_hdr(pkt, &hdr); if (udp_hdr != &hdr) { TC_ERROR("Invalid UDP header pointer %p\n", udp_hdr); zassert_true(0, "exiting"); } if (udp_hdr->src_port != htons(remote_port)) { TC_ERROR("Invalid remote port, should have been %d was %d\n", remote_port, ntohs(udp_hdr->src_port)); zassert_true(0, "exiting"); } if (udp_hdr->dst_port != htons(local_port)) { TC_ERROR("Invalid local port, should have been %d was %d\n", local_port, ntohs(udp_hdr->dst_port)); zassert_true(0, "exiting"); } net_hexdump_frags("frag", pkt); }
enum net_verdict net_ipv4_process_pkt(struct net_pkt *pkt) { struct net_ipv4_hdr *hdr = NET_IPV4_HDR(pkt); int real_len = net_pkt_get_len(pkt); int pkt_len = (hdr->len[0] << 8) + hdr->len[1]; enum net_verdict verdict = NET_DROP; if (real_len != pkt_len) { NET_DBG("IPv4 packet size %d pkt len %d", pkt_len, real_len); goto drop; } #if defined(CONFIG_NET_DEBUG_IPV4) do { char out[sizeof("xxx.xxx.xxx.xxx")]; snprintk(out, sizeof(out), "%s", net_sprint_ipv4_addr(&hdr->dst)); NET_DBG("IPv4 packet received from %s to %s", net_sprint_ipv4_addr(&hdr->src), out); } while (0); #endif /* CONFIG_NET_DEBUG_IPV4 */ net_pkt_set_ip_hdr_len(pkt, sizeof(struct net_ipv4_hdr)); if (!net_is_my_ipv4_addr(&hdr->dst)) { #if defined(CONFIG_NET_DHCPV4) if (hdr->proto == IPPROTO_UDP && net_ipv4_addr_cmp(&hdr->dst, net_ipv4_broadcast_address())) { verdict = net_conn_input(IPPROTO_UDP, pkt); if (verdict != NET_DROP) { return verdict; } } #endif NET_DBG("IPv4 packet in pkt %p not for me", pkt); goto drop; } switch (hdr->proto) { case IPPROTO_ICMP: verdict = process_icmpv4_pkt(pkt, hdr); break; case IPPROTO_UDP: verdict = net_conn_input(IPPROTO_UDP, pkt); break; case IPPROTO_TCP: verdict = net_conn_input(IPPROTO_TCP, pkt); break; } if (verdict != NET_DROP) { return verdict; } drop: net_stats_update_ipv4_drop(); return NET_DROP; }