2 * Copyright (C) 2012, Broadcom Corporation. All Rights Reserved.
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 * Fundamental constants relating to IP Protocol
18 * $Id: bcmproto.h 329791 2012-04-26 22:36:58Z $
48 FRAME_L4_ICMP6_H
= 58,
64 static const uint8 llc_snap_hdr
[SNAP_HDR_LEN
] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00};
66 /* Generic header parser function */
68 hnd_frame_proto(uint8
*p
, int plen
, frame_proto_t
*fp
)
70 struct dot3_mac_llc_snap_header
*sh
= (struct dot3_mac_llc_snap_header
*)p
;
71 struct dot3_mac_llc_snapvlan_header
*svh
= (struct dot3_mac_llc_snapvlan_header
*)p
;
72 struct ether_header
*eh
= (struct ether_header
*)p
;
73 struct ethervlan_header
*evh
= (struct ethervlan_header
*)p
;
74 uint16 type
= ntoh16(eh
->ether_type
);
80 bzero(fp
, sizeof(frame_proto_t
));
82 /* L2 header/pointer check */
85 if (type
< ETHER_TYPE_MIN
) {
86 if (bcmp(&sh
->dsap
, llc_snap_hdr
, SNAP_HDR_LEN
) == 0) {
87 type
= ntoh16(sh
->type
);
88 if (type
== ETHER_TYPE_8021Q
) {
89 fp
->l2_t
= FRAME_L2_SNAP_H
;
90 p
+= sizeof(struct dot3_mac_llc_snap_header
);
91 if ((plen
-= sizeof(struct dot3_mac_llc_snap_header
)) < 0)
95 fp
->l2_t
= FRAME_L2_SNAPVLAN_H
;
96 type
= ntoh16(svh
->ether_type
);
97 p
+= sizeof(struct dot3_mac_llc_snapvlan_header
);
98 if ((plen
-= sizeof(struct dot3_mac_llc_snapvlan_header
)) < 0)
106 if (type
== ETHER_TYPE_8021Q
) {
107 fp
->l2_t
= FRAME_L2_ETHVLAN_H
;
108 type
= ntoh16(evh
->ether_type
);
109 p
+= ETHERVLAN_HDR_LEN
;
110 if ((plen
-= ETHERVLAN_HDR_LEN
) < 0)
114 fp
->l2_t
= FRAME_L2_ETH_H
;
116 if ((plen
-= ETHER_HDR_LEN
) < 0)
120 /* L3 header/pointer check */
124 case ETHER_TYPE_ARP
: {
125 if ((plen
-= ARP_DATA_LEN
) < 0)
128 fp
->l3_t
= FRAME_L3_ARP_H
;
129 /* no layer 4 protocol, return */
133 case ETHER_TYPE_IP
: {
134 struct ipv4_hdr
*iph
= (struct ipv4_hdr
*)p
;
135 len
= IPV4_HLEN(iph
);
137 if ((plen
-= len
) < 0)
140 if (IP_VER(iph
) == IP_VER_4
&& len
>= IPV4_MIN_HEADER_LEN
) {
141 fp
->l3_t
= FRAME_L3_IP_H
;
142 type
= IPV4_PROT(iph
);
145 else /* not a valid ipv4 packet */
149 case ETHER_TYPE_IPV6
: {
150 struct ipv6_hdr
*ip6h
= (struct ipv6_hdr
*)p
;
152 if ((plen
-= IPV6_MIN_HLEN
) < 0)
155 if (IP_VER(ip6h
) == IP_VER_6
) {
156 fp
->l3_t
= FRAME_L3_IP6_H
;
157 type
= IPV6_PROT(ip6h
);
159 if (IPV6_EXTHDR(type
)) {
160 /* only process tcp/udp case */
164 else /* not a valid ipv6 packet */
169 /* not interesting case */
174 /* L4 header/pointer check */
179 fp
->l4_t
= FRAME_L4_ICMP_H
;
182 fp
->l4_t
= FRAME_L4_IGMP_H
;
185 fp
->l4_t
= FRAME_L4_TCP_H
;
188 fp
->l4_t
= FRAME_L4_UDP_H
;
191 fp
->l4_t
= FRAME_L4_ICMP6_H
;
202 #define FRAME_TAKEN 2
204 #endif /* _bcmproto_h_ */