diff options
Diffstat (limited to 'src/mesa_net.h')
| -rw-r--r-- | src/mesa_net.h | 885 |
1 files changed, 885 insertions, 0 deletions
diff --git a/src/mesa_net.h b/src/mesa_net.h new file mode 100644 index 0000000..f0319f8 --- /dev/null +++ b/src/mesa_net.h @@ -0,0 +1,885 @@ +#ifndef _MESA_NET_H_ +#define _MESA_NET_H_ + +#include <stdio.h> +#include <endian.h> +#include <netinet/in.h> +#include <netinet/ip_icmp.h> +#include <netinet/in_systm.h> +#include <linux/ppp_defs.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define BYTE_ALIGNED(n) __attribute__((packed, aligned(n))) + + +#define SENDPACKET_ARP_H 0x1c /* ARP header: 28 bytes */ +#define SENDPACKET_ETH_H 0xe /* Etherner header: 14 bytes */ +#define SENDPACKET_IP_H 0x14 /* IP header: 20 bytes */ +/* See sendpacket-ospf.h for OSPF related header sizes */ +#define SENDPACKET_RIP_H 0x18 /* RIP header base: 24 bytes */ +#define SENDPACKET_TCP_H 0x14 /* TCP header: 20 bytes */ +#define SENDPACKET_UDP_H 0x8 /* UDP header: 8 bytes */ + +/* + * Ethernet packet header prototype. Too many O/S's define this differently. + * Easy enough to solve that and define it here. + */ +#ifndef ETHER_ADDR_LEN +#define ETHER_ADDR_LEN 6 +#endif +#define ETHERTYPE_PUP 0x0200 /* PUP protocol */ +#define ETHERTYPE_IP 0x0800 /* IP protocol */ +#define ETHERTYPE_IPv6 0x86dd /* IPv6 protocol */ +#define ETHERTYPE_ARP 0x0806 /* Addr. resolution protocol */ +#define ETHERTYPE_REVARP 0x8035 /* reverse Addr. resolution protocol */ +#define ETHERTYPE_VLAN 0x8100 /* IEEE 802.1Q VLAN tagging */ +#define ETHERTYPE_LOOPBACK 0x9000 /* used to test interfaces */ + +//#define ETH_P_8021AD 0x88A8 +//#define ETHERTYPE_PANGU_MAC_IN_MAC 0x88A8 /* 2018-08-16 lijia add, for pangu MAC-in-MAC */ + + + +#define ETHERNET_HDR_LEN (14) +struct mesa_ethernet_hdr +{ + u_int8_t ether_dhost[ETHER_ADDR_LEN]; /* destination ethernet address */ + u_int8_t ether_shost[ETHER_ADDR_LEN]; /* source ethernet address */ + u_int16_t ether_type; /* packet type ID */ +}BYTE_ALIGNED(1); + + +/* + * IPv4 packet header prototype. + */ +#ifndef IP_RF +#define IP_RF 0x8000 /* reserved fragment flag */ +#endif +#ifndef IP_DF +#define IP_DF 0x4000 /* dont fragment flag */ +#endif +#ifndef IP_MF +#define IP_MF 0x2000 /* more fragments flag */ +#endif +#ifndef IP_OFFMASK +#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ +#endif + + +#define IPPROTO_L2TPV3 (115) /* L2TPv3, RFC3931-page17 */ + +struct mesa_ip4_hdr +{ +#if __BYTE_ORDER == __LITTLE_ENDIAN + u_int8_t ip_hl:4, /* header length */ + ip_v:4; /* version */ +#elif __BYTE_ORDER == __BIG_ENDIAN + u_int8_t ip_v:4, /* version */ + ip_hl:4; /* header length */ +#else +#error "Please check <endian.h>" +#endif + u_int8_t ip_tos; /* type of service */ + u_int16_t ip_len; /* total length */ + u_int16_t ip_id; /* identification */ + u_int16_t ip_off; + u_int8_t ip_ttl; /* time to live */ + u_int8_t ip_p; /* protocol */ + u_int16_t ip_sum; /* checksum */ + struct in_addr ip_src, ip_dst; /* source and dest address */ +}; + + +/* + * ARP packet header prototype. Too many O/S's define this differently. + * Easy enough to solve that and define it here. + */ +#define ARPOP_REQUEST 1 /* req to resolve address */ +#define ARPOP_REPLY 2 /* resp to previous request */ +#define ARPOP_REVREQUEST 3 /* req protocol address given hardware */ +#define ARPOP_REVREPLY 4 /* resp giving protocol address */ +#define ARPOP_INVREQUEST 8 /* req to identify peer */ +#define ARPOP_INVREPLY 9 /* resp identifying peer */ + + +#define ARPHRD_ETHER 1 /* ethernet hardware format */ +struct mesa_arp_hdr +{ + 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 */ +}; + + +/* + * IPv6 packet header prototype, add by LiJia 2012-03-19. + */ +struct mesa_ip6_hdr +{ + 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 */ +}; + + +struct mesa_icmp_echo_hdr{ + unsigned char icmp_type; + unsigned char icmp_code; + unsigned short icmp_cksum; + unsigned short icd_id; + unsigned short icd_seq; + //char echo_data[]; +}; + + +/* + * ICMP packet header prototype. // from libnet-headers.h + */ +struct mesa_icmp_hdr +{ + 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; + +}; + +/* + * TCP packet header prototype. + */ +#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 +struct mesa_tcp_hdr +{ + 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 <endian.h>" +#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 */ +}; + + +/* + * UDP packet header prototype. + */ +struct mesa_udp_hdr +{ + 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 */ +}; + + +#define PPPOE_HDR_LEN (sizeof(struct mesa_pppoe_session_hdr)) +#define PPP_PROTOCOL_PAD (0x0001) +#define PPP_PROTOCOL_IPv4 (0x0021) +#define PPP_PROTOCOL_PAP (0xC023) +#define PPP_PROTOCOL_CHAP (0xC223) +#define PPP_PROTOCOL_IPv6 (0x0057) +#define PPP_COMPRESS_DATA (0x00FD) + +#define PPP_PROTOCOL_LCP (0xC021) +#define PPP_PROTOCOL_CCP (0x80FD) +#define PPP_PROTOCOL_IPCP (0x8021) + +struct mesa_pppoe_session_hdr{ +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned int ver:4; + unsigned int type:4; +#elif __BYTE_ORDER == __BIG_ENDIAN + unsigned int type:4; + unsigned int ver:4; +#else +#error "Please check <endian.h>" +#endif + unsigned char code; + unsigned short session_id; + unsigned short len; + /* to do: + pppӦ�õ�����Ϊһ�����, Ϊ�˼���, ǿ�ƽ����PPPOE_SES����һ��, + �����Ҫ����PPPЭ�̹���, �˽ṹ��Ҫ�Ķ�. + */ + unsigned short ppp_protocol; +}BYTE_ALIGNED(1); + + +struct mesa_ppp_hdr{ + unsigned char address; + unsigned char control; + unsigned short protocol; +}BYTE_ALIGNED(1); + +#define PPP_LCP_CODE_REQUEST (1) +#define PPP_LCP_CODE_ACK (2) +#define PPP_LCP_CODE_NAK (3) +#define PPP_LCP_CODE_REJECT (4) +#define PPP_LCP_CODE_TERMINATE_REQ (5) +#define PPP_LCP_CODE_TERMINATE_ACK (6) + +/* refer to RFC1661 */ +#define PPP_LCP_OPT_RESERVED (0) +#define PPP_LCP_OPT_MAX_RCV_UNIT (1) +#define PPP_LCP_OPT_AUTH_PRO (3) +#define PPP_LCP_OPT_QA_PRO (4) +#define PPP_LCP_OPT_MAGIC (5) +#define PPP_LCP_OPT_PRO_FIELD_COMPRESS (7) +#define PPP_LCP_OPT_ADDR_CTRL_FIELD_COMPRESS (8) + +#define PPP_LCP_OPT_AUTH_PRO_PAP (0xC023) +#define PPP_LCP_OPT_AUTH_PRO_CHAP (0xC223) + +#define PPP_LCP_OPT_AUTH_PRO_CHAP_ALGO_MS_CHAP_V2 (0x81) +#define PPP_LCP_OPT_AUTH_PRO_CHAP_ALGO_CHAP_MD5 (0x05) + + +/* refer to RFC1962 Page6 */ +#define PPP_CCP_OPT_OUI (0) +#define PPP_CCP_OPT_MS_PPC (18) + +struct mesa_ppp_lcp_ack_hdr{ /* RFC1661-Page29 */ + unsigned char code; + unsigned char identifier; + unsigned short length; +}BYTE_ALIGNED(1); + +struct mesa_ppp_ccp_ack_hdr{ /* RFC1661-Page29 */ + unsigned char code; + unsigned char identifier; + unsigned short length; +}BYTE_ALIGNED(1); + +#define PPP_CHAP_CHALLENGE (1) +#define PPP_CHAP_RESPONSE (2) +#define PPP_CHAP_SUCCESS (3) +#define PPP_CHAP_FAILURE (4) + +struct mesa_ppp_chap_hdr{ + unsigned char code; + unsigned char identifier; + unsigned short length; +}BYTE_ALIGNED(1); + +struct mesa_ppp_ipcp_ack_hdr{ + unsigned char code; + unsigned char identifier; + unsigned short length; +}BYTE_ALIGNED(1); + +enum pptp_control_message_type{ + PPTP_CTRL_START_CONN_REQ = 1, + PPTP_CTRL_START_CONN_REPLY = 2, + PPTP_CTRL_STOP_CONN_REQ = 3, + PPTP_CTRL_STOP_CONN_REPLY = 4, + PPTP_CTRL_ECHO_REQ = 5, + PPTP_CTRL_ECHO_REPLY = 6, + PPTP_CTRL_OUT_GO_REQ = 7, + PPTP_CTRL_OUT_GO_REPLY = 8, + PPTP_CTRL_IN_CALL_REQ = 9, + PPTP_CTRL_IN_CALL_REPLY = 10, + PPTP_CTRL_IN_CALL_CONN = 11, + PPTP_CTRL_CALL_CLEAR_REQ = 12, + PPTP_CTRL_CALL_DISCONN_NOTIFY = 13, + PPTP_CTRL_WAN_ERROR_NOTIFY = 14, + PPTP_CTRL_SET_LINK_INFO = 15, +}; + +struct mesa_pptp_control_hdr{ + unsigned short length; /* ȫ�����ݳ���, ������ͷ�� */ + unsigned short pptp_message_type; + unsigned int magic_cookie; + unsigned short control_message_type; + char ignore_bytes[0]; /* �����ֶ��ݲ�����, ����Ҳ��һ�� */ +}; + +struct mesa_vlan_hdr{ + unsigned short pri_cfi_id; + unsigned short type; +}; + +struct mesa_vlan_detail_hdr{ + unsigned char vlan_id_high:4; + unsigned char del_flag:1; + unsigned char priority:3; + unsigned char vlan_id_low; + unsigned short type; +}; + +/* 2018-08-28 lijia add, for pangu ��Ŀmac_in_mac���� */ +struct mesa_mac_in_mac_net_hdr{ + unsigned int route_dir:1; + unsigned int link_id:3; + unsigned int dev_id:6; + unsigned int region_id:5; + unsigned int __pad1:1; + unsigned int encap_type:4; + unsigned int __pad2:20; + unsigned int __pad3:8; +}; + + +#define GRE_PRO_IPV4 (0x0800) +#define GRE_PRO_IPV6 (0x86DD) +#define GRE_PRO_ARP (0x0806) +#define GRE_PRO_PPP (0x880B) + +struct mesa_gre_base_hdr_v0{ +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned char recur:3; + unsigned char strict_src_route_flag:1; + unsigned char seq_flag:1; + unsigned char key_flag:1; + unsigned char route_flag:1; + unsigned char checksum_flag:1; + + unsigned char version:3; + unsigned char flags:5; /* version 0 flags is 5 bit */ +#elif __BYTE_ORDER == __BIG_ENDIAN + unsigned char checksum_flag:1; + unsigned char route_flag:1; + unsigned char key_flag:1; + unsigned char seq_flag:1; + unsigned char strict_src_route_flag:1; + unsigned char recur:3; + + unsigned char flags:5; /* version 0 flags is 5 bit */ + unsigned char version:3; +#else +#error "Please check <endian.h>" +#endif + unsigned short protocol; +}; + +struct mesa_gre_base_hdr_v1{ +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned char recur:3; + unsigned char strict_src_route_flag:1; + unsigned char seq_flag:1; + unsigned char key_flag:1; + unsigned char route_flag:1; + unsigned char checksum_flag:1; + + unsigned char version:3; + unsigned char flags:4; /* version 1 flags is 4 bit */ + unsigned char ack_flag:1; + +#elif __BYTE_ORDER == __BIG_ENDIAN + unsigned char checksum_flag:1; + unsigned char route_flag:1; + unsigned char key_flag:1; + unsigned char seq_flag:1; + unsigned char strict_src_route_flag:1; + unsigned char recur:3; + + unsigned char ack_flag:1; + unsigned char flags:4; /* version 1 flags is 4 bit */ + unsigned char version:3; +#else +#error "Please check <endian.h>" +#endif + unsigned short protocol; +}; + +#define GRE_SRE_MAX_LEN (256) /* �����Ϊһ���ֽ�, 256 */ +struct gre_source_route_entry_hdr{ + unsigned short address_family; + unsigned char sre_offset; + unsigned char sre_length; + unsigned char sre_entry_list[GRE_SRE_MAX_LEN]; +}; + +/* ���п��ܵ�ֵ����, ��Ҫ����mesa_gre_base_hdr����bit��ֵ, �ж��Ƿ�������ֵ */ +struct mesa_gre_extend_hdr{ + unsigned short checksum; //version0 + unsigned short offset; //version0, if checksum present, then offset also present + unsigned short payload_len; //version1 + unsigned short call_id; //version1 + unsigned int key; //version0 + unsigned int seq_num; //version0 and version1 + unsigned int ack_num; //version1 + //struct gre_source_route_entry_hdr sre_list; +}; + +struct mesa_gre_hdr{ + /* version0��version1��ͷ����, version�ֶ�ʱһ�µ�, ������С����, Ĭ��ʹ��v0��ʽ���� */ + struct mesa_gre_base_hdr_v0 gre_base; + struct mesa_gre_extend_hdr gre_extend; +}; + + +#define MPLS_LABEL_MASK (0xFFFFF000) +#define MPLS_EXP_MASK (0x00000E00) +#define MPLS_BLS_MASK (0x00000100) +#define MPLS_TTL_MASK (0x000000FF) +struct mesa_mpls_hdr{ +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned char mpls_label_low; + unsigned char mpls_label_mid; + unsigned char mpls_bls:1; /* bottom of label stack */ + unsigned char mpls_exp:3; + unsigned char mpls_label_high:4; + unsigned char mpls_ttl; +#elif __BYTE_ORDER == __BIG_ENDIAN + unsigned char mpls_ttl; + unsigned char mpls_label_high:4; + unsigned char mpls_exp:3; + unsigned char mpls_bls:1; /* bottom of label stack */ + unsigned short mpls_label_low; +#else +#error "Please check <endian.h>" +#endif +}; + +#define L2TP_REGISTERED_IP_PRO (115) +#define L2TP_REGISTERED_PORT (1701) + +#define L2TP_HDR_TYPE_DATA (0) +#define L2TP_HDR_TYPE_CONTROL (1) + +struct l2tp_hdr_v2{ +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned char priority:1; + unsigned char offset_present:1; + unsigned char reserved2:1; + unsigned char seq_present:1; + unsigned char reserved1:2; + unsigned char length_present:1; + unsigned char type:1; + + unsigned char version:4; + unsigned char reserved3:4; +#elif __BYTE_ORDER == __BIG_ENDIAN + unsigned char reserved3:4; + unsigned char version:4; + + unsigned char type:1; + unsigned char length_present:1; + unsigned char reserved1:2; + unsigned char seq_present:1; + unsigned char reserved2:1; + unsigned char offset_present:1; + unsigned char priority:1; +#else +#error "Please check <endian.h>" +#endif +}; + +/* refer to RFC2661-Page12 */ +#define L2TP_CTRL_MSG_RESERVED0 (0) +#define L2TP_CTRL_MSG_SCCRQ (1) +#define L2TP_CTRL_MSG_SCCRP (2) +#define L2TP_CTRL_MSG_SCCCN (3) +#define L2TP_CTRL_MSG_STOP_CCN (4) +#define L2TP_CTRL_MSG_RESERVED5 (5) +#define L2TP_CTRL_MSG_HELLO (6) +#define L2TP_CTRL_MSG_OCRQ (7) +#define L2TP_CTRL_MSG_OCRP (8) +#define L2TP_CTRL_MSG_OCCN (9) +#define L2TP_CTRL_MSG_ICRQ (10) +#define L2TP_CTRL_MSG_ICRP (11) +#define L2TP_CTRL_MSG_ICCN (12) +#define L2TP_CTRL_MSG_RESERVED13 (13) +#define L2TP_CTRL_MSG_CDN (14) +#define L2TP_CTRL_MSG_WEN (15) +#define L2TP_CTRL_MSG_SLI (16) + +#define L2TP_AVP_GET_LEN(u) (ntohs(u) & 0x3F) +struct l2tp_avp{ + unsigned short M_H_rsvd_len_union; + unsigned short vendor_id; + unsigned short attribute_type; +}BYTE_ALIGNED(1); + +/* RFC2408-Page23 */ +#define ISAKMP_PAYLOAD_TYPE_NONE (0) +#define ISAKMP_PAYLOAD_TYPE_SA (1) +#define ISAKMP_PAYLOAD_TYPE_PROPOSAL (2) +#define ISAKMP_PAYLOAD_TYPE_TRANSFORM (3) +#define ISAKMP_PAYLOAD_TYPE_KEY_EXCHANGE (4) +#define ISAKMP_PAYLOAD_TYPE_ID (5) +#define ISAKMP_PAYLOAD_TYPE_CERT (6) +#define ISAKMP_PAYLOAD_TYPE_CR (7) +#define ISAKMP_PAYLOAD_TYPE_HASH (8) +#define ISAKMP_PAYLOAD_TYPE_SIG (9) +#define ISAKMP_PAYLOAD_TYPE_NONCE (10) +#define ISAKMP_PAYLOAD_TYPE_NOTIFY (11) +#define ISAKMP_PAYLOAD_TYPE_DELETE (12) +#define ISAKMP_PAYLOAD_TYPE_VENDOR_ID (13) +#define ISAKMP_PAYLOAD_TYPE_RESERVED_BEGIN (14) /* 14 - 127 */ +#define ISAKMP_PAYLOAD_TYPE_RESERVED_END (127) /* 14 - 127 */ +#define ISAKMP_PAYLOAD_TYPE_PRIVATE_USE_BEGIN (128) /* 128-255 */ +#define ISAKMP_PAYLOAD_TYPE_PRIVATE_USE_END (255) /* 128-255 */ + +/* RFC2408-Page23 */ +#define ISAKMP_EXCHANGE_TYPE_NONE (0) +#define ISAKMP_EXCHANGE_TYPE_BASE (1) +#define ISAKMP_EXCHANGE_TYPE_ID_PROT (2) /* RFC-2409 page8, main mode is instantiation os ISAKMP Identity Protect Exchange */ +#define ISAKMP_EXCHANGE_TYPE_AUTH (3) +#define ISAKMP_EXCHANGE_TYPE_AGGRESS (4)/* RFC-2409 page8, Aggressive mode is instantiation os ISAKMP Aggressive Exchange */ +#define ISAKMP_EXCHANGE_TYPE_INFO (5) +#define ISAKMP_EXCHANGE_TYPE_FEATURE_USE_BEGIN (6) /* 6-31��ֵ�ݲ����� */ +#define ISAKMP_EXCHANGE_TYPE_FEATURE_USE_END (31) /* 6-31��ֵ�ݲ����� */ + +struct mesa_isakmp_hdr{ /* RFC2408-Page22 */ + unsigned long long init_cookie; + unsigned long long resp_cookie; + unsigned char next_payload; +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned char minor_version:4; + unsigned char major_version:4; +#elif __BYTE_ORDER == __BIG_ENDIAN + unsigned char major_version:4; + unsigned char minor_version:4; +#else +#error "Please check <endian.h>" +#endif + + unsigned char exchange_type; + unsigned char flags; + unsigned int message_id; + unsigned int length; +}; + +struct mesa_isakmp_payload_hdr{ /* RFC2408-Page22 */ + unsigned char next_payload; + unsigned char reserver; + unsigned short payload_len; +}; + +#define GTP_MSG_TYPE_T_PDU (0xFF) + +#define GTP_HDR_VER_MASK (0xE0) + +#define GTP_HDR_FLAG_NEXT_EXT_HDR (0x04) +#define GTP_HDR_FLAG_SEQ_NUM (0x02) +#define GTP_HDR_FLAG_N_PDU (0x01) + + +struct gtp_hdr{ +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned char flags; + unsigned char msg_type; + unsigned short len; + unsigned int teid; +#elif __BYTE_ORDER == __BIG_ENDIAN + unsigned int teid; + unsigned short len; + unsigned char msg_type; + unsigned char flags; +#else +#error "Please check <endian.h>" +#endif +}; + +#define TEREDO_AUTH_HDR_FLAG (0x0001) +#define TEREDO_INDICATION_HDR_FLAG (0x0000) + +#define TEREDO_INDICATION_HDR_LEN (8) + +struct teredo_auth_hdr{ +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned short flags; + unsigned char id_len; + unsigned char au_len; +#elif __BYTE_ORDER == __BIG_ENDIAN + unsigned char au_len; + unsigned char id_len; + unsigned short flags; +#else +#error "Please check <endian.h>" +#endif +}; + +#define MAX_ADDR_TYPE_STRING_LEN (64) +#define MAX_ADDR_LIST_STRING_LEN (2048) +#define MAX_ADDR_EMBED_LAYER_NUM (20) /* ����ַǶ�ײ��� */ +#define MAX_ADDR_BIN_VALUE_LEN (40) /* paddrʵ���������, Ŀǰ��tuple4v6� */ + +/* ����ģʽ��, ��¼MAC��ַ���ڷ��� */ +struct packet_io_mac_addr{ + struct mesa_ethernet_hdr eth_hdr; + char route_dir; + char __pad__; /* ����ṹ8�ֽڶ��� */ +}; + + + +struct hdlc_net_hdr{ + unsigned char address; + unsigned char control; + unsigned short protocol; /* network order */ +}__attribute__((packed)); + + + +/* ������������ֶ�, ��Ϊ������, network order */ +#define VXLAN_KEEPALIVE_PKT_PORT (3784) +#define VXLAN_OVERLAY_PKT_PORT (4789) + + +typedef enum{ + VXLAN_ENCAP_ETH = 0x0, + VXLAN_ENCAP_PPP = 0x8, + VXLAN_ENCAP_HDLC = 0xC, +}vxlan_encap_type_t; + +struct __inline_vxlan_hdr{ + unsigned char flags; + 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 dir : 1; + unsigned int link_id : 6; + unsigned int online_test : 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; +}__attribute__((packed)); +typedef struct __inline_vxlan_hdr inline_vxlan_hdr_t; + + + +unsigned char net_layer_to_ipv4_protocol(int addr_type); +unsigned char net_layer_to_ipv6_protocol(int addr_type); +unsigned short net_layer_to_ethernet_protocol(int addr_type); +UINT16 net_layer_to_ethernet_protocol_by_stream(const struct streaminfo *pstream); +enum addr_type_t ethernet_protocol_to_net_layer(UINT16 ether_type_host); +int net_common_build_send_mac(unsigned char *buf, const struct mesa_ethernet_hdr *raw_eth_hdr, int addr_type, int dir_reverse, int net_topology_mode); +int net_common_adjust_forward_mac(struct mesa_ethernet_hdr *raw_eth_hdr,int net_topology_mode); +const void *MESA_net_jump_to_layer(const void *raw_data, int raw_layer_type, int expect_layer_type); +const void *MESA_net_jump_to_layer_greedy(const void *raw_data, int raw_layer_type, int expect_layer_type); +char MESA_ascii_to_hex(char ascii); +const char *sapp_raw_ipv4_ntop(const struct mesa_ip4_hdr *ip4_hdr, char *out_buf, int buf_len ); +const char *sapp_raw_ipv6_ntop(const struct mesa_ip6_hdr *ip6_hdr, char *out_buf, int buf_len); + + +#ifdef __cplusplus +} +#endif + +#endif + |
