Lines Matching refs:skb

126 static int nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *skb,
166 static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb, in nf_ct_frag6_queue() argument
180 payload_len = ntohs(ipv6_hdr(skb)->payload_len); in nf_ct_frag6_queue()
184 ((u8 *)(fhdr + 1) - (u8 *)(ipv6_hdr(skb) + 1))); in nf_ct_frag6_queue()
191 ecn = ip6_frag_ecn(ipv6_hdr(skb)); in nf_ct_frag6_queue()
193 if (skb->ip_summed == CHECKSUM_COMPLETE) { in nf_ct_frag6_queue()
194 const unsigned char *nh = skb_network_header(skb); in nf_ct_frag6_queue()
195 skb->csum = csum_sub(skb->csum, in nf_ct_frag6_queue()
238 if (!pskb_pull(skb, (u8 *) (fhdr + 1) - skb->data)) { in nf_ct_frag6_queue()
242 if (pskb_trim_rcsum(skb, end - offset)) { in nf_ct_frag6_queue()
248 dev = skb->dev; in nf_ct_frag6_queue()
253 err = inet_frag_queue_insert(&fq->q, skb, offset, end); in nf_ct_frag6_queue()
257 kfree_skb_reason(skb, SKB_DROP_REASON_DUP_FRAG); in nf_ct_frag6_queue()
266 fq->q.stamp = skb->tstamp; in nf_ct_frag6_queue()
267 fq->q.mono_delivery_time = skb->mono_delivery_time; in nf_ct_frag6_queue()
268 fq->q.meat += skb->len; in nf_ct_frag6_queue()
272 add_frag_mem_limit(fq->q.fqdir, skb->truesize); in nf_ct_frag6_queue()
284 unsigned long orefdst = skb->_skb_refdst; in nf_ct_frag6_queue()
286 skb->_skb_refdst = 0UL; in nf_ct_frag6_queue()
287 err = nf_ct_frag6_reasm(fq, skb, prev, dev); in nf_ct_frag6_queue()
288 skb->_skb_refdst = orefdst; in nf_ct_frag6_queue()
296 skb_dst_drop(skb); in nf_ct_frag6_queue()
297 skb_orphan(skb); in nf_ct_frag6_queue()
303 skb_dst_drop(skb); in nf_ct_frag6_queue()
314 static int nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *skb, in nf_ct_frag6_reasm() argument
327 reasm_data = inet_frag_reasm_prepare(&fq->q, skb, prev_tail); in nf_ct_frag6_reasm()
331 payload_len = ((skb->data - skb_network_header(skb)) - in nf_ct_frag6_reasm()
342 skb_network_header(skb)[fq->nhoffset] = skb_transport_header(skb)[0]; in nf_ct_frag6_reasm() local
343 memmove(skb->head + sizeof(struct frag_hdr), skb->head, in nf_ct_frag6_reasm()
344 (skb->data - skb->head) - sizeof(struct frag_hdr)); in nf_ct_frag6_reasm()
345 skb->mac_header += sizeof(struct frag_hdr); in nf_ct_frag6_reasm()
346 skb->network_header += sizeof(struct frag_hdr); in nf_ct_frag6_reasm()
348 skb_reset_transport_header(skb); in nf_ct_frag6_reasm()
350 inet_frag_reasm_finish(&fq->q, skb, reasm_data, false); in nf_ct_frag6_reasm()
352 skb->ignore_df = 1; in nf_ct_frag6_reasm()
353 skb->dev = dev; in nf_ct_frag6_reasm()
354 ipv6_hdr(skb)->payload_len = htons(payload_len); in nf_ct_frag6_reasm()
355 ipv6_change_dsfield(ipv6_hdr(skb), 0xff, ecn); in nf_ct_frag6_reasm()
356 IP6CB(skb)->frag_max_size = sizeof(struct ipv6hdr) + fq->q.max_size; in nf_ct_frag6_reasm()
357 IP6CB(skb)->flags |= IP6SKB_FRAGMENTED; in nf_ct_frag6_reasm()
360 if (skb->ip_summed == CHECKSUM_COMPLETE) in nf_ct_frag6_reasm()
361 skb->csum = csum_partial(skb_network_header(skb), in nf_ct_frag6_reasm()
362 skb_network_header_len(skb), in nf_ct_frag6_reasm()
363 skb->csum); in nf_ct_frag6_reasm()
390 find_prev_fhdr(struct sk_buff *skb, u8 *prevhdrp, int *prevhoff, int *fhoff) in find_prev_fhdr() argument
392 u8 nexthdr = ipv6_hdr(skb)->nexthdr; in find_prev_fhdr()
393 const int netoff = skb_network_offset(skb); in find_prev_fhdr()
396 int len = skb->len - start; in find_prev_fhdr()
414 if (skb_copy_bits(skb, start, &hdr, sizeof(hdr))) in find_prev_fhdr()
439 int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user) in nf_ct_frag6_gather() argument
441 u16 savethdr = skb->transport_header; in nf_ct_frag6_gather()
450 if (ipv6_hdr(skb)->payload_len == 0) { in nf_ct_frag6_gather()
455 if (find_prev_fhdr(skb, &prevhdr, &nhoff, &fhoff) < 0) in nf_ct_frag6_gather()
461 if (ipv6frag_thdr_truncated(skb, fhoff, &nexthdr)) { in nf_ct_frag6_gather()
466 if (!pskb_may_pull(skb, fhoff + sizeof(*fhdr))) in nf_ct_frag6_gather()
469 skb_set_transport_header(skb, fhoff); in nf_ct_frag6_gather()
470 hdr = ipv6_hdr(skb); in nf_ct_frag6_gather()
471 fhdr = (struct frag_hdr *)skb_transport_header(skb); in nf_ct_frag6_gather()
474 skb->dev ? skb->dev->ifindex : 0); in nf_ct_frag6_gather()
482 ret = nf_ct_frag6_queue(fq, skb, fhdr, nhoff); in nf_ct_frag6_gather()
484 skb->transport_header = savethdr; in nf_ct_frag6_gather()