Lines Matching refs:skb

41 /* Put the skb on the stack to be looped backed locally lateron
47 int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
60 (skb->protocol != htons(ETH_P_CAN) &&
61 skb->protocol != htons(ETH_P_CANFD) &&
62 skb->protocol != htons(ETH_P_CANXL))) {
63 kfree_skb(skb);
68 skb = can_create_echo_skb(skb);
69 if (!skb)
73 skb->ip_summed = CHECKSUM_UNNECESSARY;
74 skb->dev = dev;
77 can_skb_prv(skb)->frame_len = frame_len;
79 if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)
80 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
82 skb_tx_timestamp(skb);
84 /* save this skb for tx interrupt echo handling */
85 priv->echo_skb[idx] = skb;
89 kfree_skb(skb);
113 struct sk_buff *skb = priv->echo_skb[idx];
114 struct can_skb_priv *can_skb_priv = can_skb_prv(skb);
116 if (skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)
117 skb_tstamp_tx(skb, skb_hwtstamps(skb));
120 *len_ptr = can_skb_get_data_len(skb);
127 if (skb->pkt_type == PACKET_LOOPBACK) {
128 skb->pkt_type = PACKET_BROADCAST;
130 dev_consume_skb_any(skb);
134 return skb;
140 /* Get the skb from the stack and loop it back locally
149 struct sk_buff *skb;
152 skb = __can_get_echo_skb(dev, idx, &len, frame_len_ptr);
153 if (!skb)
156 skb_get(skb);
157 if (netif_rx(skb) == NET_RX_SUCCESS)
158 dev_consume_skb_any(skb);
160 dev_kfree_skb_any(skb);
166 /* Remove the skb from the stack and free it.
182 struct sk_buff *skb = priv->echo_skb[idx];
183 struct can_skb_priv *can_skb_priv = can_skb_prv(skb);
188 dev_kfree_skb_any(skb);
195 static void init_can_skb_reserve(struct sk_buff *skb)
197 skb->pkt_type = PACKET_BROADCAST;
198 skb->ip_summed = CHECKSUM_UNNECESSARY;
200 skb_reset_mac_header(skb);
201 skb_reset_network_header(skb);
202 skb_reset_transport_header(skb);
204 can_skb_reserve(skb);
205 can_skb_prv(skb)->skbcnt = 0;
210 struct sk_buff *skb;
212 skb = netdev_alloc_skb(dev, sizeof(struct can_skb_priv) +
214 if (unlikely(!skb)) {
220 skb->protocol = htons(ETH_P_CAN);
221 init_can_skb_reserve(skb);
222 can_skb_prv(skb)->ifindex = dev->ifindex;
224 *cf = skb_put_zero(skb, sizeof(struct can_frame));
226 return skb;
233 struct sk_buff *skb;
235 skb = netdev_alloc_skb(dev, sizeof(struct can_skb_priv) +
237 if (unlikely(!skb)) {
243 skb->protocol = htons(ETH_P_CANFD);
244 init_can_skb_reserve(skb);
245 can_skb_prv(skb)->ifindex = dev->ifindex;
247 *cfd = skb_put_zero(skb, sizeof(struct canfd_frame));
252 return skb;
260 struct sk_buff *skb;
265 skb = netdev_alloc_skb(dev, sizeof(struct can_skb_priv) +
267 if (unlikely(!skb))
270 skb->protocol = htons(ETH_P_CANXL);
271 init_can_skb_reserve(skb);
272 can_skb_prv(skb)->ifindex = dev->ifindex;
274 *cxl = skb_put_zero(skb, CANXL_HDR_SIZE + data_len);
280 return skb;
291 struct sk_buff *skb;
293 skb = alloc_can_skb(dev, cf);
294 if (unlikely(!skb))
300 return skb;
305 static bool can_skb_headroom_valid(struct net_device *dev, struct sk_buff *skb)
308 if (WARN_ON_ONCE(skb_headroom(skb) < sizeof(struct can_skb_priv)))
311 /* af_packet does not apply CAN skb specific settings */
312 if (skb->ip_summed == CHECKSUM_NONE) {
314 can_skb_prv(skb)->ifindex = dev->ifindex;
315 can_skb_prv(skb)->skbcnt = 0;
317 skb->ip_summed = CHECKSUM_UNNECESSARY;
321 skb->pkt_type = PACKET_LOOPBACK;
323 skb->pkt_type = PACKET_HOST;
325 skb_reset_mac_header(skb);
326 skb_reset_network_header(skb);
327 skb_reset_transport_header(skb);
330 if (can_is_canfd_skb(skb)) {
333 cfd = (struct canfd_frame *)skb->data;
342 bool can_dropped_invalid_skb(struct net_device *dev, struct sk_buff *skb)
344 switch (ntohs(skb->protocol)) {
346 if (!can_is_can_skb(skb))
351 if (!can_is_canfd_skb(skb))
356 if (!can_is_canxl_skb(skb))
364 if (!can_skb_headroom_valid(dev, skb))
370 kfree_skb(skb);