ip6_output.c (3a175cdf439275c3da347b6b42c4e9b652a12904) | ip6_output.c (e9191ffb65d8e159680ce0ad2224e1acbde6985c) |
---|---|
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 --- 152 unchanged lines hidden (view full) --- 161 } 162 163 return NF_HOOK_COND(NFPROTO_IPV6, NF_INET_POST_ROUTING, 164 net, sk, skb, NULL, dev, 165 ip6_finish_output, 166 !(IP6CB(skb)->flags & IP6SKB_REROUTED)); 167} 168 | 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 --- 152 unchanged lines hidden (view full) --- 161 } 162 163 return NF_HOOK_COND(NFPROTO_IPV6, NF_INET_POST_ROUTING, 164 net, sk, skb, NULL, dev, 165 ip6_finish_output, 166 !(IP6CB(skb)->flags & IP6SKB_REROUTED)); 167} 168 |
169static bool ip6_autoflowlabel(struct net *net, const struct ipv6_pinfo *np) | 169bool ip6_autoflowlabel(struct net *net, const struct ipv6_pinfo *np) |
170{ 171 if (!np->autoflowlabel_set) 172 return ip6_default_np_autolabel(net); 173 else 174 return np->autoflowlabel; 175} 176 177/* --- 1023 unchanged lines hidden (view full) --- 1201 } 1202 dst_hold(&rt->dst); 1203 cork->base.dst = &rt->dst; 1204 cork->fl.u.ip6 = *fl6; 1205 v6_cork->hop_limit = ipc6->hlimit; 1206 v6_cork->tclass = ipc6->tclass; 1207 if (rt->dst.flags & DST_XFRM_TUNNEL) 1208 mtu = np->pmtudisc >= IPV6_PMTUDISC_PROBE ? | 170{ 171 if (!np->autoflowlabel_set) 172 return ip6_default_np_autolabel(net); 173 else 174 return np->autoflowlabel; 175} 176 177/* --- 1023 unchanged lines hidden (view full) --- 1201 } 1202 dst_hold(&rt->dst); 1203 cork->base.dst = &rt->dst; 1204 cork->fl.u.ip6 = *fl6; 1205 v6_cork->hop_limit = ipc6->hlimit; 1206 v6_cork->tclass = ipc6->tclass; 1207 if (rt->dst.flags & DST_XFRM_TUNNEL) 1208 mtu = np->pmtudisc >= IPV6_PMTUDISC_PROBE ? |
1209 rt->dst.dev->mtu : dst_mtu(&rt->dst); | 1209 READ_ONCE(rt->dst.dev->mtu) : dst_mtu(&rt->dst); |
1210 else 1211 mtu = np->pmtudisc >= IPV6_PMTUDISC_PROBE ? | 1210 else 1211 mtu = np->pmtudisc >= IPV6_PMTUDISC_PROBE ? |
1212 rt->dst.dev->mtu : dst_mtu(rt->dst.path); | 1212 READ_ONCE(rt->dst.dev->mtu) : dst_mtu(rt->dst.path); |
1213 if (np->frag_size < mtu) { 1214 if (np->frag_size) 1215 mtu = np->frag_size; 1216 } | 1213 if (np->frag_size < mtu) { 1214 if (np->frag_size) 1215 mtu = np->frag_size; 1216 } |
1217 if (mtu < IPV6_MIN_MTU) 1218 return -EINVAL; |
|
1217 cork->base.fragsize = mtu; 1218 if (dst_allfrag(rt->dst.path)) 1219 cork->base.flags |= IPCORK_ALLFRAG; 1220 cork->base.length = 0; 1221 1222 return 0; 1223} 1224 --- 503 unchanged lines hidden (view full) --- 1728 if (flags & MSG_PROBE) 1729 return NULL; 1730 1731 __skb_queue_head_init(&queue); 1732 1733 cork.base.flags = 0; 1734 cork.base.addr = 0; 1735 cork.base.opt = NULL; | 1219 cork->base.fragsize = mtu; 1220 if (dst_allfrag(rt->dst.path)) 1221 cork->base.flags |= IPCORK_ALLFRAG; 1222 cork->base.length = 0; 1223 1224 return 0; 1225} 1226 --- 503 unchanged lines hidden (view full) --- 1730 if (flags & MSG_PROBE) 1731 return NULL; 1732 1733 __skb_queue_head_init(&queue); 1734 1735 cork.base.flags = 0; 1736 cork.base.addr = 0; 1737 cork.base.opt = NULL; |
1738 cork.base.dst = NULL; |
|
1736 v6_cork.opt = NULL; 1737 err = ip6_setup_cork(sk, &cork, &v6_cork, ipc6, rt, fl6); | 1739 v6_cork.opt = NULL; 1740 err = ip6_setup_cork(sk, &cork, &v6_cork, ipc6, rt, fl6); |
1738 if (err) | 1741 if (err) { 1742 ip6_cork_release(&cork, &v6_cork); |
1739 return ERR_PTR(err); | 1743 return ERR_PTR(err); |
1740 | 1744 } |
1741 if (ipc6->dontfrag < 0) 1742 ipc6->dontfrag = inet6_sk(sk)->dontfrag; 1743 1744 err = __ip6_append_data(sk, fl6, &queue, &cork.base, &v6_cork, 1745 ¤t->task_frag, getfrag, from, 1746 length + exthdrlen, transhdrlen + exthdrlen, 1747 flags, ipc6, sockc); 1748 if (err) { 1749 __ip6_flush_pending_frames(sk, &queue, &cork, &v6_cork); 1750 return ERR_PTR(err); 1751 } 1752 1753 return __ip6_make_skb(sk, &queue, &cork, &v6_cork); 1754} | 1745 if (ipc6->dontfrag < 0) 1746 ipc6->dontfrag = inet6_sk(sk)->dontfrag; 1747 1748 err = __ip6_append_data(sk, fl6, &queue, &cork.base, &v6_cork, 1749 ¤t->task_frag, getfrag, from, 1750 length + exthdrlen, transhdrlen + exthdrlen, 1751 flags, ipc6, sockc); 1752 if (err) { 1753 __ip6_flush_pending_frames(sk, &queue, &cork, &v6_cork); 1754 return ERR_PTR(err); 1755 } 1756 1757 return __ip6_make_skb(sk, &queue, &cork, &v6_cork); 1758} |