1 /*
2  * Copyright (c) 2012-2014, 2017, 2021 The Linux Foundation. All rights reserved.
3  *
4  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5  *
6  *
7  * Permission to use, copy, modify, and/or distribute this software for
8  * any purpose with or without fee is hereby granted, provided that the
9  * above copyright notice and this permission notice appear in all
10  * copies.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19  * PERFORMANCE OF THIS SOFTWARE.
20  */
21 
22 /*
23  * This file was originally distributed by Qualcomm Atheros, Inc.
24  * under proprietary terms before Copyright ownership was assigned
25  * to the Linux Foundation.
26  */
27 
28 #ifndef _ENET__H_
29 #define _ENET__H_
30 
31 #if defined(ATH_TARGET)
32 #include <osapi.h>   /* A_UINT8 */
33 #else
34 #include <a_types.h> /* A_UINT8 */
35 #endif
36 
37 
38 #define ETHERNET_ADDR_LEN 6 /* bytes */
39 #define ETHERNET_TYPE_LEN 2 /* bytes - length of the Ethernet type field */
40 
41 struct ethernet_hdr_t {
42     A_UINT8 dest_addr[ETHERNET_ADDR_LEN];
43     A_UINT8 src_addr[ETHERNET_ADDR_LEN];
44     A_UINT8 ethertype[ETHERNET_TYPE_LEN];
45 };
46 
47 #define ETHERNET_HDR_LEN (sizeof(struct ethernet_hdr_t))
48 
49 #define ETHERNET_CRC_LEN  4     /* bytes - length of the Ethernet CRC */
50 #define ETHERNET_MAX_LEN  1518  /* bytes */
51 
52 #define ETHERNET_MTU (ETHERNET_MAX_LEN - (ETHERNET_HDR_LEN + ETHERNET_CRC_LEN))
53 
54 
55 typedef struct llc_snap_hdr_t {
56     A_UINT8 dsap;
57     A_UINT8 ssap;
58     A_UINT8 cntl;
59     A_UINT8 org_code[3];
60     A_UINT8 ethertype[2];
61 } LLC_SNAP_HDR;
62 
63 #define LLC_SNAP_HDR_LEN (sizeof(struct llc_snap_hdr_t))
64 #define LLC_SNAP_HDR_OFFSET_ETHERTYPE \
65     (offsetof(struct llc_snap_hdr_t, ethertype[0]))
66 
67 #define ETHERTYPE_VLAN_LEN  4
68 
69 struct ethernet_vlan_hdr_t {
70     A_UINT8 dest_addr[ETHERNET_ADDR_LEN];
71     A_UINT8 src_addr[ETHERNET_ADDR_LEN];
72     A_UINT8 vlan_tpid[2];
73     A_UINT8 vlan_tci[2];
74     A_UINT8 ethertype[2];
75 };
76 
77 typedef PREPACK struct _wai_hdr {
78     A_UINT8 version[2];
79     A_UINT8 type;
80     A_UINT8 stype;
81     A_UINT8 reserve[2];
82     A_UINT8 length[2];
83     A_UINT8 rxseq[2];
84     A_UINT8 frag_sc;
85     A_UINT8 more_frag;
86     /* followed octets of data */
87 } POSTPACK wai_hdr;
88 
89 typedef PREPACK struct {
90     A_UINT16 vlan_tci;
91     A_UINT16 vlan_encap_p;
92 } POSTPACK vlan_hdr_t;
93 
94 #define ETHERTYPE_IS_EAPOL_WAPI(typeorlen)           \
95 			((typeorlen) == ETHERTYPE_PAE ||  \
96 			(typeorlen) == ETHERTYPE_WAI)
97 
98 #define IS_ETHERTYPE(_typeOrLen) ((_typeOrLen) >= 0x0600)
99 
100 #ifndef ETHERTYPE_IPV4
101 #define ETHERTYPE_IPV4  0x0800 /* Internet Protocol, Version 4 (IPv4) */
102 #endif
103 
104 #ifndef ETHERTYPE_AARP
105 #define	ETHERTYPE_AARP	0x80f3		/* Internal QCA AARP protocol */
106 #endif
107 
108 #ifndef ETHERTYPE_IPX
109 #define ETHERTYPE_IPX    0x8137    /* IPX over DIX protocol */
110 #endif
111 
112 #ifndef ETHERTYPE_ARP
113 #define ETHERTYPE_ARP   0x0806 /* Address Resolution Protocol (ARP) */
114 #endif
115 
116 #ifndef ETHERTYPE_RARP
117 #define ETHERTYPE_RARP  0x8035 /* Reverse Address Resolution Protocol (RARP) */
118 #endif
119 
120 #ifndef ETHERTYPE_VLAN
121 #define ETHERTYPE_VLAN  0x8100 /* VLAN TAG protocol */
122 #endif
123 
124 #ifndef ETHERTYPE_SNMP
125 #define ETHERTYPE_SNMP  0x814C /* Simple Network Management Protocol (SNMP) */
126 #endif
127 
128 #ifndef ETHERTYPE_IPV6
129 #define ETHERTYPE_IPV6  0x86DD /* Internet Protocol, Version 6 (IPv6) */
130 #endif
131 
132 #ifndef ETHERTYPE_PAE
133 #define ETHERTYPE_PAE   0x888E /* EAP over LAN (EAPOL) */
134 #endif
135 
136 #ifndef ETHERTYPE_WAI
137 #define ETHERTYPE_WAI   0x88B4 /* WAPI */
138 #endif
139 
140 #ifndef ETHERTYPE_TDLS
141 #define ETHERTYPE_TDLS  0x890D /* TDLS */
142 #endif
143 
144 #define LLC_SNAP_LSAP 0xaa
145 #define LLC_UI 0x3
146 
147 #define RFC1042_SNAP_ORGCODE_0 0x00
148 #define RFC1042_SNAP_ORGCODE_1 0x00
149 #define RFC1042_SNAP_ORGCODE_2 0x00
150 
151 #define BTEP_SNAP_ORGCODE_0 0x00
152 #define BTEP_SNAP_ORGCODE_1 0x00
153 #define BTEP_SNAP_ORGCODE_2 0xf8
154 
155 
156 #define WAI_FRAME_TYPE 0X01
157 #define WAPI_M4_TYPE 0x0c
158 #define WAPI_M2_TYPE 0x09
159 
160 
161 #define ICMP_PROTOCOL   1
162 #define TCP_PROTOCOL    6
163 #define UDP_PROTOCOL    17
164 #define IGMP_PROTOCOL   2
165 #define ICMPV6_PROTOCOL 58
166 #define BOOTP_SERVER_PORT 67
167 #define BOOTP_CLIENT_PORT 68
168 #define MLD_QUERY 130
169 #define MLD_DONE  132
170 
171 
172 #define IS_EAPOL(typeorlen) \
173     ((typeorlen) == ETHERTYPE_PAE || \
174      (typeorlen) == ETHERTYPE_WAI)
175 
176 #define IS_SNAP(_llc) \
177     ((_llc)->dsap == LLC_SNAP_LSAP && \
178      (_llc)->ssap == LLC_SNAP_LSAP && \
179      (_llc)->cntl == LLC_UI)
180 
181 #define IS_RFC1042(_llc) \
182     ((_llc)->org_code[0] == RFC1042_SNAP_ORGCODE_0 && \
183      (_llc)->org_code[1] == RFC1042_SNAP_ORGCODE_1 && \
184      (_llc)->org_code[2] == RFC1042_SNAP_ORGCODE_2)
185 
186 #define IS_BTEP(_llc) \
187     ((_llc)->org_code[0] == BTEP_SNAP_ORGCODE_0 && \
188      (_llc)->org_code[1] == BTEP_SNAP_ORGCODE_1 && \
189      (_llc)->org_code[2] == BTEP_SNAP_ORGCODE_2)
190 
191 #define IS_MULTICAST(_hdr) (*(A_UINT8 *)(_hdr) & 0x1)
192 #define IS_BROADCAST(_hdr) \
193     ((*((A_UINT8 *)(_hdr) + 0) == 0xff) && \
194      (*((A_UINT8 *)(_hdr) + 1) == 0xff) && \
195      (*((A_UINT8 *)(_hdr) + 2) == 0xff) && \
196      (*((A_UINT8 *)(_hdr) + 3) == 0xff) && \
197      (*((A_UINT8 *)(_hdr) + 4) == 0xff) && \
198      (*((A_UINT8 *)(_hdr) + 5) == 0xff))
199 
200 
201 #endif /* _ENET__H_ */
202