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

Reply via email to