lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1282811972.2476.146.camel@edumazet-laptop>
Date:	Thu, 26 Aug 2010 10:39:32 +0200
From:	Eric Dumazet <eric.dumazet@...il.com>
To:	Tobias Klauser <tklauser@...tanz.ch>
Cc:	"David S. Miller" <davem@...emloft.net>, netdev@...r.kernel.org
Subject: Re: [PATCH v2] slip: Use net_device_stats from struct net_device

Le jeudi 26 août 2010 à 10:28 +0200, Tobias Klauser a écrit :
> Use net_device->stats for stats instead of private variable copies in
> struct slip.
> 
> Cc: Eric Dumazet <eric.dumazet@...il.com>
> Signed-off-by: Tobias Klauser <tklauser@...tanz.ch>
> ---
>  drivers/net/slip.c |   47 ++++++++++++++++++++---------------------------
>  drivers/net/slip.h |    9 ---------
>  2 files changed, 20 insertions(+), 36 deletions(-)
> 
> diff --git a/drivers/net/slip.c b/drivers/net/slip.c
> index d5a36f5..9512da8 100644
> --- a/drivers/net/slip.c
> +++ b/drivers/net/slip.c
> @@ -271,7 +271,7 @@ static int sl_realloc_bufs(struct slip *sl, int mtu)
>  			memcpy(sl->xbuff, sl->xhead, sl->xleft);
>  		} else  {
>  			sl->xleft = 0;
> -			sl->tx_dropped++;
> +			dev->stats.tx_dropped++;
>  		}
>  	}
>  	sl->xhead = sl->xbuff;
> @@ -281,7 +281,7 @@ static int sl_realloc_bufs(struct slip *sl, int mtu)
>  			memcpy(sl->rbuff, rbuff, sl->rcount);
>  		} else  {
>  			sl->rcount = 0;
> -			sl->rx_over_errors++;
> +			dev->stats.rx_over_errors++;
>  			set_bit(SLF_ERROR, &sl->flags);
>  		}
>  	}
> @@ -319,6 +319,7 @@ static inline void sl_unlock(struct slip *sl)
>  /* Send one completely decapsulated IP datagram to the IP layer. */
>  static void sl_bump(struct slip *sl)
>  {
> +	struct net_device *dev = sl->dev;
>  	struct sk_buff *skb;
>  	int count;
>  
> @@ -329,13 +330,13 @@ static void sl_bump(struct slip *sl)
>  		if (c & SL_TYPE_COMPRESSED_TCP) {
>  			/* ignore compressed packets when CSLIP is off */
>  			if (!(sl->mode & SL_MODE_CSLIP)) {
> -				printk(KERN_WARNING "%s: compressed packet ignored\n", sl->dev->name);
> +				printk(KERN_WARNING "%s: compressed packet ignored\n", dev->name);
>  				return;
>  			}
>  			/* make sure we've reserved enough space for uncompress
>  			   to use */
>  			if (count + 80 > sl->buffsize) {
> -				sl->rx_over_errors++;
> +				dev->stats.rx_over_errors++;
>  				return;
>  			}
>  			count = slhc_uncompress(sl->slcomp, sl->rbuff, count);
> @@ -346,7 +347,7 @@ static void sl_bump(struct slip *sl)
>  				/* turn on header compression */
>  				sl->mode |= SL_MODE_CSLIP;
>  				sl->mode &= ~SL_MODE_ADAPTIVE;
> -				printk(KERN_INFO "%s: header compression turned on\n", sl->dev->name);
> +				printk(KERN_INFO "%s: header compression turned on\n", dev->name);
>  			}
>  			sl->rbuff[0] &= 0x4f;
>  			if (slhc_remember(sl->slcomp, sl->rbuff, count) <= 0)
> @@ -355,20 +356,20 @@ static void sl_bump(struct slip *sl)
>  	}
>  #endif  /* SL_INCLUDE_CSLIP */
>  
> -	sl->rx_bytes += count;
> +	dev->stats.rx_bytes += count;
>  
>  	skb = dev_alloc_skb(count);
>  	if (skb == NULL) {
> -		printk(KERN_WARNING "%s: memory squeeze, dropping packet.\n", sl->dev->name);
> -		sl->rx_dropped++;
> +		printk(KERN_WARNING "%s: memory squeeze, dropping packet.\n", dev->name);
> +		dev->stats.rx_dropped++;
>  		return;
>  	}
> -	skb->dev = sl->dev;
> +	skb->dev = dev;
>  	memcpy(skb_put(skb, count), sl->rbuff, count);
>  	skb_reset_mac_header(skb);
>  	skb->protocol = htons(ETH_P_IP);
>  	netif_rx(skb);
> -	sl->rx_packets++;
> +	dev->stats.rx_packets++;
>  }
>  
>  /* Encapsulate one IP datagram and stuff into a TTY queue. */
> @@ -379,7 +380,7 @@ static void sl_encaps(struct slip *sl, unsigned char *icp, int len)
>  
>  	if (len > sl->mtu) {		/* Sigh, shouldn't occur BUT ... */
>  		printk(KERN_WARNING "%s: truncating oversized transmit packet!\n", sl->dev->name);
> -		sl->tx_dropped++;
> +		sl->dev->stats.tx_dropped++;
>  		sl_unlock(sl);
>  		return;
>  	}
> @@ -433,7 +434,7 @@ static void slip_write_wakeup(struct tty_struct *tty)
>  	if (sl->xleft <= 0)  {
>  		/* Now serial buffer is almost free & we can start
>  		 * transmission of another packet */
> -		sl->tx_packets++;
> +		sl->dev->stats.tx_packets++;
>  		clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
>  		sl_unlock(sl);
>  		return;
> @@ -496,7 +497,7 @@ sl_xmit(struct sk_buff *skb, struct net_device *dev)
>  	}
>  
>  	sl_lock(sl);
> -	sl->tx_bytes += skb->len;
> +	dev->stats.tx_bytes += skb->len;
>  	sl_encaps(sl, skb->data, skb->len);
>  	spin_unlock(&sl->lock);
>  
> @@ -562,12 +563,12 @@ static struct net_device_stats *
>  sl_get_stats(struct net_device *dev)
>  {
>  	struct net_device_stats *stats = &dev->stats;
> -	struct slip *sl = netdev_priv(dev);
> -	unsigned long c_rx_dropped = 0;
>  #ifdef SL_INCLUDE_CSLIP
> +	unsigned long c_rx_dropped = 0;
>  	unsigned long c_rx_fifo_errors = 0;
>  	unsigned long c_tx_fifo_errors = 0;
>  	unsigned long c_collisions = 0;
> +	struct slip *sl = netdev_priv(dev);
>  	struct slcompress *comp = sl->slcomp;
>  
>  	if (comp) {
> @@ -579,17 +580,9 @@ sl_get_stats(struct net_device *dev)
>  	stats->rx_fifo_errors = sl->rx_compressed + c_rx_fifo_errors;
>  	stats->tx_fifo_errors = sl->tx_compressed + c_tx_fifo_errors;
>  	stats->collisions     = sl->tx_misses + c_collisions;
> +	stats->rx_dropped    += c_rx_dropped;

Sorry this bit is wrong.

You cannot do "stats->somefield += somevalue", since its cumulative for
each call to "cat /proc/net/dev"


>  #endif
>  
> -	stats->rx_packets     = sl->rx_packets;
> -	stats->tx_packets     = sl->tx_packets;
> -	stats->rx_bytes	      = sl->rx_bytes;
> -	stats->tx_bytes	      = sl->tx_bytes;
> -	stats->rx_dropped     = sl->rx_dropped + c_rx_dropped;
> -	stats->tx_dropped     = sl->tx_dropped;
> -	stats->tx_errors      = sl->tx_errors;
> -	stats->rx_errors      = sl->rx_errors;
> -	stats->rx_over_errors = sl->rx_over_errors;
>  	return stats;
>  }
>  
> @@ -681,7 +674,7 @@ static void slip_receive_buf(struct tty_struct *tty, const unsigned char *cp,
>  	while (count--) {
>  		if (fp && *fp++) {
>  			if (!test_and_set_bit(SLF_ERROR, &sl->flags))
> -				sl->rx_errors++;
> +				sl->dev->stats.rx_errors++;
>  			cp++;
>  			continue;
>  		}
> @@ -981,7 +974,7 @@ static void slip_unesc(struct slip *sl, unsigned char s)
>  			sl->rbuff[sl->rcount++] = s;
>  			return;
>  		}
> -		sl->rx_over_errors++;
> +		sl->dev->stats.rx_over_errors++;
>  		set_bit(SLF_ERROR, &sl->flags);
>  	}
>  }
> @@ -1057,7 +1050,7 @@ static void slip_unesc6(struct slip *sl, unsigned char s)
>  					sl->rbuff[sl->rcount++] = c;
>  					return;
>  				}
> -				sl->rx_over_errors++;
> +				sl->dev->stats.rx_over_errors++;
>  				set_bit(SLF_ERROR, &sl->flags);
>  			}
>  		}
> diff --git a/drivers/net/slip.h b/drivers/net/slip.h
> index 9ea5c11..914e958 100644
> --- a/drivers/net/slip.h
> +++ b/drivers/net/slip.h
> @@ -67,15 +67,6 @@ struct slip {
>    int                   xleft;          /* bytes left in XMIT queue     */
>  
>    /* SLIP interface statistics. */
> -  unsigned long		rx_packets;	/* inbound frames counter	*/
> -  unsigned long         tx_packets;     /* outbound frames counter      */
> -  unsigned long		rx_bytes;	/* inbound byte counte		*/
> -  unsigned long         tx_bytes;       /* outbound byte counter	*/
> -  unsigned long         rx_errors;      /* Parity, etc. errors          */
> -  unsigned long         tx_errors;      /* Planned stuff                */
> -  unsigned long         rx_dropped;     /* No memory for skb            */
> -  unsigned long         tx_dropped;     /* When MTU change              */
> -  unsigned long         rx_over_errors; /* Frame bigger than SLIP buf.  */
>  #ifdef SL_INCLUDE_CSLIP
>    unsigned long		tx_compressed;
>    unsigned long		rx_compressed;


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ