]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - net/core/netpoll.c
dropmon: add ability to detect when hardware dropsrxpackets
[net-next-2.6.git] / net / core / netpoll.c
index 755414cd49d10c8d65c6366bceb2618edf261f75..00b14e2c50ed3fa1cb39dd0d9c834a6f51bdbab6 100644 (file)
@@ -24,6 +24,7 @@
 #include <net/tcp.h>
 #include <net/udp.h>
 #include <asm/unaligned.h>
+#include <trace/napi.h>
 
 /*
  * We maintain a small pool of fully-sized skbs, to make sure the
@@ -137,6 +138,7 @@ static int poll_one_napi(struct netpoll_info *npinfo,
        set_bit(NAPI_STATE_NPSVC, &napi->state);
 
        work = napi->poll(napi, budget);
+       trace_napi_poll(napi->dev);
 
        clear_bit(NAPI_STATE_NPSVC, &napi->state);
        atomic_dec(&trapped);
@@ -175,9 +177,13 @@ static void service_arp_queue(struct netpoll_info *npi)
 void netpoll_poll(struct netpoll *np)
 {
        struct net_device *dev = np->dev;
-       const struct net_device_ops *ops = dev->netdev_ops;
+       const struct net_device_ops *ops;
+
+       if (!dev || !netif_running(dev))
+               return;
 
-       if (!dev || !netif_running(dev) || !ops->ndo_poll_controller)
+       ops = dev->netdev_ops;
+       if (!ops->ndo_poll_controller)
                return;
 
        /* Process pending work on NIC */
@@ -345,8 +351,8 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
        udph->dest = htons(np->remote_port);
        udph->len = htons(udp_len);
        udph->check = 0;
-       udph->check = csum_tcpudp_magic(htonl(np->local_ip),
-                                       htonl(np->remote_ip),
+       udph->check = csum_tcpudp_magic(np->local_ip,
+                                       np->remote_ip,
                                        udp_len, IPPROTO_UDP,
                                        csum_partial(udph, udp_len, 0));
        if (udph->check == 0)
@@ -365,8 +371,8 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
        iph->ttl      = 64;
        iph->protocol = IPPROTO_UDP;
        iph->check    = 0;
-       put_unaligned(htonl(np->local_ip), &(iph->saddr));
-       put_unaligned(htonl(np->remote_ip), &(iph->daddr));
+       put_unaligned(np->local_ip, &(iph->saddr));
+       put_unaligned(np->remote_ip, &(iph->daddr));
        iph->check    = ip_fast_csum((unsigned char *)iph, iph->ihl);
 
        eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
@@ -424,7 +430,7 @@ static void arp_reply(struct sk_buff *skb)
        memcpy(&tip, arp_ptr, 4);
 
        /* Should we ignore arp? */
-       if (tip != htonl(np->local_ip) ||
+       if (tip != np->local_ip ||
            ipv4_is_loopback(tip) || ipv4_is_multicast(tip))
                return;
 
@@ -533,9 +539,9 @@ int __netpoll_rx(struct sk_buff *skb)
                goto out;
        if (checksum_udp(skb, uh, ulen, iph->saddr, iph->daddr))
                goto out;
-       if (np->local_ip && np->local_ip != ntohl(iph->daddr))
+       if (np->local_ip && np->local_ip != iph->daddr)
                goto out;
-       if (np->remote_ip && np->remote_ip != ntohl(iph->saddr))
+       if (np->remote_ip && np->remote_ip != iph->saddr)
                goto out;
        if (np->local_port && np->local_port != ntohs(uh->dest))
                goto out;
@@ -560,14 +566,14 @@ void netpoll_print_options(struct netpoll *np)
 {
        printk(KERN_INFO "%s: local port %d\n",
                         np->name, np->local_port);
-       printk(KERN_INFO "%s: local IP %d.%d.%d.%d\n",
-                        np->name, HIPQUAD(np->local_ip));
+       printk(KERN_INFO "%s: local IP %pI4\n",
+                        np->name, &np->local_ip);
        printk(KERN_INFO "%s: interface %s\n",
                         np->name, np->dev_name);
        printk(KERN_INFO "%s: remote port %d\n",
                         np->name, np->remote_port);
-       printk(KERN_INFO "%s: remote IP %d.%d.%d.%d\n",
-                        np->name, HIPQUAD(np->remote_ip));
+       printk(KERN_INFO "%s: remote IP %pI4\n",
+                        np->name, &np->remote_ip);
        printk(KERN_INFO "%s: remote ethernet address %pM\n",
                         np->name, np->remote_mac);
 }
@@ -589,7 +595,7 @@ int netpoll_parse_options(struct netpoll *np, char *opt)
                if ((delim = strchr(cur, '/')) == NULL)
                        goto parse_failed;
                *delim = 0;
-               np->local_ip = ntohl(in_aton(cur));
+               np->local_ip = in_aton(cur);
                cur = delim;
        }
        cur++;
@@ -618,7 +624,7 @@ int netpoll_parse_options(struct netpoll *np, char *opt)
        if ((delim = strchr(cur, '/')) == NULL)
                goto parse_failed;
        *delim = 0;
-       np->remote_ip = ntohl(in_aton(cur));
+       np->remote_ip = in_aton(cur);
        cur = delim + 1;
 
        if (*cur != 0) {
@@ -759,10 +765,9 @@ int netpoll_setup(struct netpoll *np)
                        goto release;
                }
 
-               np->local_ip = ntohl(in_dev->ifa_list->ifa_local);
+               np->local_ip = in_dev->ifa_list->ifa_local;
                rcu_read_unlock();
-               printk(KERN_INFO "%s: local IP %d.%d.%d.%d\n",
-                      np->name, HIPQUAD(np->local_ip));
+               printk(KERN_INFO "%s: local IP %pI4\n", np->name, &np->local_ip);
        }
 
        if (np->rx_hook) {