From: YOSHIFUJI Hideaki
Sent: 1/25/2006 1:34:19 PM
> Hello.
>
> In article <[EMAIL PROTECTED]> (at Wed, 25 Jan 2006 09:13:26 -0800), "Kris
> Katterjohn" <[EMAIL PROTECTED]> says:
>
>
> > +
> > + case PACKET_ACCUMULATE_STATISTICS:
> > + {
> > + int val;
> > +
> > + if (optlen != sizeof(val))
> > + return -EINVAL;
>
> I think this is too strict.
> if (optlen < sizeof(val))
> return -EINVAL;
> if (optlen > sizeof(val))
> optlen = sizeof(val);
>
> > + if (copy_from_user(&val, optval, optlen))
> > + return -EFAULT;
> > +
> > + po->accumulate_stats = !!val;
> > + return 0;
> > + }
> > +
> > + case PACKET_STATISTICS:
> > + spin_lock_bh(&sk->sk_receive_queue.lock);
> > + memset(&po->stats, 0, sizeof(po->stats));
> > + spin_unlock_bh(&sk->sk_receive_queue.lock);
> > + return 0;
> > +
> > #ifdef CONFIG_PACKET_MMAP
> > case PACKET_RX_RING:
> > {
> > @@ -1399,6 +1425,15 @@ static int packet_getsockopt(struct sock
> > return -EINVAL;
> >
> > switch(optname) {
> > + case PACKET_ACCUMULATE_STATISTICS:
> > + {
> > + if (len != sizeof(po->accumulate_stats))
> > + return -EINVAL;
>
> This does not conform to POSIX.
>
> if (len > sizeof(po->accumulate_stats))
> len = sizeof(po->accumulate_stats);
>
>
> Otherwise, it seems fine to me.
>
> Signed-off-by: YOSHIFUJI Hideaki <[EMAIL PROTECTED]>
Okey-dokey.
Signed-off-by: Kris Katterjohn <[EMAIL PROTECTED]>
--- x/net/packet/af_packet.c 2006-01-25 15:48:17.000000000 -0600
+++ y/net/packet/af_packet.c 2006-01-25 15:48:12.000000000 -0600
@@ -41,6 +41,9 @@
* will simply extend the hardware address
* byte arrays at the end of sockaddr_ll
* and packet_mreq.
+ * Kris Katterjohn : Added PACKET_ACCUMULATE_STATISTICS
+ * [gs]etsockopt options and added
+ * PACKET_STATISTICS setsockopt option.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -190,6 +193,7 @@ struct packet_sock {
/* struct sock has to be the first member of packet_sock */
struct sock sk;
struct tpacket_stats stats;
+ int accumulate_stats;
#ifdef CONFIG_PACKET_MMAP
char * *pg_vec;
unsigned int head;
@@ -1021,6 +1025,7 @@ static int packet_create(struct socket *
po = pkt_sk(sk);
sk->sk_family = PF_PACKET;
po->num = protocol;
+ po->accumulate_stats = 0;
sk->sk_destruct = packet_sock_destruct;
atomic_inc(&packet_socks_nr);
@@ -1325,6 +1330,7 @@ static int
packet_setsockopt(struct socket *sock, int level, int optname, char __user
*optval, int optlen)
{
struct sock *sk = sock->sk;
+ struct packet_sock *po = pkt_sk(sk);
int ret;
if (level != SOL_PACKET)
@@ -1353,6 +1359,28 @@ packet_setsockopt(struct socket *sock, i
return ret;
}
#endif
+
+ case PACKET_ACCUMULATE_STATISTICS:
+ {
+ int val;
+
+ if (optlen < sizeof(val))
+ return -EINVAL;
+ if (optlen > sizeof(val))
+ optlen = sizeof(val);
+ if (copy_from_user(&val, optval, optlen))
+ return -EFAULT;
+
+ po->accumulate_stats = !!val;
+ return 0;
+ }
+
+ case PACKET_STATISTICS:
+ spin_lock_bh(&sk->sk_receive_queue.lock);
+ memset(&po->stats, 0, sizeof(po->stats));
+ spin_unlock_bh(&sk->sk_receive_queue.lock);
+ return 0;
+
#ifdef CONFIG_PACKET_MMAP
case PACKET_RX_RING:
{
@@ -1399,6 +1427,17 @@ static int packet_getsockopt(struct sock
return -EINVAL;
switch(optname) {
+ case PACKET_ACCUMULATE_STATISTICS:
+ {
+ if (len < sizeof(po->accumulate_stats))
+ return -EINVAL;
+ if (len > sizeof(po->accumulate_stats))
+ len = sizeof(po->accumulate_stats);
+ if (copy_to_user(optval, &po->accumulate_stats, len))
+ return -EFAULT;
+ break;
+ }
+
case PACKET_STATISTICS:
{
struct tpacket_stats st;
@@ -1407,7 +1446,8 @@ static int packet_getsockopt(struct sock
len = sizeof(struct tpacket_stats);
spin_lock_bh(&sk->sk_receive_queue.lock);
st = po->stats;
- memset(&po->stats, 0, sizeof(st));
+ if (!po->accumulate_stats)
+ memset(&po->stats, 0, sizeof(po->stats));
spin_unlock_bh(&sk->sk_receive_queue.lock);
st.tp_packets += st.tp_drops;
--- x/include/linux/if_packet.h 2006-01-24 18:27:41.000000000 -0600
+++ y/include/linux/if_packet.h 2006-01-25 11:00:34.000000000 -0600
@@ -39,6 +39,7 @@ struct sockaddr_ll
#define PACKET_RX_RING 5
#define PACKET_STATISTICS 6
#define PACKET_COPY_THRESH 7
+#define PACKET_ACCUMULATE_STATISTICS 8
struct tpacket_stats
{
-
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