Re: [PATCH] Resetting packet statistics

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: David S. Miller
Sent: 11/28/2005 11:02:24 PM
> Or, you can create a new call that says "from now on, do not
> reset statistics on calls using this socket."  That's another
> clean, and backwards compatible way, to deal with this
> kind of issue.

I like that one. Here are the updated patches and descriptions:

PACKET_AUTO_STATISTICS (default) lets the kernel reset the stats with each call
of PACKET_STATISTICS and PACKET_MANUAL_STATISTICS won't reset them unless
PACKET_RESET_STATISTICS is called. AUTO and MANUAL can be called multiple times
to change the "state" if necessary.

I didn't check for auto_reset_stats under PACKET_RESET_STATISTICS so it can still
be used to reset the stats while in "auto mode".

Also, just to be sure, is changing PACKET_COPY_THRESH's value in if_packet.h
okay?


Thanks a lot!


--- x/net/packet/af_packet.c	2005-10-27 19:02:08.000000000 -0500
+++ y/net/packet/af_packet.c	2005-11-29 03:02:19.000000000 -0600
@@ -41,6 +41,12 @@
  *					will simply extend the hardware address
  *					byte arrays at the end of sockaddr_ll 
  *					and packet_mreq.
+ *		Kris Katterjohn :	Added setsockopt options:
+ *					PACKET_AUTO_STATISTICS,
+ *					PACKET_MANUAL_STATISTICS, and
+ *					PACKET_RESET_STATISTICS	to handle the
+ *					zero-ing of packet stats when using
+ *					PACKET_STATISTICS. 2005-11-29.
  *
  *		This program is free software; you can redistribute it and/or
  *		modify it under the terms of the GNU General Public License
@@ -189,6 +195,7 @@ struct packet_sock {
 	/* struct sock has to be the first member of packet_sock */
 	struct sock		sk;
 	struct tpacket_stats	stats;
+	int			auto_reset_stats;
 #ifdef CONFIG_PACKET_MMAP
 	char *			*pg_vec;
 	unsigned int		head;
@@ -1020,6 +1027,7 @@ static int packet_create(struct socket *
 	po = pkt_sk(sk);
 	sk->sk_family = PF_PACKET;
 	po->num = protocol;
+	po->auto_reset_stats = 1;
 
 	sk->sk_destruct = packet_sock_destruct;
 	atomic_inc(&packet_socks_nr);
@@ -1324,6 +1332,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)
@@ -1352,6 +1361,21 @@ packet_setsockopt(struct socket *sock, i
 		return ret;
 	}
 #endif
+
+	case PACKET_AUTO_STATISTICS:
+		po->auto_reset_stats = 1;
+		return 0;
+
+	case PACKET_MANUAL_STATISTICS:
+		po->auto_reset_stats = 0;
+		return 0;
+
+	case PACKET_RESET_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:
 	{
@@ -1406,7 +1430,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->auto_reset_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	2005-10-27 19:02:08.000000000 -0500
+++ y/include/linux/if_packet.h	2005-11-29 03:02:19.000000000 -0600
@@ -38,7 +38,10 @@ struct sockaddr_ll
 /* Value 4 is still used by obsolete turbo-packet. */
 #define PACKET_RX_RING			5
 #define PACKET_STATISTICS		6
-#define PACKET_COPY_THRESH		7
+#define PACKET_AUTO_STATISTICS		7
+#define PACKET_MANUAL_STATISTICS	8
+#define PACKET_RESET_STATISTICS		9
+#define PACKET_COPY_THRESH		10
 
 struct tpacket_stats
 {


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux