Lines Matching refs:skb

130 static int pn_header_create(struct sk_buff *skb, struct net_device *dev,  in pn_header_create()  argument
134 u8 *media = skb_push(skb, 1); in pn_header_create()
145 static int pn_header_parse(const struct sk_buff *skb, unsigned char *haddr) in pn_header_parse() argument
147 const u8 *media = skb_mac_header(skb); in pn_header_parse()
161 static int pn_send(struct sk_buff *skb, struct net_device *dev, in pn_send() argument
167 if (skb->len + 2 > 0xffff /* Phonet length field limit */ || in pn_send()
168 skb->len + sizeof(struct phonethdr) > dev->mtu) { in pn_send()
179 skb_reset_transport_header(skb); in pn_send()
180 WARN_ON(skb_headroom(skb) & 1); /* HW assumes word alignment */ in pn_send()
181 skb_push(skb, sizeof(struct phonethdr)); in pn_send()
182 skb_reset_network_header(skb); in pn_send()
183 ph = pn_hdr(skb); in pn_send()
187 ph->pn_length = __cpu_to_be16(skb->len + 2 - sizeof(*ph)); in pn_send()
191 skb->protocol = htons(ETH_P_PHONET); in pn_send()
192 skb->priority = 0; in pn_send()
193 skb->dev = dev; in pn_send()
195 if (skb->pkt_type == PACKET_LOOPBACK) { in pn_send()
196 skb_reset_mac_header(skb); in pn_send()
197 skb_orphan(skb); in pn_send()
198 err = (irq ? netif_rx(skb) : netif_rx_ni(skb)) ? -ENOBUFS : 0; in pn_send()
200 err = dev_hard_header(skb, dev, ntohs(skb->protocol), in pn_send()
201 NULL, NULL, skb->len); in pn_send()
206 err = dev_queue_xmit(skb); in pn_send()
213 kfree_skb(skb); in pn_send()
220 struct sk_buff *skb = alloc_skb(MAX_PHONET_HEADER + len, GFP_ATOMIC); in pn_raw_send() local
221 if (skb == NULL) in pn_raw_send()
225 skb->pkt_type = PACKET_LOOPBACK; in pn_raw_send()
227 skb_reserve(skb, MAX_PHONET_HEADER); in pn_raw_send()
228 __skb_put(skb, len); in pn_raw_send()
229 skb_copy_to_linear_data(skb, data, len); in pn_raw_send()
230 return pn_send(skb, dev, dst, src, res, 1); in pn_raw_send()
237 int pn_skb_send(struct sock *sk, struct sk_buff *skb, in pn_skb_send() argument
262 skb->pkt_type = PACKET_LOOPBACK; in pn_skb_send()
269 skb->pkt_type = PACKET_LOOPBACK; in pn_skb_send()
285 err = pn_send(skb, dev, dst, src, res, 0); in pn_skb_send()
290 kfree_skb(skb); in pn_skb_send()
298 static inline int can_respond(struct sk_buff *skb) in can_respond() argument
304 if (!pskb_may_pull(skb, 3)) in can_respond()
307 ph = pn_hdr(skb); in can_respond()
308 if (ph->pn_res == PN_PREFIX && !pskb_may_pull(skb, 5)) in can_respond()
313 ph = pn_hdr(skb); /* re-acquires the pointer */ in can_respond()
314 pm = pn_msg(skb); in can_respond()
371 static int phonet_rcv(struct sk_buff *skb, struct net_device *dev, in phonet_rcv() argument
380 skb = skb_share_check(skb, GFP_ATOMIC); in phonet_rcv()
381 if (!skb) in phonet_rcv()
385 if (!pskb_pull(skb, sizeof(struct phonethdr))) in phonet_rcv()
389 ph = pn_hdr(skb); in phonet_rcv()
394 if ((len > skb->len) || pskb_trim(skb, len)) in phonet_rcv()
396 skb_reset_transport_header(skb); in phonet_rcv()
398 pn_skb_get_dst_sockaddr(skb, &sa); in phonet_rcv()
402 pn_deliver_sock_broadcast(net, skb); in phonet_rcv()
410 return sk_receive_skb(sk, skb, 0); in phonet_rcv()
419 return sk_receive_skb(sk, skb, 0); in phonet_rcv()
421 if (can_respond(skb)) { in phonet_rcv()
422 send_obj_unreachable(skb); in phonet_rcv()
423 send_reset_indications(skb); in phonet_rcv()
425 } else if (unlikely(skb->pkt_type == PACKET_LOOPBACK)) in phonet_rcv()
438 __skb_push(skb, sizeof(struct phonethdr)); in phonet_rcv()
439 skb->dev = out_dev; in phonet_rcv()
447 if (skb_cow_head(skb, out_dev->hard_header_len)) in phonet_rcv()
450 if (dev_hard_header(skb, out_dev, ETH_P_PHONET, NULL, NULL, in phonet_rcv()
451 skb->len) < 0) in phonet_rcv()
453 dev_queue_xmit(skb); in phonet_rcv()
461 kfree_skb(skb); in phonet_rcv()