diff options
-rw-r--r-- | drivers/net/can/dev.c | 7 | ||||
-rw-r--r-- | drivers/net/can/slcan.c | 2 | ||||
-rw-r--r-- | drivers/net/can/vcan.c | 3 | ||||
-rw-r--r-- | include/linux/can/skb.h | 2 | ||||
-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 |
7 files changed, 18 insertions, 17 deletions
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index e9b1810d319f..aede704605c6 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
@@ -440,9 +440,6 @@ unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx) | |||
440 | struct can_frame *cf = (struct can_frame *)skb->data; | 440 | struct can_frame *cf = (struct can_frame *)skb->data; |
441 | u8 dlc = cf->can_dlc; | 441 | u8 dlc = cf->can_dlc; |
442 | 442 | ||
443 | if (!(skb->tstamp.tv64)) | ||
444 | __net_timestamp(skb); | ||
445 | |||
446 | netif_rx(priv->echo_skb[idx]); | 443 | netif_rx(priv->echo_skb[idx]); |
447 | priv->echo_skb[idx] = NULL; | 444 | priv->echo_skb[idx] = NULL; |
448 | 445 | ||
@@ -578,7 +575,6 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) | |||
578 | if (unlikely(!skb)) | 575 | if (unlikely(!skb)) |
579 | return NULL; | 576 | return NULL; |
580 | 577 | ||
581 | __net_timestamp(skb); | ||
582 | skb->protocol = htons(ETH_P_CAN); | 578 | skb->protocol = htons(ETH_P_CAN); |
583 | skb->pkt_type = PACKET_BROADCAST; | 579 | skb->pkt_type = PACKET_BROADCAST; |
584 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 580 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
@@ -589,6 +585,7 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) | |||
589 | 585 | ||
590 | can_skb_reserve(skb); | 586 | can_skb_reserve(skb); |
591 | can_skb_prv(skb)->ifindex = dev->ifindex; | 587 | can_skb_prv(skb)->ifindex = dev->ifindex; |
588 | can_skb_prv(skb)->skbcnt = 0; | ||
592 | 589 | ||
593 | *cf = (struct can_frame *)skb_put(skb, sizeof(struct can_frame)); | 590 | *cf = (struct can_frame *)skb_put(skb, sizeof(struct can_frame)); |
594 | memset(*cf, 0, sizeof(struct can_frame)); | 591 | memset(*cf, 0, sizeof(struct can_frame)); |
@@ -607,7 +604,6 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, | |||
607 | if (unlikely(!skb)) | 604 | if (unlikely(!skb)) |
608 | return NULL; | 605 | return NULL; |
609 | 606 | ||
610 | __net_timestamp(skb); | ||
611 | skb->protocol = htons(ETH_P_CANFD); | 607 | skb->protocol = htons(ETH_P_CANFD); |
612 | skb->pkt_type = PACKET_BROADCAST; | 608 | skb->pkt_type = PACKET_BROADCAST; |
613 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 609 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
@@ -618,6 +614,7 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, | |||
618 | 614 | ||
619 | can_skb_reserve(skb); | 615 | can_skb_reserve(skb); |
620 | can_skb_prv(skb)->ifindex = dev->ifindex; | 616 | can_skb_prv(skb)->ifindex = dev->ifindex; |
617 | can_skb_prv(skb)->skbcnt = 0; | ||
621 | 618 | ||
622 | *cfd = (struct canfd_frame *)skb_put(skb, sizeof(struct canfd_frame)); | 619 | *cfd = (struct canfd_frame *)skb_put(skb, sizeof(struct canfd_frame)); |
623 | memset(*cfd, 0, sizeof(struct canfd_frame)); | 620 | memset(*cfd, 0, sizeof(struct canfd_frame)); |
diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index f64f5290d6f8..a23a7af8eb9a 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c | |||
@@ -207,7 +207,6 @@ static void slc_bump(struct slcan *sl) | |||
207 | if (!skb) | 207 | if (!skb) |
208 | return; | 208 | return; |
209 | 209 | ||
210 | __net_timestamp(skb); | ||
211 | skb->dev = sl->dev; | 210 | skb->dev = sl->dev; |
212 | skb->protocol = htons(ETH_P_CAN); | 211 | skb->protocol = htons(ETH_P_CAN); |
213 | skb->pkt_type = PACKET_BROADCAST; | 212 | skb->pkt_type = PACKET_BROADCAST; |
@@ -215,6 +214,7 @@ static void slc_bump(struct slcan *sl) | |||
215 | 214 | ||
216 | can_skb_reserve(skb); | 215 | can_skb_reserve(skb); |
217 | can_skb_prv(skb)->ifindex = sl->dev->ifindex; | 216 | can_skb_prv(skb)->ifindex = sl->dev->ifindex; |
217 | can_skb_prv(skb)->skbcnt = 0; | ||
218 | 218 | ||
219 | memcpy(skb_put(skb, sizeof(struct can_frame)), | 219 | memcpy(skb_put(skb, sizeof(struct can_frame)), |
220 | &cf, sizeof(struct can_frame)); | 220 | &cf, sizeof(struct can_frame)); |
diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c index 0ce868de855d..674f367087c5 100644 --- a/drivers/net/can/vcan.c +++ b/drivers/net/can/vcan.c | |||
@@ -78,9 +78,6 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev) | |||
78 | skb->dev = dev; | 78 | skb->dev = dev; |
79 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 79 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
80 | 80 | ||
81 | if (!(skb->tstamp.tv64)) | ||
82 | __net_timestamp(skb); | ||
83 | |||
84 | netif_rx_ni(skb); | 81 | netif_rx_ni(skb); |
85 | } | 82 | } |
86 | 83 | ||
diff --git a/include/linux/can/skb.h b/include/linux/can/skb.h index b6a52a4b457a..51bb6532785c 100644 --- a/include/linux/can/skb.h +++ b/include/linux/can/skb.h | |||
@@ -27,10 +27,12 @@ | |||
27 | /** | 27 | /** |
28 | * struct can_skb_priv - private additional data inside CAN sk_buffs | 28 | * struct can_skb_priv - private additional data inside CAN sk_buffs |
29 | * @ifindex: ifindex of the first interface the CAN frame appeared on | 29 | * @ifindex: ifindex of the first interface the CAN frame appeared on |
30 | * @skbcnt: atomic counter to have an unique id together with skb pointer | ||
30 | * @cf: align to the following CAN frame at skb->data | 31 | * @cf: align to the following CAN frame at skb->data |
31 | */ | 32 | */ |
32 | struct can_skb_priv { | 33 | struct can_skb_priv { |
33 | int ifindex; | 34 | int ifindex; |
35 | int skbcnt; | ||
34 | struct can_frame cf[0]; | 36 | struct can_frame cf[0]; |
35 | }; | 37 | }; |
36 | 38 | ||
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 */ | |||
89 | struct s_stats can_stats; /* packet statistics */ | 89 | struct s_stats can_stats; /* packet statistics */ |
90 | struct s_pstats can_pstats; /* receive list statistics */ | 90 | struct s_pstats can_pstats; /* receive list statistics */ |
91 | 91 | ||
92 | static atomic_t skbcounter = ATOMIC_INIT(0); | ||
93 | |||
92 | /* | 94 | /* |
93 | * af_can socket functions | 95 | * af_can socket functions |
94 | */ | 96 | */ |
@@ -310,12 +312,8 @@ int can_send(struct sk_buff *skb, int loop) | |||
310 | return err; | 312 | return err; |
311 | } | 313 | } |
312 | 314 | ||
313 | if (newskb) { | 315 | if (newskb) |
314 | if (!(newskb->tstamp.tv64)) | ||
315 | __net_timestamp(newskb); | ||
316 | |||
317 | netif_rx_ni(newskb); | 316 | netif_rx_ni(newskb); |
318 | } | ||
319 | 317 | ||
320 | /* update statistics */ | 318 | /* update statistics */ |
321 | can_stats.tx_frames++; | 319 | can_stats.tx_frames++; |
@@ -683,6 +681,10 @@ static void can_receive(struct sk_buff *skb, struct net_device *dev) | |||
683 | can_stats.rx_frames++; | 681 | can_stats.rx_frames++; |
684 | can_stats.rx_frames_delta++; | 682 | can_stats.rx_frames_delta++; |
685 | 683 | ||
684 | /* create non-zero unique skb identifier together with *skb */ | ||
685 | while (!(can_skb_prv(skb)->skbcnt)) | ||
686 | can_skb_prv(skb)->skbcnt = atomic_inc_return(&skbcounter); | ||
687 | |||
686 | rcu_read_lock(); | 688 | rcu_read_lock(); |
687 | 689 | ||
688 | /* deliver the packet to sockets listening on all devices */ | 690 | /* 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) | |||
261 | 261 | ||
262 | can_skb_reserve(skb); | 262 | can_skb_reserve(skb); |
263 | can_skb_prv(skb)->ifindex = dev->ifindex; | 263 | can_skb_prv(skb)->ifindex = dev->ifindex; |
264 | can_skb_prv(skb)->skbcnt = 0; | ||
264 | 265 | ||
265 | memcpy(skb_put(skb, CFSIZ), cf, CFSIZ); | 266 | memcpy(skb_put(skb, CFSIZ), cf, CFSIZ); |
266 | 267 | ||
@@ -1217,6 +1218,7 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk) | |||
1217 | } | 1218 | } |
1218 | 1219 | ||
1219 | can_skb_prv(skb)->ifindex = dev->ifindex; | 1220 | can_skb_prv(skb)->ifindex = dev->ifindex; |
1221 | can_skb_prv(skb)->skbcnt = 0; | ||
1220 | skb->dev = dev; | 1222 | skb->dev = dev; |
1221 | can_skb_set_owner(skb, sk); | 1223 | can_skb_set_owner(skb, sk); |
1222 | err = can_send(skb, 1); /* send with loopback */ | 1224 | 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"); | |||
75 | */ | 75 | */ |
76 | 76 | ||
77 | struct uniqframe { | 77 | struct uniqframe { |
78 | ktime_t tstamp; | 78 | int skbcnt; |
79 | const struct sk_buff *skb; | 79 | const struct sk_buff *skb; |
80 | unsigned int join_rx_count; | 80 | unsigned int join_rx_count; |
81 | }; | 81 | }; |
@@ -133,7 +133,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data) | |||
133 | 133 | ||
134 | /* eliminate multiple filter matches for the same skb */ | 134 | /* eliminate multiple filter matches for the same skb */ |
135 | if (this_cpu_ptr(ro->uniq)->skb == oskb && | 135 | if (this_cpu_ptr(ro->uniq)->skb == oskb && |
136 | ktime_equal(this_cpu_ptr(ro->uniq)->tstamp, oskb->tstamp)) { | 136 | this_cpu_ptr(ro->uniq)->skbcnt == can_skb_prv(oskb)->skbcnt) { |
137 | if (ro->join_filters) { | 137 | if (ro->join_filters) { |
138 | this_cpu_inc(ro->uniq->join_rx_count); | 138 | this_cpu_inc(ro->uniq->join_rx_count); |
139 | /* drop frame until all enabled filters matched */ | 139 | /* drop frame until all enabled filters matched */ |
@@ -144,7 +144,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data) | |||
144 | } | 144 | } |
145 | } else { | 145 | } else { |
146 | this_cpu_ptr(ro->uniq)->skb = oskb; | 146 | this_cpu_ptr(ro->uniq)->skb = oskb; |
147 | this_cpu_ptr(ro->uniq)->tstamp = oskb->tstamp; | 147 | this_cpu_ptr(ro->uniq)->skbcnt = can_skb_prv(oskb)->skbcnt; |
148 | this_cpu_ptr(ro->uniq)->join_rx_count = 1; | 148 | this_cpu_ptr(ro->uniq)->join_rx_count = 1; |
149 | /* drop first frame to check all enabled filters? */ | 149 | /* drop first frame to check all enabled filters? */ |
150 | if (ro->join_filters && ro->count > 1) | 150 | if (ro->join_filters && ro->count > 1) |
@@ -749,6 +749,7 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) | |||
749 | 749 | ||
750 | can_skb_reserve(skb); | 750 | can_skb_reserve(skb); |
751 | can_skb_prv(skb)->ifindex = dev->ifindex; | 751 | can_skb_prv(skb)->ifindex = dev->ifindex; |
752 | can_skb_prv(skb)->skbcnt = 0; | ||
752 | 753 | ||
753 | err = memcpy_from_msg(skb_put(skb, size), msg, size); | 754 | err = memcpy_from_msg(skb_put(skb, size), msg, size); |
754 | if (err < 0) | 755 | if (err < 0) |