diff options
| author | David S. Miller <davem@davemloft.net> | 2015-07-12 22:24:01 -0700 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2015-07-12 22:24:01 -0700 | 
| commit | cee9f6d0186a586c8023bc91c8a4cf8a088855e5 (patch) | |
| tree | 70847d330cb2c34515f5fa0b7128a2af6b188783 /net | |
| parent | 76b63da9666fb3fa786ff76a50d29abbe3d706b8 (diff) | |
| parent | d3b58c47d330de8c29898fe9746f7530408f8a59 (diff) | |
| download | linux-cee9f6d0186a586c8023bc91c8a4cf8a088855e5.tar.bz2 | |
Merge tag 'linux-can-fixes-for-4.2-20150712' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can
Marc Kleine-Budde says:
====================
pull-request: can 2015-07-12
this is a pull request of 8 patchs for net/master.
Sergei Shtylyov contributes 5 patches for the rcar_can driver, fixing the IRQ
check and several info and error messages. There are two patches by J.D.
Schroeder and Roger Quadros for the c_can driver and dra7x-evm device tree,
which precent a glitch in the DCAN1 pinmux. Oliver Hartkopp provides a better
approach to make the CAN skbs unique, the timestamp is replaced by a counter.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
| -rw-r--r-- | net/can/af_can.c | 12 | ||||
| -rw-r--r-- | net/can/bcm.c | 2 | ||||
| -rw-r--r-- | net/can/raw.c | 7 | 
3 files changed, 13 insertions, 8 deletions
| diff --git a/net/can/af_can.c b/net/can/af_can.c index 7933e62a7318..166d436196c1 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c @@ -89,6 +89,8 @@ struct timer_list can_stattimer;   /* timer for statistics update */  struct s_stats    can_stats;       /* packet statistics */  struct s_pstats   can_pstats;      /* receive list statistics */ +static atomic_t skbcounter = ATOMIC_INIT(0); +  /*   * af_can socket functions   */ @@ -310,12 +312,8 @@ int can_send(struct sk_buff *skb, int loop)  		return err;  	} -	if (newskb) { -		if (!(newskb->tstamp.tv64)) -			__net_timestamp(newskb); - +	if (newskb)  		netif_rx_ni(newskb); -	}  	/* update statistics */  	can_stats.tx_frames++; @@ -683,6 +681,10 @@ static void can_receive(struct sk_buff *skb, struct net_device *dev)  	can_stats.rx_frames++;  	can_stats.rx_frames_delta++; +	/* create non-zero unique skb identifier together with *skb */ +	while (!(can_skb_prv(skb)->skbcnt)) +		can_skb_prv(skb)->skbcnt = atomic_inc_return(&skbcounter); +  	rcu_read_lock();  	/* deliver the packet to sockets listening on all devices */ diff --git a/net/can/bcm.c b/net/can/bcm.c index b523453585be..a1ba6875c2a2 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c @@ -261,6 +261,7 @@ static void bcm_can_tx(struct bcm_op *op)  	can_skb_reserve(skb);  	can_skb_prv(skb)->ifindex = dev->ifindex; +	can_skb_prv(skb)->skbcnt = 0;  	memcpy(skb_put(skb, CFSIZ), cf, CFSIZ); @@ -1217,6 +1218,7 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk)  	}  	can_skb_prv(skb)->ifindex = dev->ifindex; +	can_skb_prv(skb)->skbcnt = 0;  	skb->dev = dev;  	can_skb_set_owner(skb, sk);  	err = can_send(skb, 1); /* send with loopback */ diff --git a/net/can/raw.c b/net/can/raw.c index 31b9748cbb4e..2e67b1423cd3 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -75,7 +75,7 @@ MODULE_ALIAS("can-proto-1");   */  struct uniqframe { -	ktime_t tstamp; +	int skbcnt;  	const struct sk_buff *skb;  	unsigned int join_rx_count;  }; @@ -133,7 +133,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data)  	/* eliminate multiple filter matches for the same skb */  	if (this_cpu_ptr(ro->uniq)->skb == oskb && -	    ktime_equal(this_cpu_ptr(ro->uniq)->tstamp, oskb->tstamp)) { +	    this_cpu_ptr(ro->uniq)->skbcnt == can_skb_prv(oskb)->skbcnt) {  		if (ro->join_filters) {  			this_cpu_inc(ro->uniq->join_rx_count);  			/* drop frame until all enabled filters matched */ @@ -144,7 +144,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data)  		}  	} else {  		this_cpu_ptr(ro->uniq)->skb = oskb; -		this_cpu_ptr(ro->uniq)->tstamp = oskb->tstamp; +		this_cpu_ptr(ro->uniq)->skbcnt = can_skb_prv(oskb)->skbcnt;  		this_cpu_ptr(ro->uniq)->join_rx_count = 1;  		/* drop first frame to check all enabled filters? */  		if (ro->join_filters && ro->count > 1) @@ -749,6 +749,7 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)  	can_skb_reserve(skb);  	can_skb_prv(skb)->ifindex = dev->ifindex; +	can_skb_prv(skb)->skbcnt = 0;  	err = memcpy_from_msg(skb_put(skb, size), msg, size);  	if (err < 0) |