#ifndef _FLWD_NET_H_ #define _FLWD_NET_H_ 1 #include #include #include #include #include #include #include #include #include #include #include /* 定义一个flwd模块自用的头文件, 和linux BSD风格变量一样 */ struct flwd_eth_hdr{ unsigned char h_dest[ETH_ALEN]; /* destination ethernet address */ unsigned char h_source[ETH_ALEN]; /* source ethernet address */ unsigned short h_proto; /* packet type ID */ }__attribute__((packed)); typedef struct flwd_eth_hdr flwd_eth_hdr_t; typedef struct { u_short ar_hrd; /* format of hardware address */ u_short ar_pro; /* format of protocol address */ u_char ar_hln; /* length of hardware address */ u_char ar_pln; /* length of protocol addres */ u_short ar_op; /* operation type */ /* * These should implementation defined but I've hardcoded eth/IP. */ u_char ar_sha[6]; /* sender hardware address */ u_char ar_spa[4]; /* sender protocol address */ u_char ar_tha[6]; /* target hardware address */ u_char ar_tpa[4]; /* target protocol address */ }flwd_arp_hdr_t; /* * Structure of an internet header, naked of options. */ typedef struct { #if __BYTE_ORDER == __LITTLE_ENDIAN unsigned int ip_hl:4; /* header length */ unsigned int ip_v:4; /* version */ #endif #if __BYTE_ORDER == __BIG_ENDIAN unsigned int ip_v:4; /* version */ unsigned int ip_hl:4; /* header length */ #endif u_int8_t ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; /* identification */ u_short ip_off; /* fragment offset field */ #define IP_RF 0x8000 /* reserved fragment flag */ #define IP_DF 0x4000 /* dont fragment flag */ #define IP_MF 0x2000 /* more fragments flag */ #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ u_int8_t ip_ttl; /* time to live */ u_int8_t ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src, ip_dst; /* source and dest address */ }flwd_ipv4_hdr_t; /* * IPv6 packet header prototype, add by LiJia 2012-03-19. */ typedef struct{ u_int8_t ip6_flags[4]; /* version, traffic-class, flow-label */ u_int16_t ip6_payload_len; /* payload length, not contain header */ u_int8_t ip6_nxt_hdr; /* next header, same as protocol in IPv4 */ u_int8_t ip6_hop; /* hop limit, same as TTL in IPv4 */ struct in6_addr ip6_src; /* source address */ struct in6_addr ip6_dst; /* dest address */ }flwd_ipv6_hdr_t; #define FLWD_IPV4_MULTICAST_ADDR(addr) (((addr&0xF0000000)==0xE0000000)?1:0) /* * ICMP packet header prototype. // from libnet-headers.h */ typedef struct { u_char icmp_type; /* * ICMP types. */ #ifndef ICMP_ECHOREPLY #define ICMP_ECHOREPLY 0 #endif #ifndef ICMP_UNREACH #define ICMP_UNREACH 3 #endif #ifndef ICMP_SOURCEQUENCH #define ICMP_SOURCEQUENCH 4 #endif #ifndef ICMP_REDIRECT #define ICMP_REDIRECT 5 #endif #ifndef ICMP_ECHO #define ICMP_ECHO 8 #endif #ifndef ICMP_ROUTERADVERT #define ICMP_ROUTERADVERT 9 #endif #ifndef ICMP_ROUTERSOLICIT #define ICMP_ROUTERSOLICIT 10 #endif #ifndef ICMP_TIMXCEED #define ICMP_TIMXCEED 11 #endif #ifndef ICMP_PARAMPROB #define ICMP_PARAMPROB 12 #endif #ifndef ICMP_TSTAMP #define ICMP_TSTAMP 13 #endif #ifndef ICMP_TSTAMPREPLY #define ICMP_TSTAMPREPLY 14 #endif #ifndef ICMP_IREQ #define ICMP_IREQ 15 #endif #ifndef ICMP_IREQREPLY #define ICMP_IREQREPLY 16 #endif #ifndef ICMP_MASKREQ #define ICMP_MASKREQ 17 #endif #ifndef ICMP_MASKREPLY #define ICMP_MASKREPLY 18 #endif u_char icmp_code; /* * ICMP codes. */ #ifndef ICMP_UNREACH_NET #define ICMP_UNREACH_NET 0 #endif #ifndef ICMP_UNREACH_HOST #define ICMP_UNREACH_HOST 1 #endif #ifndef ICMP_UNREACH_PROTOCOL #define ICMP_UNREACH_PROTOCOL 2 #endif #ifndef ICMP_UNREACH_PORT #define ICMP_UNREACH_PORT 3 #endif #ifndef ICMP_UNREACH_NEEDFRAG #define ICMP_UNREACH_NEEDFRAG 4 #endif #ifndef ICMP_UNREACH_SRCFAIL #define ICMP_UNREACH_SRCFAIL 5 #endif #ifndef ICMP_UNREACH_NET_UNKNOWN #define ICMP_UNREACH_NET_UNKNOWN 6 #endif #ifndef ICMP_UNREACH_HOST_UNKNOWN #define ICMP_UNREACH_HOST_UNKNOWN 7 #endif #ifndef ICMP_UNREACH_ISOLATED #define ICMP_UNREACH_ISOLATED 8 #endif #ifndef ICMP_UNREACH_NET_PROHIB #define ICMP_UNREACH_NET_PROHIB 9 #endif #ifndef ICMP_UNREACH_HOST_PROHIB #define ICMP_UNREACH_HOST_PROHIB 10 #endif #ifndef ICMP_UNREACH_TOSNET #define ICMP_UNREACH_TOSNET 11 #endif #ifndef ICMP_UNREACH_TOSHOST #define ICMP_UNREACH_TOSHOST 12 #endif #ifndef ICMP_UNREACH_FILTER_PROHIB #define ICMP_UNREACH_FILTER_PROHIB 13 #endif #ifndef ICMP_UNREACH_HOST_PRECEDENCE #define ICMP_UNREACH_HOST_PRECEDENCE 14 #endif #ifndef ICMP_UNREACH_PRECEDENCE_CUTOFF #define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 #endif #ifndef ICMP_REDIRECT_NET #define ICMP_REDIRECT_NET 0 #endif #ifndef ICMP_REDIRECT_HOST #define ICMP_REDIRECT_HOST 1 #endif #ifndef ICMP_REDIRECT_TOSNET #define ICMP_REDIRECT_TOSNET 2 #endif #ifndef ICMP_REDIRECT_TOSHOST #define ICMP_REDIRECT_TOSHOST 3 #endif #ifndef ICMP_TIMXCEED_INTRANS #define ICMP_TIMXCEED_INTRANS 0 #endif #ifndef ICMP_TIMXCEED_REASS #define ICMP_TIMXCEED_REASS 1 #endif #ifndef ICMP_PARAMPROB_OPTABSENT #define ICMP_PARAMPROB_OPTABSENT 1 #endif u_short icmp_sum; union { struct { u_short id; u_short seq; }echo; #undef icmp_id #undef icmp_seq #define icmp_id hun.echo.id #define icmp_seq hun.echo.seq u_long gateway; struct { u_short pad; u_short mtu; }frag; }hun; union { struct { n_time its_otime; n_time its_rtime; n_time its_ttime; }ts; struct { struct ip idi_ip; /* options and then 64 bits of data */ }ip; u_long mask; char data[1]; #undef icmp_mask #define icmp_mask dun.mask #undef icmp_data #define icmp_data dun.data #undef icmp_otime #define icmp_otime dun.ts.its_otime #undef icmp_rtime #define icmp_rtime dun.ts.its_rtime #undef icmp_ttime #define icmp_ttime dun.ts.its_ttime }dun; }flwd_icmp_hdr_t; /* 2012-04-10 LiJia add, 标准ICMP头部定义过于复杂, 简化ICMP协议头部,适用于最常见的ECHO_REQUEST和ECHO_REPLAY. */ typedef struct{ unsigned char icmp_type; unsigned char icmp_code; unsigned short icmp_cksum; unsigned short icd_id; unsigned short icd_seq; //char echo_data[......]; }flwd_simple_icmp_hdr_t; #ifndef TH_FIN #define TH_FIN 0x01 #endif #ifndef TH_SYN #define TH_SYN 0x02 #endif #ifndef TH_RST #define TH_RST 0x04 #endif #ifndef TH_PUSH #define TH_PUSH 0x08 #endif #ifndef TH_ACK #define TH_ACK 0x10 #endif #ifndef TH_URG #define TH_URG 0x20 #endif typedef struct{ u_int16_t th_sport; /* source port */ u_int16_t th_dport; /* destination port */ u_int32_t th_seq; /* sequence number */ u_int32_t th_ack; /* acknowledgement number */ #if __BYTE_ORDER == __LITTLE_ENDIAN u_int8_t th_x2:4, /* (unused) */ th_off:4; /* data offset */ #elif __BYTE_ORDER == __BIG_ENDIAN u_int8_t th_off:4, /* data offset */ th_x2:4; /* (unused) */ #else #error "Please check " #endif u_int8_t th_flags; /* control flags */ u_int16_t th_win; /* window */ u_int16_t th_sum; /* checksum */ u_int16_t th_urp; /* urgent pointer */ }flwd_tcp_hdr_t; /* * UDP packet header prototype. */ typedef struct{ u_int16_t uh_sport; /* soure port */ u_int16_t uh_dport; /* destination port */ u_int16_t uh_ulen; /* length */ u_int16_t uh_sum; /* checksum */ }flwd_udp_hdr_t; /* 标准vxlan定义 */ typedef struct{ unsigned char flags; /*------------byte delim -------*/ unsigned char reserved[3]; /*--------int delim -------*/ unsigned char vlan_id_half_high; unsigned char link_layer_type : 4; /* 二层报文封装格式 */ unsigned char vlan_id_half_low : 4; unsigned int online_test : 1; unsigned int link_id : 6; unsigned int dir : 1; unsigned int r7 : 1; unsigned int r6 : 1; unsigned int r5 : 1; unsigned int r4 : 1; unsigned int vni_flag : 1; unsigned int r2 : 1; unsigned int r1 : 1; unsigned int r0 : 1; }__vxlan_standard_hdr_t; /* 此结构定义与标准vxlan(RFC7348) __vxlan_standard_hdr_t 不同, 使用了某些预留字段, 仅用于access和forward网关之间内部通讯, 不和真正的gdev相关, 所以某些值可以随意使用. */ typedef struct{ unsigned char flags; /*------------byte delim -------*/ unsigned char reserved[3]; /*--------int delim -------*/ unsigned char vlan_id_half_high; unsigned char link_layer_type : 4; /* 二层报文封装格式 */ unsigned char vlan_id_half_low : 4; unsigned int online_test : 1; unsigned int link_id : 6; unsigned int dir : 1; unsigned int r7 : 1; unsigned int r6 : 1; unsigned int r5 : 1; unsigned int r4 : 1; unsigned int vni_flag : 1; unsigned int r2 : 1; unsigned int r1 : 1; unsigned int first_pkt_per_stream : 1; /* 此变量复用, 表示是一个流的首包, 用于access通知fwd网关 */ }flwd_vxlan_hdr_t; #define FLWD_VXLAN_OUTER_PACKET_LEN (sizeof(flwd_eth_hdr_t)+sizeof(flwd_ipv4_hdr_t)+sizeof(flwd_udp_hdr_t) + sizeof(flwd_vxlan_hdr_t)) #endif