Hi,

I would like to get comments on this prior to sending this over to
kernel land.

There is a similar change to both:
/usr/include/linux/if_packet.h
/usr/include/netpacket/packet.h
as in:
include/linux/if_packet.h below
to increase sll_addr from 8 to 20 bytes.

Thanks.

-- Hal

IPoIB sockaddr_ll changes due to the fact that the IPoIB link layer
address is 20 bytes rather than 8 bytes

Signed-off-by: Hal Rosenstock <[EMAIL PROTECTED]>

--- include/linux/if_packet.h.orig      2005-06-29 19:00:53.000000000 -0400
+++ include/linux/if_packet.h   2005-08-05 10:04:06.000000000 -0400
@@ -8,6 +8,7 @@ struct sockaddr_pkt
        unsigned short spkt_protocol;
 };
 
+#define SOCKADDR_LL_COMPAT     12
 struct sockaddr_ll
 {
        unsigned short  sll_family;
@@ -16,7 +17,7 @@ struct sockaddr_ll
        unsigned short  sll_hatype;
        unsigned char   sll_pkttype;
        unsigned char   sll_halen;
-       unsigned char   sll_addr[8];
+       unsigned char   sll_addr[20];
 };
 
 /* Packet types */

--- net/packet/af_packet.c.orig 2005-06-29 19:00:53.000000000 -0400
+++ net/packet/af_packet.c      2005-08-05 11:23:24.000000000 -0400
@@ -140,7 +140,7 @@ dev->hard_header == NULL (ll header is a
    mac.raw -> data
    data -> data
 
-   We should set nh.raw on output to correct posistion,
+   We should set nh.raw on output to correct position,
    packet classifier depends on it.
  */
 
@@ -315,7 +315,7 @@ static int packet_sendmsg_spkt(struct ki
        struct net_device *dev;
        unsigned short proto=0;
        int err;
-       
+
        /*
         *      Get and verify the address. 
         */
@@ -708,8 +708,11 @@ static int packet_sendmsg(struct kiocb *
                addr    = NULL;
        } else {
                err = -EINVAL;
-               if (msg->msg_namelen < sizeof(struct sockaddr_ll))
-                       goto out;
+               if (msg->msg_namelen < sizeof(struct sockaddr_ll)) {
+                       /* Support for older sockaddr_ll structs */
+                       if ((msg->msg_namelen != sizeof(struct sockaddr_ll) - 
SOCKADDR_LL_COMPAT) || (saddr->sll_hatype == ARPHRD_INFINIBAND))
+                               goto out;
+               }
                ifindex = saddr->sll_ifindex;
                proto   = saddr->sll_protocol;
                addr    = saddr->sll_addr;
@@ -937,7 +940,9 @@ static int packet_bind(struct socket *so
         */
         
        if (addr_len < sizeof(struct sockaddr_ll))
-               return -EINVAL;
+               if ((addr_len != sizeof(struct sockaddr_ll) - 
SOCKADDR_LL_COMPAT) || 
+                               (sll->sll_hatype == ARPHRD_INFINIBAND))
+                       return -EINVAL;
        if (sll->sll_family != AF_PACKET)
                return -EINVAL;
 



_______________________________________________
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