ip6_output.c (5f013c9bc70214dcacd5fbed5a06c217d6ff9c59) | ip6_output.c (60ff746739bf805a912484643c720b6124826140) |
---|---|
1/* 2 * IPv6 output functions 3 * Linux INET6 implementation 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * Based on linux/net/ipv4/ip_output.c --- 205 unchanged lines hidden (view full) --- 214 hdr->saddr = fl6->saddr; 215 hdr->daddr = *first_hop; 216 217 skb->protocol = htons(ETH_P_IPV6); 218 skb->priority = sk->sk_priority; 219 skb->mark = sk->sk_mark; 220 221 mtu = dst_mtu(dst); | 1/* 2 * IPv6 output functions 3 * Linux INET6 implementation 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * Based on linux/net/ipv4/ip_output.c --- 205 unchanged lines hidden (view full) --- 214 hdr->saddr = fl6->saddr; 215 hdr->daddr = *first_hop; 216 217 skb->protocol = htons(ETH_P_IPV6); 218 skb->priority = sk->sk_priority; 219 skb->mark = sk->sk_mark; 220 221 mtu = dst_mtu(dst); |
222 if ((skb->len <= mtu) || skb->local_df || skb_is_gso(skb)) { | 222 if ((skb->len <= mtu) || skb->ignore_df || skb_is_gso(skb)) { |
223 IP6_UPD_PO_STATS(net, ip6_dst_idev(skb_dst(skb)), 224 IPSTATS_MIB_OUT, skb->len); 225 return NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, skb, NULL, 226 dst->dev, dst_output); 227 } 228 229 skb->dev = dst->dev; 230 ipv6_local_error(sk, EMSGSIZE, fl6, mtu); --- 111 unchanged lines hidden (view full) --- 342 return mtu; 343} 344 345static bool ip6_pkt_too_big(const struct sk_buff *skb, unsigned int mtu) 346{ 347 if (skb->len <= mtu) 348 return false; 349 | 223 IP6_UPD_PO_STATS(net, ip6_dst_idev(skb_dst(skb)), 224 IPSTATS_MIB_OUT, skb->len); 225 return NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, skb, NULL, 226 dst->dev, dst_output); 227 } 228 229 skb->dev = dst->dev; 230 ipv6_local_error(sk, EMSGSIZE, fl6, mtu); --- 111 unchanged lines hidden (view full) --- 342 return mtu; 343} 344 345static bool ip6_pkt_too_big(const struct sk_buff *skb, unsigned int mtu) 346{ 347 if (skb->len <= mtu) 348 return false; 349 |
350 /* ipv6 conntrack defrag sets max_frag_size + local_df */ | 350 /* ipv6 conntrack defrag sets max_frag_size + ignore_df */ |
351 if (IP6CB(skb)->frag_max_size && IP6CB(skb)->frag_max_size > mtu) 352 return true; 353 | 351 if (IP6CB(skb)->frag_max_size && IP6CB(skb)->frag_max_size > mtu) 352 return true; 353 |
354 if (skb->local_df) | 354 if (skb->ignore_df) |
355 return false; 356 357 if (skb_is_gso(skb) && skb_gso_network_seglen(skb) <= mtu) 358 return false; 359 360 return true; 361} 362 --- 191 unchanged lines hidden (view full) --- 554 hlen = ip6_find_1stfragopt(skb, &prevhdr); 555 nexthdr = *prevhdr; 556 557 mtu = ip6_skb_dst_mtu(skb); 558 559 /* We must not fragment if the socket is set to force MTU discovery 560 * or if the skb it not generated by a local socket. 561 */ | 355 return false; 356 357 if (skb_is_gso(skb) && skb_gso_network_seglen(skb) <= mtu) 358 return false; 359 360 return true; 361} 362 --- 191 unchanged lines hidden (view full) --- 554 hlen = ip6_find_1stfragopt(skb, &prevhdr); 555 nexthdr = *prevhdr; 556 557 mtu = ip6_skb_dst_mtu(skb); 558 559 /* We must not fragment if the socket is set to force MTU discovery 560 * or if the skb it not generated by a local socket. 561 */ |
562 if (unlikely(!skb->local_df && skb->len > mtu) || | 562 if (unlikely(!skb->ignore_df && skb->len > mtu) || |
563 (IP6CB(skb)->frag_max_size && 564 IP6CB(skb)->frag_max_size > mtu)) { 565 if (skb->sk && dst_allfrag(skb_dst(skb))) 566 sk_nocaps_add(skb->sk, NETIF_F_GSO_MASK); 567 568 skb->dev = skb_dst(skb)->dev; 569 icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu); 570 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), --- 658 unchanged lines hidden (view full) --- 1229 unsigned int maxnonfragsize, headersize; 1230 1231 headersize = sizeof(struct ipv6hdr) + 1232 (opt ? opt->tot_len : 0) + 1233 (dst_allfrag(&rt->dst) ? 1234 sizeof(struct frag_hdr) : 0) + 1235 rt->rt6i_nfheader_len; 1236 | 563 (IP6CB(skb)->frag_max_size && 564 IP6CB(skb)->frag_max_size > mtu)) { 565 if (skb->sk && dst_allfrag(skb_dst(skb))) 566 sk_nocaps_add(skb->sk, NETIF_F_GSO_MASK); 567 568 skb->dev = skb_dst(skb)->dev; 569 icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu); 570 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), --- 658 unchanged lines hidden (view full) --- 1229 unsigned int maxnonfragsize, headersize; 1230 1231 headersize = sizeof(struct ipv6hdr) + 1232 (opt ? opt->tot_len : 0) + 1233 (dst_allfrag(&rt->dst) ? 1234 sizeof(struct frag_hdr) : 0) + 1235 rt->rt6i_nfheader_len; 1236 |
1237 if (ip6_sk_local_df(sk)) | 1237 if (ip6_sk_ignore_df(sk)) |
1238 maxnonfragsize = sizeof(struct ipv6hdr) + IPV6_MAXPLEN; 1239 else 1240 maxnonfragsize = mtu; 1241 1242 /* dontfrag active */ 1243 if ((cork->length + length > mtu - headersize) && dontfrag && 1244 (sk->sk_protocol == IPPROTO_UDP || 1245 sk->sk_protocol == IPPROTO_RAW)) { --- 293 unchanged lines hidden (view full) --- 1539 skb->len += tmp_skb->len; 1540 skb->data_len += tmp_skb->len; 1541 skb->truesize += tmp_skb->truesize; 1542 tmp_skb->destructor = NULL; 1543 tmp_skb->sk = NULL; 1544 } 1545 1546 /* Allow local fragmentation. */ | 1238 maxnonfragsize = sizeof(struct ipv6hdr) + IPV6_MAXPLEN; 1239 else 1240 maxnonfragsize = mtu; 1241 1242 /* dontfrag active */ 1243 if ((cork->length + length > mtu - headersize) && dontfrag && 1244 (sk->sk_protocol == IPPROTO_UDP || 1245 sk->sk_protocol == IPPROTO_RAW)) { --- 293 unchanged lines hidden (view full) --- 1539 skb->len += tmp_skb->len; 1540 skb->data_len += tmp_skb->len; 1541 skb->truesize += tmp_skb->truesize; 1542 tmp_skb->destructor = NULL; 1543 tmp_skb->sk = NULL; 1544 } 1545 1546 /* Allow local fragmentation. */ |
1547 skb->local_df = ip6_sk_local_df(sk); | 1547 skb->ignore_df = ip6_sk_ignore_df(sk); |
1548 1549 *final_dst = fl6->daddr; 1550 __skb_pull(skb, skb_network_header_len(skb)); 1551 if (opt && opt->opt_flen) 1552 ipv6_push_frag_opts(skb, opt, &proto); 1553 if (opt && opt->opt_nflen) 1554 ipv6_push_nfrag_opts(skb, opt, &proto, &final_dst); 1555 --- 53 unchanged lines hidden --- | 1548 1549 *final_dst = fl6->daddr; 1550 __skb_pull(skb, skb_network_header_len(skb)); 1551 if (opt && opt->opt_flen) 1552 ipv6_push_frag_opts(skb, opt, &proto); 1553 if (opt && opt->opt_nflen) 1554 ipv6_push_nfrag_opts(skb, opt, &proto, &final_dst); 1555 --- 53 unchanged lines hidden --- |