static void mpls_header_init(struct proto_hdr *hdr) { proto_lower_default_add(hdr, PROTO_ETH); proto_header_fields_add(hdr, mpls_fields, array_size(mpls_fields)); proto_hdr_field_set_default_be32(hdr, MPLS_LAST, 1); }
static void tcp_header_init(struct proto_hdr *hdr) { proto_lower_default_add(hdr, PROTO_IP4); proto_header_fields_add(hdr, tcp_fields, array_size(tcp_fields)); proto_hdr_field_set_default_be16(hdr, TCP_DOFF, 5); }
static void pause_header_init(struct proto_hdr *hdr) { uint8_t eth_dst[6] = { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x01 }; struct proto_hdr *lower; lower = proto_lower_default_add(hdr, PROTO_ETH); proto_hdr_field_set_default_bytes(lower, ETH_DST_ADDR, eth_dst); proto_header_fields_add(hdr, pause_fields, array_size(pause_fields)); proto_hdr_field_set_default_be16(hdr, PAUSE_OPCODE, 0x1); }
static void ipv6_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, ipv6_fields, array_size(ipv6_fields)); proto_hdr_field_set_default_be32(hdr, IP6_VER, 6); proto_hdr_field_set_default_dev_ipv6(hdr, IP6_SADDR); }
static void vlan_header_init(struct proto_hdr *hdr) { struct proto_hdr *lower = proto_lower_default_add(hdr, PROTO_ETH); uint16_t lower_etype = 0; proto_header_fields_add(hdr, vlan_fields, array_size(vlan_fields)); if (lower->ops->id == PROTO_ETH) lower_etype = proto_hdr_field_get_u16(lower, ETH_TYPE); else if (lower->ops->id == PROTO_VLAN) lower_etype = proto_hdr_field_get_u16(lower, VLAN_ETYPE); proto_hdr_field_set_be16(hdr, VLAN_ETYPE, lower_etype); proto_hdr_field_set_default_be16(hdr, VLAN_TPID, pid_to_eth(hdr->ops->id)); }
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 eth_header_init(struct proto_hdr *hdr) { proto_header_fields_add(hdr, eth_fields, array_size(eth_fields)); proto_hdr_field_set_default_dev_mac(hdr, ETH_SRC_ADDR); }
static void icmpv6_header_init(struct proto_hdr *hdr) { proto_lower_default_add(hdr, PROTO_IP6); proto_header_fields_add(hdr, icmpv6_fields, array_size(icmpv6_fields)); }
static void udp_header_init(struct proto_hdr *hdr) { proto_lower_default_add(hdr, PROTO_IP4); proto_header_fields_add(hdr, udp_fields, array_size(udp_fields)); }