static void arp_header_init(struct proto_hdr *hdr) { struct proto_hdr *lower = proto_lower_default_add(hdr, PROTO_ETH); if (lower->ops->id == PROTO_ETH) { const uint8_t bcast[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; proto_hdr_field_set_default_bytes(lower, ETH_DST_ADDR, bcast); } proto_header_fields_add(hdr, arp_fields, array_size(arp_fields)); /* Generate Announce request by default */ proto_hdr_field_set_default_be16(hdr, ARP_HTYPE, ARPHRD_ETHER); proto_hdr_field_set_default_be16(hdr, ARP_PTYPE, ETH_P_IP); proto_hdr_field_set_default_u8(hdr, ARP_HLEN, 6); proto_hdr_field_set_default_u8(hdr, ARP_PLEN, 4); proto_hdr_field_set_default_be16(hdr, ARP_OPER, ARPOP_REQUEST); proto_hdr_field_set_default_dev_mac(hdr, ARP_SHA); proto_hdr_field_set_default_dev_ipv4(hdr, ARP_SPA); proto_hdr_field_set_default_dev_ipv4(hdr, ARP_TPA); }
static void ipv4_header_init(struct proto_hdr *hdr) { struct dev_io *dev = proto_dev_get(); /* In case of tun interface we do not need to create Ethernet header */ if (!dev_io_is_netdev(dev) || device_type(dev_io_name_get(dev)) != ARPHRD_NONE) proto_lower_default_add(hdr, PROTO_ETH); proto_header_fields_add(hdr, ipv4_fields, array_size(ipv4_fields)); proto_hdr_field_set_default_u8(hdr, IP4_VER, 4); proto_hdr_field_set_default_u8(hdr, IP4_IHL, 5); proto_hdr_field_set_default_dev_ipv4(hdr, IP4_SADDR); }