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