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 &current->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 &current->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}