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)); }
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)); }
int net_ipv4_finalize_raw(struct net_pkt *pkt, u8_t next_header) { /* Set the length of the IPv4 header */ size_t total_len; net_pkt_compact(pkt); total_len = net_pkt_get_len(pkt); NET_IPV4_HDR(pkt)->len[0] = total_len / 256; NET_IPV4_HDR(pkt)->len[1] = total_len - NET_IPV4_HDR(pkt)->len[0] * 256; NET_IPV4_HDR(pkt)->chksum = 0; NET_IPV4_HDR(pkt)->chksum = ~net_calc_chksum_ipv4(pkt); #if defined(CONFIG_NET_UDP) if (next_header == IPPROTO_UDP) { NET_UDP_HDR(pkt)->chksum = 0; NET_UDP_HDR(pkt)->chksum = ~net_calc_chksum_udp(pkt); } #endif #if defined(CONFIG_NET_TCP) if (next_header == IPPROTO_TCP) { NET_TCP_HDR(pkt)->chksum = 0; NET_TCP_HDR(pkt)->chksum = ~net_calc_chksum_tcp(pkt); } #endif return 0; }
static inline void set_dst_addr(sa_family_t family, struct net_pkt *pkt, struct sockaddr *dst_addr) { net_ipaddr_copy(&net_sin6(dst_addr)->sin6_addr, &NET_IPV6_HDR(pkt)->src); net_sin6(dst_addr)->sin6_family = AF_INET6; net_sin6(dst_addr)->sin6_port = NET_UDP_HDR(pkt)->src_port; }
static inline void set_dst_addr(sa_family_t family, struct net_pkt *pkt, struct sockaddr *dst_addr) { #if defined(CONFIG_NET_IPV6) if (family == AF_INET6) { net_ipaddr_copy(&net_sin6(dst_addr)->sin6_addr, &NET_IPV6_HDR(pkt)->src); net_sin6(dst_addr)->sin6_family = AF_INET6; net_sin6(dst_addr)->sin6_port = NET_UDP_HDR(pkt)->src_port; } #endif /* CONFIG_NET_IPV6) */ #if defined(CONFIG_NET_IPV4) if (family == AF_INET) { net_ipaddr_copy(&net_sin(dst_addr)->sin_addr, &NET_IPV4_HDR(pkt)->src); net_sin(dst_addr)->sin_family = AF_INET; net_sin(dst_addr)->sin_port = NET_UDP_HDR(pkt)->src_port; } #endif /* CONFIG_NET_IPV6) */ }
static void set_client_address(struct sockaddr *addr, struct net_pkt *rx_pkt) { net_ipaddr_copy(&net_sin6(addr)->sin6_addr, &NET_IPV6_HDR(rx_pkt)->src); net_sin6(addr)->sin6_family = AF_INET6; net_sin6(addr)->sin6_port = NET_UDP_HDR(rx_pkt)->src_port; }