From: "David S. Miller" <[EMAIL PROTECTED]>
Subject: Re: [PATCH] Packet socket: fix for 64-bit kernel and 32-bit userland
Date: Tue, 07 Feb 2006 21:48:02 -0800 (PST)

> From: FUJITA Tomonori <[EMAIL PROTECTED]>
> Date: Wed, 08 Feb 2006 14:41:41 +0900
> 
> > From: "David S. Miller" <[EMAIL PROTECTED]>
> > Subject: Re: [PATCH] Packet socket: fix for 64-bit kernel and 32-bit 
> > userland
> > Date: Tue, 07 Feb 2006 21:36:06 -0800 (PST)
> > 
> > > > tpacket_hdr structure includes 'unsigned long' though kernel and
> > > > userland shares it in the mmapped ring buffer.
> > > > 
> > > > Seems it would be better to fix all data structures in the header file
> > > > than fixing only tpacket_hdr structure.
> > > > 
> > > > Signed-off-by: FUJITA Tomonori <[EMAIL PROTECTED]>
> > > > Signed-off-by: Mike Christie <[EMAIL PROTECTED]>
> > > 
> > > You broke 64-bit userland by changing that "unsigned long"
> > > to a __u32.
> > 
> > You mean that currently it's broken in 64-bit kernel and 32-bit
> > userland anyway so use __u64 instead of __u32?
> 
> I mean that "unsigned long" is 64-bit in a 64-bit kernel, and thus
> your changes break packet mmap() ringer buffers for native 64-bit
> binaries.

I see. The following patch is OK?


diff --git a/include/linux/if_packet.h b/include/linux/if_packet.h
index b925585..0fc6998 100644
--- a/include/linux/if_packet.h
+++ b/include/linux/if_packet.h
@@ -3,20 +3,20 @@
 
 struct sockaddr_pkt
 {
-       unsigned short spkt_family;
-       unsigned char spkt_device[14];
-       unsigned short spkt_protocol;
+       __u16   spkt_family;
+       __u8    spkt_device[14];
+       __u16   spkt_protocol;
 };
 
 struct sockaddr_ll
 {
-       unsigned short  sll_family;
-       unsigned short  sll_protocol;
-       int             sll_ifindex;
-       unsigned short  sll_hatype;
-       unsigned char   sll_pkttype;
-       unsigned char   sll_halen;
-       unsigned char   sll_addr[8];
+       __u16   sll_family;
+       __u16   sll_protocol;
+       __s32   sll_ifindex;
+       __u16   sll_hatype;
+       __u8    sll_pkttype;
+       __u8    sll_halen;
+       __u8    sll_addr[8];
 };
 
 /* Packet types */
@@ -42,24 +42,24 @@ struct sockaddr_ll
 
 struct tpacket_stats
 {
-       unsigned int    tp_packets;
-       unsigned int    tp_drops;
+       __u32   tp_packets;
+       __u32   tp_drops;
 };
 
 struct tpacket_hdr
 {
-       unsigned long   tp_status;
+       __u64   tp_status;
 #define TP_STATUS_KERNEL       0
 #define TP_STATUS_USER         1
 #define TP_STATUS_COPY         2
 #define TP_STATUS_LOSING       4
 #define TP_STATUS_CSUMNOTREADY 8
-       unsigned int    tp_len;
-       unsigned int    tp_snaplen;
-       unsigned short  tp_mac;
-       unsigned short  tp_net;
-       unsigned int    tp_sec;
-       unsigned int    tp_usec;
+       __u32   tp_len;
+       __u32   tp_snaplen;
+       __u16   tp_mac;
+       __u16   tp_net;
+       __u32   tp_sec;
+       __u32   tp_usec;
 };
 
 #define TPACKET_ALIGNMENT      16
@@ -81,18 +81,18 @@ struct tpacket_hdr
 
 struct tpacket_req
 {
-       unsigned int    tp_block_size;  /* Minimal size of contiguous block */
-       unsigned int    tp_block_nr;    /* Number of blocks */
-       unsigned int    tp_frame_size;  /* Size of frame */
-       unsigned int    tp_frame_nr;    /* Total number of frames */
+       __u32   tp_block_size;  /* Minimal size of contiguous block */
+       __u32   tp_block_nr;    /* Number of blocks */
+       __u32   tp_frame_size;  /* Size of frame */
+       __u32   tp_frame_nr;    /* Total number of frames */
 };
 
 struct packet_mreq
 {
-       int             mr_ifindex;
-       unsigned short  mr_type;
-       unsigned short  mr_alen;
-       unsigned char   mr_address[8];
+       __s32   mr_ifindex;
+       __u16   mr_type;
+       __u16   mr_alen;
+       __u8    mr_address[8];
 };
 
 #define PACKET_MR_MULTICAST    0
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to