Hello.
In article <[EMAIL PROTECTED]> (at Wed, 25 Jan 2006 20:25:56 -0800), "Kris
Katterjohn" <[EMAIL PROTECTED]> says:
> Okey-dokey.
>
> Signed-off-by: Kris Katterjohn <[EMAIL PROTECTED]>
Signed-off-by: YOSHIFUJI Hideaki <[EMAIL PROTECTED]>
> --- x/net/packet/af_packet.c 2006-01-25 22:18:41.000000000 -0600
> +++ y/net/packet/af_packet.c 2006-01-25 22:18:57.000000000 -0600
> @@ -190,6 +190,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;
> @@ -1325,6 +1326,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 +1355,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 +1423,15 @@ static int packet_getsockopt(struct sock
> return -EINVAL;
>
> switch(optname) {
> + case PACKET_ACCUMULATE_STATISTICS:
> + {
> + 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 +1440,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
> {
--
YOSHIFUJI Hideaki @ USAGI Project <[EMAIL PROTECTED]>
GPG-FP : 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA
-
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