Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / net / netrom / nr_dev.c
index 220bf74..621e558 100644 (file)
@@ -38,8 +38,6 @@
 #include <net/ax25.h>
 #include <net/netrom.h>
 
-#ifdef CONFIG_INET
-
 /*
  *     Only allow IP over NET/ROM frames through if the netrom device is up.
  */
@@ -49,7 +47,7 @@ int nr_rx_ip(struct sk_buff *skb, struct net_device *dev)
        struct net_device_stats *stats = netdev_priv(dev);
 
        if (!netif_running(dev)) {
-               stats->rx_errors++;
+               stats->rx_dropped++;
                return 0;
        }
 
@@ -60,27 +58,23 @@ int nr_rx_ip(struct sk_buff *skb, struct net_device *dev)
 
        /* Spoof incoming device */
        skb->dev      = dev;
-       skb->h.raw    = skb->data;
+       skb->mac.raw  = skb->nh.raw;
        skb->nh.raw   = skb->data;
        skb->pkt_type = PACKET_HOST;
 
-       ip_rcv(skb, skb->dev, NULL);
+       netif_rx(skb);
 
        return 1;
 }
 
+#ifdef CONFIG_INET
 
 static int nr_rebuild_header(struct sk_buff *skb)
 {
-       struct net_device *dev = skb->dev;
-       struct net_device_stats *stats = netdev_priv(dev);
-       struct sk_buff *skbn;
        unsigned char *bp = skb->data;
-       int len;
 
-       if (arp_find(bp + 7, skb)) {
+       if (arp_find(bp + 7, skb))
                return 1;
-       }
 
        bp[6] &= ~AX25_CBIT;
        bp[6] &= ~AX25_EBIT;
@@ -91,27 +85,7 @@ static int nr_rebuild_header(struct sk_buff *skb)
        bp[6] |= AX25_EBIT;
        bp[6] |= AX25_SSSID_SPARE;
 
-       if ((skbn = skb_clone(skb, GFP_ATOMIC)) == NULL) {
-               kfree_skb(skb);
-               return 1;
-       }
-
-       if (skb->sk != NULL)
-               skb_set_owner_w(skbn, skb->sk);
-
-       kfree_skb(skb);
-
-       len = skbn->len;
-
-       if (!nr_route_frame(skbn, NULL)) {
-               kfree_skb(skbn);
-               stats->tx_errors++;
-       }
-
-       stats->tx_packets++;
-       stats->tx_bytes += len;
-
-       return 1;
+       return 0;
 }
 
 #else
@@ -186,20 +160,31 @@ static int nr_close(struct net_device *dev)
 
 static int nr_xmit(struct sk_buff *skb, struct net_device *dev)
 {
-       struct net_device_stats *stats = netdev_priv(dev);
-       dev_kfree_skb(skb);
-       stats->tx_errors++;
+       struct nr_private *nr = netdev_priv(dev);
+       struct net_device_stats *stats = &nr->stats;
+       unsigned int len = skb->len;
+
+       if (!nr_route_frame(skb, NULL)) {
+               kfree_skb(skb);
+               stats->tx_errors++;
+               return 0;
+       }
+
+       stats->tx_packets++;
+       stats->tx_bytes += len;
+
        return 0;
 }
 
 static struct net_device_stats *nr_get_stats(struct net_device *dev)
 {
-       return netdev_priv(dev);
+       struct nr_private *nr = netdev_priv(dev);
+
+       return &nr->stats;
 }
 
 void nr_setup(struct net_device *dev)
 {
-       SET_MODULE_OWNER(dev);
        dev->mtu                = NR_MAX_PACKET_SIZE;
        dev->hard_start_xmit    = nr_xmit;
        dev->open               = nr_open;
@@ -209,12 +194,11 @@ void nr_setup(struct net_device *dev)
        dev->hard_header_len    = NR_NETWORK_LEN + NR_TRANSPORT_LEN;
        dev->addr_len           = AX25_ADDR_LEN;
        dev->type               = ARPHRD_NETROM;
-       dev->tx_queue_len       = 40;
        dev->rebuild_header     = nr_rebuild_header;
        dev->set_mac_address    = nr_set_mac_address;
 
        /* New-style flags. */
-       dev->flags              = 0;
+       dev->flags              = IFF_NOARP;
 
        dev->get_stats          = nr_get_stats;
 }