Commit e5c5d22e authored by Simon Horman's avatar Simon Horman Committed by David S. Miller

net: add ETH_P_802_3_MIN

Add a new constant ETH_P_802_3_MIN, the minimum ethernet type for
an 802.3 frame. Frames with a lower value in the ethernet type field
are Ethernet II.

Also update all the users of this value that David Miller and
I could find to use the new constant.

Also correct a bug in util.c. The comparison with ETH_P_802_3_MIN
should be >= not >.

As suggested by Jesse Gross.

Compile tested only.

Cc: David Miller <davem@davemloft.net>
Cc: Jesse Gross <jesse@nicira.com>
Cc: Karsten Keil <isdn@linux-pingi.de>
Cc: John W. Linville <linville@tuxdriver.com>
Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: Bart De Schuymer <bart.de.schuymer@pandora.be>
Cc: Stephen Hemminger <stephen@networkplumber.org>
Cc: Patrick McHardy <kaber@trash.net>
Cc: Marcel Holtmann <marcel@holtmann.org>
Cc: Gustavo Padovan <gustavo@padovan.org>
Cc: Johan Hedberg <johan.hedberg@gmail.com>
Cc: linux-bluetooth@vger.kernel.org
Cc: netfilter-devel@vger.kernel.org
Cc: bridge@lists.linux-foundation.org
Cc: linux-wireless@vger.kernel.org
Cc: linux1394-devel@lists.sourceforge.net
Cc: linux-media@vger.kernel.org
Cc: netdev@vger.kernel.org
Cc: dev@openvswitch.org
Acked-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
Acked-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8b49a4c7
...@@ -547,7 +547,7 @@ static int fwnet_finish_incoming_packet(struct net_device *net, ...@@ -547,7 +547,7 @@ static int fwnet_finish_incoming_packet(struct net_device *net,
if (memcmp(eth->h_dest, net->dev_addr, net->addr_len)) if (memcmp(eth->h_dest, net->dev_addr, net->addr_len))
skb->pkt_type = PACKET_OTHERHOST; skb->pkt_type = PACKET_OTHERHOST;
} }
if (ntohs(eth->h_proto) >= 1536) { if (ntohs(eth->h_proto) >= ETH_P_802_3_MIN) {
protocol = eth->h_proto; protocol = eth->h_proto;
} else { } else {
rawp = (u16 *)skb->data; rawp = (u16 *)skb->data;
......
...@@ -1385,7 +1385,7 @@ isdn_net_type_trans(struct sk_buff *skb, struct net_device *dev) ...@@ -1385,7 +1385,7 @@ isdn_net_type_trans(struct sk_buff *skb, struct net_device *dev)
if (memcmp(eth->h_dest, dev->dev_addr, ETH_ALEN)) if (memcmp(eth->h_dest, dev->dev_addr, ETH_ALEN))
skb->pkt_type = PACKET_OTHERHOST; skb->pkt_type = PACKET_OTHERHOST;
} }
if (ntohs(eth->h_proto) >= 1536) if (ntohs(eth->h_proto) >= ETH_P_802_3_MIN)
return eth->h_proto; return eth->h_proto;
rawp = skb->data; rawp = skb->data;
......
...@@ -185,7 +185,7 @@ static __be16 dvb_net_eth_type_trans(struct sk_buff *skb, ...@@ -185,7 +185,7 @@ static __be16 dvb_net_eth_type_trans(struct sk_buff *skb,
skb->pkt_type=PACKET_MULTICAST; skb->pkt_type=PACKET_MULTICAST;
} }
if (ntohs(eth->h_proto) >= 1536) if (ntohs(eth->h_proto) >= ETH_P_802_3_MIN)
return eth->h_proto; return eth->h_proto;
rawp = skb->data; rawp = skb->data;
...@@ -228,9 +228,9 @@ static int ule_test_sndu( struct dvb_net_priv *p ) ...@@ -228,9 +228,9 @@ static int ule_test_sndu( struct dvb_net_priv *p )
static int ule_bridged_sndu( struct dvb_net_priv *p ) static int ule_bridged_sndu( struct dvb_net_priv *p )
{ {
struct ethhdr *hdr = (struct ethhdr*) p->ule_next_hdr; struct ethhdr *hdr = (struct ethhdr*) p->ule_next_hdr;
if(ntohs(hdr->h_proto) < 1536) { if(ntohs(hdr->h_proto) < ETH_P_802_3_MIN) {
int framelen = p->ule_sndu_len - ((p->ule_next_hdr+sizeof(struct ethhdr)) - p->ule_skb->data); int framelen = p->ule_sndu_len - ((p->ule_next_hdr+sizeof(struct ethhdr)) - p->ule_skb->data);
/* A frame Type < 1536 for a bridged frame, introduces a LLC Length field. */ /* A frame Type < ETH_P_802_3_MIN for a bridged frame, introduces a LLC Length field. */
if(framelen != ntohs(hdr->h_proto)) { if(framelen != ntohs(hdr->h_proto)) {
return -1; return -1;
} }
...@@ -320,7 +320,7 @@ static int handle_ule_extensions( struct dvb_net_priv *p ) ...@@ -320,7 +320,7 @@ static int handle_ule_extensions( struct dvb_net_priv *p )
(int) p->ule_sndu_type, l, total_ext_len); (int) p->ule_sndu_type, l, total_ext_len);
#endif #endif
} while (p->ule_sndu_type < 1536); } while (p->ule_sndu_type < ETH_P_802_3_MIN);
return total_ext_len; return total_ext_len;
} }
...@@ -712,7 +712,7 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) ...@@ -712,7 +712,7 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len )
} }
/* Handle ULE Extension Headers. */ /* Handle ULE Extension Headers. */
if (priv->ule_sndu_type < 1536) { if (priv->ule_sndu_type < ETH_P_802_3_MIN) {
/* There is an extension header. Handle it accordingly. */ /* There is an extension header. Handle it accordingly. */
int l = handle_ule_extensions(priv); int l = handle_ule_extensions(priv);
if (l < 0) { if (l < 0) {
......
...@@ -6618,7 +6618,7 @@ static u64 niu_compute_tx_flags(struct sk_buff *skb, struct ethhdr *ehdr, ...@@ -6618,7 +6618,7 @@ static u64 niu_compute_tx_flags(struct sk_buff *skb, struct ethhdr *ehdr,
(len << TXHDR_LEN_SHIFT) | (len << TXHDR_LEN_SHIFT) |
((l3off / 2) << TXHDR_L3START_SHIFT) | ((l3off / 2) << TXHDR_L3START_SHIFT) |
(ihl << TXHDR_IHL_SHIFT) | (ihl << TXHDR_IHL_SHIFT) |
((eth_proto_inner < 1536) ? TXHDR_LLC : 0) | ((eth_proto_inner < ETH_P_802_3_MIN) ? TXHDR_LLC : 0) |
((eth_proto == ETH_P_8021Q) ? TXHDR_VLAN : 0) | ((eth_proto == ETH_P_8021Q) ? TXHDR_VLAN : 0) |
(ipv6 ? TXHDR_IP_VER : 0) | (ipv6 ? TXHDR_IP_VER : 0) |
csum_bits); csum_bits);
......
...@@ -560,7 +560,7 @@ static __be16 plip_type_trans(struct sk_buff *skb, struct net_device *dev) ...@@ -560,7 +560,7 @@ static __be16 plip_type_trans(struct sk_buff *skb, struct net_device *dev)
* so don't forget to remove it. * so don't forget to remove it.
*/ */
if (ntohs(eth->h_proto) >= 1536) if (ntohs(eth->h_proto) >= ETH_P_802_3_MIN)
return eth->h_proto; return eth->h_proto;
rawp = skb->data; rawp = skb->data;
......
...@@ -953,7 +953,7 @@ static int translate_frame(ray_dev_t *local, struct tx_msg __iomem *ptx, ...@@ -953,7 +953,7 @@ static int translate_frame(ray_dev_t *local, struct tx_msg __iomem *ptx,
unsigned char *data, int len) unsigned char *data, int len)
{ {
__be16 proto = ((struct ethhdr *)data)->h_proto; __be16 proto = ((struct ethhdr *)data)->h_proto;
if (ntohs(proto) >= 1536) { /* DIX II ethernet frame */ if (ntohs(proto) >= ETH_P_802_3_MIN) { /* DIX II ethernet frame */
pr_debug("ray_cs translate_frame DIX II\n"); pr_debug("ray_cs translate_frame DIX II\n");
/* Copy LLC header to card buffer */ /* Copy LLC header to card buffer */
memcpy_toio(&ptx->var, eth2_llc, sizeof(eth2_llc)); memcpy_toio(&ptx->var, eth2_llc, sizeof(eth2_llc));
......
...@@ -339,7 +339,7 @@ static inline void vlan_set_encap_proto(struct sk_buff *skb, ...@@ -339,7 +339,7 @@ static inline void vlan_set_encap_proto(struct sk_buff *skb,
*/ */
proto = vhdr->h_vlan_encapsulated_proto; proto = vhdr->h_vlan_encapsulated_proto;
if (ntohs(proto) >= 1536) { if (ntohs(proto) >= ETH_P_802_3_MIN) {
skb->protocol = proto; skb->protocol = proto;
return; return;
} }
......
...@@ -94,6 +94,9 @@ ...@@ -94,6 +94,9 @@
#define ETH_P_EDSA 0xDADA /* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */ #define ETH_P_EDSA 0xDADA /* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */
#define ETH_P_AF_IUCV 0xFBFB /* IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ] */ #define ETH_P_AF_IUCV 0xFBFB /* IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ] */
#define ETH_P_802_3_MIN 0x0600 /* If the value in the ethernet type is less than this value
* then the frame is Ethernet II. Else it is 802.3 */
/* /*
* Non DIX types. Won't clash for 1500 types. * Non DIX types. Won't clash for 1500 types.
*/ */
......
...@@ -58,7 +58,7 @@ struct lane2_ops { ...@@ -58,7 +58,7 @@ struct lane2_ops {
* field in h_type field. Data follows immediately after header. * field in h_type field. Data follows immediately after header.
* 2. LLC Data frames whose total length, including LLC field and data, * 2. LLC Data frames whose total length, including LLC field and data,
* but not padding required to meet the minimum data frame length, * but not padding required to meet the minimum data frame length,
* is less than 1536(0x0600) MUST be encoded by placing that length * is less than ETH_P_802_3_MIN MUST be encoded by placing that length
* in the h_type field. The LLC field follows header immediately. * in the h_type field. The LLC field follows header immediately.
* 3. LLC data frames longer than this maximum MUST be encoded by placing * 3. LLC data frames longer than this maximum MUST be encoded by placing
* the value 0 in the h_type field. * the value 0 in the h_type field.
......
...@@ -136,7 +136,7 @@ static u16 bnep_net_eth_proto(struct sk_buff *skb) ...@@ -136,7 +136,7 @@ static u16 bnep_net_eth_proto(struct sk_buff *skb)
struct ethhdr *eh = (void *) skb->data; struct ethhdr *eh = (void *) skb->data;
u16 proto = ntohs(eh->h_proto); u16 proto = ntohs(eh->h_proto);
if (proto >= 1536) if (proto >= ETH_P_802_3_MIN)
return proto; return proto;
if (get_unaligned((__be16 *) skb->data) == htons(0xFFFF)) if (get_unaligned((__be16 *) skb->data) == htons(0xFFFF))
......
...@@ -138,7 +138,7 @@ ebt_basic_match(const struct ebt_entry *e, const struct sk_buff *skb, ...@@ -138,7 +138,7 @@ ebt_basic_match(const struct ebt_entry *e, const struct sk_buff *skb,
ethproto = h->h_proto; ethproto = h->h_proto;
if (e->bitmask & EBT_802_3) { if (e->bitmask & EBT_802_3) {
if (FWINV2(ntohs(ethproto) >= 1536, EBT_IPROTO)) if (FWINV2(ntohs(ethproto) >= ETH_P_802_3_MIN, EBT_IPROTO))
return 1; return 1;
} else if (!(e->bitmask & EBT_NOPROTO) && } else if (!(e->bitmask & EBT_NOPROTO) &&
FWINV2(e->ethproto != ethproto, EBT_IPROTO)) FWINV2(e->ethproto != ethproto, EBT_IPROTO))
......
...@@ -195,7 +195,7 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev) ...@@ -195,7 +195,7 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)
if (netdev_uses_trailer_tags(dev)) if (netdev_uses_trailer_tags(dev))
return htons(ETH_P_TRAILER); return htons(ETH_P_TRAILER);
if (ntohs(eth->h_proto) >= 1536) if (ntohs(eth->h_proto) >= ETH_P_802_3_MIN)
return eth->h_proto; return eth->h_proto;
/* /*
......
...@@ -2085,7 +2085,7 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, ...@@ -2085,7 +2085,7 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
encaps_data = bridge_tunnel_header; encaps_data = bridge_tunnel_header;
encaps_len = sizeof(bridge_tunnel_header); encaps_len = sizeof(bridge_tunnel_header);
skip_header_bytes -= 2; skip_header_bytes -= 2;
} else if (ethertype >= 0x600) { } else if (ethertype >= ETH_P_802_3_MIN) {
encaps_data = rfc1042_header; encaps_data = rfc1042_header;
encaps_len = sizeof(rfc1042_header); encaps_len = sizeof(rfc1042_header);
skip_header_bytes -= 2; skip_header_bytes -= 2;
......
...@@ -681,7 +681,7 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info) ...@@ -681,7 +681,7 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info)
/* Normally, setting the skb 'protocol' field would be handled by a /* Normally, setting the skb 'protocol' field would be handled by a
* call to eth_type_trans(), but it assumes there's a sending * call to eth_type_trans(), but it assumes there's a sending
* device, which we may not have. */ * device, which we may not have. */
if (ntohs(eth->h_proto) >= 1536) if (ntohs(eth->h_proto) >= ETH_P_802_3_MIN)
packet->protocol = eth->h_proto; packet->protocol = eth->h_proto;
else else
packet->protocol = htons(ETH_P_802_2); packet->protocol = htons(ETH_P_802_2);
......
...@@ -466,7 +466,7 @@ static __be16 parse_ethertype(struct sk_buff *skb) ...@@ -466,7 +466,7 @@ static __be16 parse_ethertype(struct sk_buff *skb)
proto = *(__be16 *) skb->data; proto = *(__be16 *) skb->data;
__skb_pull(skb, sizeof(__be16)); __skb_pull(skb, sizeof(__be16));
if (ntohs(proto) >= 1536) if (ntohs(proto) >= ETH_P_802_3_MIN)
return proto; return proto;
if (skb->len < sizeof(struct llc_snap_hdr)) if (skb->len < sizeof(struct llc_snap_hdr))
...@@ -483,7 +483,7 @@ static __be16 parse_ethertype(struct sk_buff *skb) ...@@ -483,7 +483,7 @@ static __be16 parse_ethertype(struct sk_buff *skb)
__skb_pull(skb, sizeof(struct llc_snap_hdr)); __skb_pull(skb, sizeof(struct llc_snap_hdr));
if (ntohs(llc->ethertype) >= 1536) if (ntohs(llc->ethertype) >= ETH_P_802_3_MIN)
return llc->ethertype; return llc->ethertype;
return htons(ETH_P_802_2); return htons(ETH_P_802_2);
...@@ -1038,7 +1038,7 @@ int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp, ...@@ -1038,7 +1038,7 @@ int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp,
if (attrs & (1 << OVS_KEY_ATTR_ETHERTYPE)) { if (attrs & (1 << OVS_KEY_ATTR_ETHERTYPE)) {
swkey->eth.type = nla_get_be16(a[OVS_KEY_ATTR_ETHERTYPE]); swkey->eth.type = nla_get_be16(a[OVS_KEY_ATTR_ETHERTYPE]);
if (ntohs(swkey->eth.type) < 1536) if (ntohs(swkey->eth.type) < ETH_P_802_3_MIN)
return -EINVAL; return -EINVAL;
attrs &= ~(1 << OVS_KEY_ATTR_ETHERTYPE); attrs &= ~(1 << OVS_KEY_ATTR_ETHERTYPE);
} else { } else {
......
...@@ -511,7 +511,7 @@ int ieee80211_data_from_8023(struct sk_buff *skb, const u8 *addr, ...@@ -511,7 +511,7 @@ int ieee80211_data_from_8023(struct sk_buff *skb, const u8 *addr,
encaps_data = bridge_tunnel_header; encaps_data = bridge_tunnel_header;
encaps_len = sizeof(bridge_tunnel_header); encaps_len = sizeof(bridge_tunnel_header);
skip_header_bytes -= 2; skip_header_bytes -= 2;
} else if (ethertype > 0x600) { } else if (ethertype >= ETH_P_802_3_MIN) {
encaps_data = rfc1042_header; encaps_data = rfc1042_header;
encaps_len = sizeof(rfc1042_header); encaps_len = sizeof(rfc1042_header);
skip_header_bytes -= 2; skip_header_bytes -= 2;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment