OFED/iWARP Developers,

Here is a proposal for supporting the minimum required neighbour update
event notifications needed for iwarp devices on the older kernels
supported by ofed.  

This patch is a request for comments.  Please review.  If you think it
looks ok, then I'll provide patches to all the various backports.

Steve




2.6.17 backport: simulate neighbour update events by snooping ARP packets

Needed to support iWARP devices on backported kernels.  This also allows
using the current drivers/infiniband/core/addr.c which requires netevents
as well.

This patch rearranges things a bit:

- add the new file in the kernel_addons/backport dir for the ARP 
  snooping / netevent callout code.  This file is called 
  rdma_netevents.c.

- modify the kernel_patches/backports/2.6.17/linux_stuff* patch to 
  include rdma_netevents.c _and_ the netevent.c file into its own 
  module called rdma_ne

- remove the backport patch to revert addr.c to snoop ARP packets. 

Signed-off-by: Steve Wise <[EMAIL PROTECTED]>
---

 .../backport/2.6.17/include/src/rdma_netevents.c   |   91 
+++++++++++++++++++++++
 .../2.6.17/addr_1_netevents_revert_to_2_6_17.patch |   76 -------------------
 .../backport/2.6.17/linux_stuff_to_2_6_17.patch    |   13 ++-
 3 files changed, 99 insertions(+), 81 deletions(-)

diff --git a/kernel_addons/backport/2.6.17/include/src/rdma_netevents.c 
b/kernel_addons/backport/2.6.17/include/src/rdma_netevents.c
new file mode 100644
index 0000000..1e9422f
--- /dev/null
+++ b/kernel_addons/backport/2.6.17/include/src/rdma_netevents.c
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2007 Open Grid Computing, Inc.  All rights reserved.
+ * Copyright (c) 2007 Chelsio Communications, Inc.  All rights reserved.
+ *
+ * This Software is licensed under one of the following licenses:
+ *
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is
+ *    available from the Open Source Initiative, see
+ *    http://www.opensource.org/licenses/cpl.php.
+ *
+ * 2) under the terms of the "The BSD License" a copy of which is
+ *    available from the Open Source Initiative, see
+ *    http://www.opensource.org/licenses/bsd-license.php.
+ *
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
+ *    copy of which is available from the Open Source Initiative, see
+ *    http://www.opensource.org/licenses/gpl-license.php.
+ *
+ * Licensee has the right to choose one of the above licenses.
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice and one of the license notices.
+ *
+ * Redistributions in binary form must reproduce both the above copyright
+ * notice, one of the license notices in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ */
+
+/*
+ * Simulate neighbour update netevents by snooping ARP packets.
+ */
+
+#include <linux/if.h>
+#include <linux/netdevice.h>
+#include <linux/if_arp.h>
+
+#include <net/arp.h>
+#include <net/neighbour.h>
+#include <net/route.h>
+#include <net/netevent.h>
+
+MODULE_AUTHOR("Steve Wise");
+MODULE_DESCRIPTION("Netevent Notification Module");
+MODULE_LICENSE("Dual BSD/GPL");
+
+static int arp_recv(struct sk_buff *skb, struct net_device *dev,
+                        struct packet_type *pkt, struct net_device *dev2)
+{
+       struct arphdr *arp_hdr;
+       struct neighbour *n;
+       u8 *arp_ptr;
+       __be32 gw;
+       u16 op;
+
+       arp_hdr = (struct arphdr *) skb->nh.raw;
+       op = ntohs(arp_hdr->ar_op);
+
+       if (op == ARPOP_REQUEST || op == ARPOP_REPLY) {
+               arp_ptr = (u8 *)(arp_hdr + 1);  /* skip fixed-size arp header */
+               arp_ptr += skb->dev->addr_len;  /* skip src ha */
+               memcpy(&gw, arp_ptr, 4);        /* pull the SPA */
+               n = neigh_lookup(&arp_tbl, &gw, skb->dev);
+               if (n) {
+                       call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, n);
+               }
+       }
+
+       kfree_skb(skb);
+       return 0;
+}
+
+static struct packet_type arp = {
+       .type = __constant_htons(ETH_P_ARP),
+       .func = arp_recv,
+       .af_packet_priv = (void *)1,
+};
+
+static int init(void)
+{
+       dev_add_pack(&arp);
+       return 0;
+}
+
+static void cleanup(void)
+{
+       dev_remove_pack(&arp);
+}
+
+module_init(init);
+module_exit(cleanup);
diff --git 
a/kernel_patches/backport/2.6.17/addr_1_netevents_revert_to_2_6_17.patch 
b/kernel_patches/backport/2.6.17/addr_1_netevents_revert_to_2_6_17.patch
deleted file mode 100644
index 316d8d2..0000000
--- a/kernel_patches/backport/2.6.17/addr_1_netevents_revert_to_2_6_17.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-commit e795d092507d571d66f2ec98d3efdc7dd284bf80
-Author: Tom Tucker <[EMAIL PROTECTED]>
-Date:   Sun Jul 30 20:44:19 2006 -0700
-
-    [NET] infiniband: Cleanup ib_addr module to use the netevents
-    
-    Signed-off-by: Tom Tucker <[EMAIL PROTECTED]>
-    Signed-off-by: Steve Wise <[EMAIL PROTECTED]>
-    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
-
-diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c
-index 1205e80..d294bbc 100644
---- a/drivers/infiniband/core/addr.c
-+++ b/drivers/infiniband/core/addr.c
-@@ -35,7 +35,6 @@ #include <linux/if_arp.h>
- #include <net/arp.h>
- #include <net/neighbour.h>
- #include <net/route.h>
--#include <net/netevent.h>
- #include <rdma/ib_addr.h>
- 
- MODULE_AUTHOR("Sean Hefty");
-@@ -327,22 +326,25 @@ void rdma_addr_cancel(struct rdma_dev_ad
- }
- EXPORT_SYMBOL(rdma_addr_cancel);
- 
--static int netevent_callback(struct notifier_block *self, unsigned long 
event, 
--      void *ctx)
-+static int addr_arp_recv(struct sk_buff *skb, struct net_device *dev,
-+                       struct packet_type *pkt, struct net_device *orig_dev)
- {
--      if (event == NETEVENT_NEIGH_UPDATE) {  
--              struct neighbour *neigh = ctx;
-+      struct arphdr *arp_hdr;
- 
--              if (neigh->dev->type == ARPHRD_INFINIBAND &&
--                  (neigh->nud_state & NUD_VALID)) {
--                      set_timeout(jiffies);
--              }
--      }
-+      arp_hdr = (struct arphdr *) skb->nh.raw;
-+
-+      if (arp_hdr->ar_op == htons(ARPOP_REQUEST) ||
-+          arp_hdr->ar_op == htons(ARPOP_REPLY))
-+              set_timeout(jiffies);
-+
-+      kfree_skb(skb);
-       return 0;
- }
- 
--static struct notifier_block nb = {
--      .notifier_call = netevent_callback
-+static struct packet_type addr_arp = {
-+      .type           = __constant_htons(ETH_P_ARP),
-+      .func           = addr_arp_recv,
-+      .af_packet_priv = (void*) 1,
- };
- 
- static int addr_init(void)
-@@ -351,13 +353,13 @@ static int addr_init(void)
-       if (!addr_wq)
-               return -ENOMEM;
- 
--      register_netevent_notifier(&nb);
-+      dev_add_pack(&addr_arp);
-       return 0;
- }
- 
- static void addr_cleanup(void)
- {
--      unregister_netevent_notifier(&nb);
-+      dev_remove_pack(&addr_arp);
-       destroy_workqueue(addr_wq);
- }
- 
-
diff --git a/kernel_patches/backport/2.6.17/linux_stuff_to_2_6_17.patch 
b/kernel_patches/backport/2.6.17/linux_stuff_to_2_6_17.patch
index eb2285f..af7e814 100644
--- a/kernel_patches/backport/2.6.17/linux_stuff_to_2_6_17.patch
+++ b/kernel_patches/backport/2.6.17/linux_stuff_to_2_6_17.patch
@@ -5,20 +5,23 @@ index 0000000..58cf933
 +++ b/drivers/infiniband/core/genalloc.c
 @@ -0,0 +1 @@
 +#include "src/genalloc.c"
-diff --git a/drivers/infiniband/core/netevent.c 
b/drivers/infiniband/core/netevent.c
+diff --git a/drivers/infiniband/core/rdma_netevents.c 
b/drivers/infiniband/core/rdma_netevents.c
 new file mode 100644
 index 0000000..58cf933
 --- /dev/null
-+++ b/drivers/infiniband/core/netevent.c
-@@ -0,0 +1 @@
++++ b/drivers/infiniband/core/rdma_netevents.c
+@@ -0,0 +1,2 @@
 +#include "src/netevent.c"
++#include "src/rdma_netevents.c"
 diff --git a/drivers/infiniband/core/Makefile 
b/drivers/infiniband/core/Makefile
 index 50fb1cd..456bfd0 100644
 --- a/drivers/infiniband/core/Makefile
 +++ b/drivers/infiniband/core/Makefile
-@@ -30,3 +30,5 @@ ib_ucm-y :=                  ucm.o
+@@ -30,3 +30,7 @@ ib_ucm-y :=                  ucm.o
  
  ib_uverbs-y :=                        uverbs_main.o uverbs_cmd.o uverbs_mem.o 
\
                                uverbs_marshall.o
 +
-+ib_core-y +=                  genalloc.o netevent.o
++infiniband-$(CONFIG_INFINIBAND_ADDR_TRANS) += rdma_ne.o
++rdma_ne-y :=                  rdma_netevents.o
++ib_core-y +=                  genalloc.o 


_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to