llc: use dev_hard_header
authorOctavian Purdila <opurdila@ixiacom.com>
Sat, 26 Dec 2009 11:50:59 +0000 (11:50 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 27 Dec 2009 04:38:23 +0000 (20:38 -0800)
Using dev_hard_header allows us to use LLC with VLANs and potentially
other Ethernet/TokernRing specific encapsulations. It also removes code
duplication between LLC and Ethernet/TokenRing core code.

Signed-off-by: Octavian Purdila <opurdila@ixiacom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/myri_sbus.c
net/8021q/vlan_dev.c
net/ethernet/eth.c
net/llc/llc_output.c

index b3513ad3b7037eb45b76190b32124b9f7a842dba..8b4313085359ce703f2f4bd6c91c815c43a2c030 100644 (file)
@@ -716,10 +716,10 @@ static int myri_header(struct sk_buff *skb, struct net_device *dev,
        pad[0] = MYRI_PAD_LEN;
        pad[1] = 0xab;
 
-       /* Set the protocol type. For a packet of type ETH_P_802_3 we put the length
-        * in here instead. It is up to the 802.2 layer to carry protocol information.
+       /* Set the protocol type. For a packet of type ETH_P_802_3/2 we put the
+        * length in here instead.
         */
-       if (type != ETH_P_802_3)
+       if (type != ETH_P_802_3 && type != ETH_P_802_2)
                eth->h_proto = htons(type);
        else
                eth->h_proto = htons(len);
index b7889782047e90b66b6ea8bd722d6340dc16ca2e..77a49ffdd0ef0cb836a33ae092c3aa4ba0ab78cf 100644 (file)
@@ -263,11 +263,10 @@ static int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
                vhdr->h_vlan_TCI = htons(vlan_tci);
 
                /*
-                *  Set the protocol type. For a packet of type ETH_P_802_3 we
-                *  put the length in here instead. It is up to the 802.2
-                *  layer to carry protocol information.
+                *  Set the protocol type. For a packet of type ETH_P_802_3/2 we
+                *  put the length in here instead.
                 */
-               if (type != ETH_P_802_3)
+               if (type != ETH_P_802_3 && type != ETH_P_802_2)
                        vhdr->h_vlan_encapsulated_proto = htons(type);
                else
                        vhdr->h_vlan_encapsulated_proto = htons(len);
index dd3db88f8f0a84659017d1c548b6729344a6da8a..205a1c12f3c0475f4c15bd59064e21c3be7b93e9 100644 (file)
@@ -73,8 +73,8 @@ __setup("ether=", netdev_boot_setup);
  * @len:   packet length (<= skb->len)
  *
  *
- * Set the protocol type. For a packet of type ETH_P_802_3 we put the length
- * in here instead. It is up to the 802.2 layer to carry protocol information.
+ * Set the protocol type. For a packet of type ETH_P_802_3/2 we put the length
+ * in here instead.
  */
 int eth_header(struct sk_buff *skb, struct net_device *dev,
               unsigned short type,
@@ -82,7 +82,7 @@ int eth_header(struct sk_buff *skb, struct net_device *dev,
 {
        struct ethhdr *eth = (struct ethhdr *)skb_push(skb, ETH_HLEN);
 
-       if (type != ETH_P_802_3)
+       if (type != ETH_P_802_3 && type != ETH_P_802_2)
                eth->h_proto = htons(type);
        else
                eth->h_proto = htons(len);
index 754f4fedc852fb6181d5c5bed0146096d5ff12f4..b38a1079a98eac59dd1737b6f5bb7e7bf5437a54 100644 (file)
 int llc_mac_hdr_init(struct sk_buff *skb,
                     const unsigned char *sa, const unsigned char *da)
 {
-       int rc = 0;
+       int rc = -EINVAL;
 
        switch (skb->dev->type) {
-#ifdef CONFIG_TR
-       case ARPHRD_IEEE802_TR: {
-               struct net_device *dev = skb->dev;
-               struct trh_hdr *trh;
-
-               skb_push(skb, sizeof(*trh));
-               skb_reset_mac_header(skb);
-               trh = tr_hdr(skb);
-               trh->ac = AC;
-               trh->fc = LLC_FRAME;
-               if (sa)
-                       memcpy(trh->saddr, sa, dev->addr_len);
-               else
-                       memset(trh->saddr, 0, dev->addr_len);
-               if (da) {
-                       memcpy(trh->daddr, da, dev->addr_len);
-                       tr_source_route(skb, trh, dev);
-                       skb_reset_mac_header(skb);
-               }
-               break;
-       }
-#endif
+       case ARPHRD_IEEE802_TR:
        case ARPHRD_ETHER:
-       case ARPHRD_LOOPBACK: {
-               unsigned short len = skb->len;
-               struct ethhdr *eth;
-
-               skb_push(skb, sizeof(*eth));
-               skb_reset_mac_header(skb);
-               eth = eth_hdr(skb);
-               eth->h_proto = htons(len);
-               memcpy(eth->h_dest, da, ETH_ALEN);
-               memcpy(eth->h_source, sa, ETH_ALEN);
+       case ARPHRD_LOOPBACK:
+               rc = dev_hard_header(skb, skb->dev, ETH_P_802_2, da, sa,
+                                    skb->len);
+               if (rc > 0)
+                       rc = 0;
                break;
-       }
        default:
-               printk(KERN_WARNING "device type not supported: %d\n",
-                      skb->dev->type);
-               rc = -EINVAL;
+               WARN(1, "device type not supported: %d\n", skb->dev->type);
        }
        return rc;
 }