This adds some setsockopt(SOL_PACKET) options for changing the behavior when
getting packet statistics from the kernel.
Signed-off-by: Kris Katterjohn <[EMAIL PROTECTED]>
This is a diff from 2.6.15 and I AM subscribed to netdev, so you dont' need to
CC me anymore.
I sent this to the linux-kernel mailing-list at the end of November, so I'm
resending it here now.
This adds PACKET_AUTO_STATISTICS, PACKET_MANUAL_STATISTICS, and
PACKET_RESET_STATISTICS setsockopt() options.
PACKET_AUTO_STATISTICS is the default and the kernel will zero the packet
statistics when the PACKET_STATISTICS getsockopt() call is used.
PACKET_MANUAL_STATISTICS changes is so that the kernel won't zero the stats
unless you use PACKET_RESET_STATISTICS or call PACKET_AUTO_STATISTICS to go
back to the default behavior.
This way you don't have to keep track of the stats in userland if you use
PACKET_MANUAL_STATISTICS/PACKET_RESET_STATISTICS.
You can zero the stats with PACKET_RESET_STATISTICS even if you are in "AUTO"
mode.
Thanks!
--- x/net/packet/af_packet.c 2006-01-07 11:31:07.000000000 -0600
+++ y/net/packet/af_packet.c 2006-01-07 11:28:56.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 2006-01-02 21:21:10.000000000 -0600
+++ y/include/linux/if_packet.h 2006-01-07 11:43:47.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 netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html