|
@@ -1182,12 +1182,12 @@ static void ip6_append_data_mtu(unsigned int *mtu,
|
|
}
|
|
}
|
|
|
|
|
|
static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork,
|
|
static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork,
|
|
- struct inet6_cork *v6_cork,
|
|
|
|
- int hlimit, int tclass, struct ipv6_txoptions *opt,
|
|
|
|
|
|
+ struct inet6_cork *v6_cork, struct ipcm6_cookie *ipc6,
|
|
struct rt6_info *rt, struct flowi6 *fl6)
|
|
struct rt6_info *rt, struct flowi6 *fl6)
|
|
{
|
|
{
|
|
struct ipv6_pinfo *np = inet6_sk(sk);
|
|
struct ipv6_pinfo *np = inet6_sk(sk);
|
|
unsigned int mtu;
|
|
unsigned int mtu;
|
|
|
|
+ struct ipv6_txoptions *opt = ipc6->opt;
|
|
|
|
|
|
/*
|
|
/*
|
|
* setup for corking
|
|
* setup for corking
|
|
@@ -1229,8 +1229,8 @@ static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork,
|
|
dst_hold(&rt->dst);
|
|
dst_hold(&rt->dst);
|
|
cork->base.dst = &rt->dst;
|
|
cork->base.dst = &rt->dst;
|
|
cork->fl.u.ip6 = *fl6;
|
|
cork->fl.u.ip6 = *fl6;
|
|
- v6_cork->hop_limit = hlimit;
|
|
|
|
- v6_cork->tclass = tclass;
|
|
|
|
|
|
+ v6_cork->hop_limit = ipc6->hlimit;
|
|
|
|
+ v6_cork->tclass = ipc6->tclass;
|
|
if (rt->dst.flags & DST_XFRM_TUNNEL)
|
|
if (rt->dst.flags & DST_XFRM_TUNNEL)
|
|
mtu = np->pmtudisc >= IPV6_PMTUDISC_PROBE ?
|
|
mtu = np->pmtudisc >= IPV6_PMTUDISC_PROBE ?
|
|
rt->dst.dev->mtu : dst_mtu(&rt->dst);
|
|
rt->dst.dev->mtu : dst_mtu(&rt->dst);
|
|
@@ -1258,7 +1258,7 @@ static int __ip6_append_data(struct sock *sk,
|
|
int getfrag(void *from, char *to, int offset,
|
|
int getfrag(void *from, char *to, int offset,
|
|
int len, int odd, struct sk_buff *skb),
|
|
int len, int odd, struct sk_buff *skb),
|
|
void *from, int length, int transhdrlen,
|
|
void *from, int length, int transhdrlen,
|
|
- unsigned int flags, int dontfrag,
|
|
|
|
|
|
+ unsigned int flags, struct ipcm6_cookie *ipc6,
|
|
const struct sockcm_cookie *sockc)
|
|
const struct sockcm_cookie *sockc)
|
|
{
|
|
{
|
|
struct sk_buff *skb, *skb_prev = NULL;
|
|
struct sk_buff *skb, *skb_prev = NULL;
|
|
@@ -1298,7 +1298,7 @@ static int __ip6_append_data(struct sock *sk,
|
|
sizeof(struct frag_hdr) : 0) +
|
|
sizeof(struct frag_hdr) : 0) +
|
|
rt->rt6i_nfheader_len;
|
|
rt->rt6i_nfheader_len;
|
|
|
|
|
|
- if (cork->length + length > mtu - headersize && dontfrag &&
|
|
|
|
|
|
+ if (cork->length + length > mtu - headersize && ipc6->dontfrag &&
|
|
(sk->sk_protocol == IPPROTO_UDP ||
|
|
(sk->sk_protocol == IPPROTO_UDP ||
|
|
sk->sk_protocol == IPPROTO_RAW)) {
|
|
sk->sk_protocol == IPPROTO_RAW)) {
|
|
ipv6_local_rxpmtu(sk, fl6, mtu - headersize +
|
|
ipv6_local_rxpmtu(sk, fl6, mtu - headersize +
|
|
@@ -1564,9 +1564,9 @@ error:
|
|
int ip6_append_data(struct sock *sk,
|
|
int ip6_append_data(struct sock *sk,
|
|
int getfrag(void *from, char *to, int offset, int len,
|
|
int getfrag(void *from, char *to, int offset, int len,
|
|
int odd, struct sk_buff *skb),
|
|
int odd, struct sk_buff *skb),
|
|
- void *from, int length, int transhdrlen, int hlimit,
|
|
|
|
- int tclass, struct ipv6_txoptions *opt, struct flowi6 *fl6,
|
|
|
|
- struct rt6_info *rt, unsigned int flags, int dontfrag,
|
|
|
|
|
|
+ void *from, int length, int transhdrlen,
|
|
|
|
+ struct ipcm6_cookie *ipc6, struct flowi6 *fl6,
|
|
|
|
+ struct rt6_info *rt, unsigned int flags,
|
|
const struct sockcm_cookie *sockc)
|
|
const struct sockcm_cookie *sockc)
|
|
{
|
|
{
|
|
struct inet_sock *inet = inet_sk(sk);
|
|
struct inet_sock *inet = inet_sk(sk);
|
|
@@ -1580,12 +1580,12 @@ int ip6_append_data(struct sock *sk,
|
|
/*
|
|
/*
|
|
* setup for corking
|
|
* setup for corking
|
|
*/
|
|
*/
|
|
- err = ip6_setup_cork(sk, &inet->cork, &np->cork, hlimit,
|
|
|
|
- tclass, opt, rt, fl6);
|
|
|
|
|
|
+ err = ip6_setup_cork(sk, &inet->cork, &np->cork,
|
|
|
|
+ ipc6, rt, fl6);
|
|
if (err)
|
|
if (err)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
- exthdrlen = (opt ? opt->opt_flen : 0);
|
|
|
|
|
|
+ exthdrlen = (ipc6->opt ? ipc6->opt->opt_flen : 0);
|
|
length += exthdrlen;
|
|
length += exthdrlen;
|
|
transhdrlen += exthdrlen;
|
|
transhdrlen += exthdrlen;
|
|
} else {
|
|
} else {
|
|
@@ -1595,8 +1595,7 @@ int ip6_append_data(struct sock *sk,
|
|
|
|
|
|
return __ip6_append_data(sk, fl6, &sk->sk_write_queue, &inet->cork.base,
|
|
return __ip6_append_data(sk, fl6, &sk->sk_write_queue, &inet->cork.base,
|
|
&np->cork, sk_page_frag(sk), getfrag,
|
|
&np->cork, sk_page_frag(sk), getfrag,
|
|
- from, length, transhdrlen, flags, dontfrag,
|
|
|
|
- sockc);
|
|
|
|
|
|
+ from, length, transhdrlen, flags, ipc6, sockc);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(ip6_append_data);
|
|
EXPORT_SYMBOL_GPL(ip6_append_data);
|
|
|
|
|
|
@@ -1752,15 +1751,14 @@ struct sk_buff *ip6_make_skb(struct sock *sk,
|
|
int getfrag(void *from, char *to, int offset,
|
|
int getfrag(void *from, char *to, int offset,
|
|
int len, int odd, struct sk_buff *skb),
|
|
int len, int odd, struct sk_buff *skb),
|
|
void *from, int length, int transhdrlen,
|
|
void *from, int length, int transhdrlen,
|
|
- int hlimit, int tclass,
|
|
|
|
- struct ipv6_txoptions *opt, struct flowi6 *fl6,
|
|
|
|
|
|
+ struct ipcm6_cookie *ipc6, struct flowi6 *fl6,
|
|
struct rt6_info *rt, unsigned int flags,
|
|
struct rt6_info *rt, unsigned int flags,
|
|
- int dontfrag, const struct sockcm_cookie *sockc)
|
|
|
|
|
|
+ const struct sockcm_cookie *sockc)
|
|
{
|
|
{
|
|
struct inet_cork_full cork;
|
|
struct inet_cork_full cork;
|
|
struct inet6_cork v6_cork;
|
|
struct inet6_cork v6_cork;
|
|
struct sk_buff_head queue;
|
|
struct sk_buff_head queue;
|
|
- int exthdrlen = (opt ? opt->opt_flen : 0);
|
|
|
|
|
|
+ int exthdrlen = (ipc6->opt ? ipc6->opt->opt_flen : 0);
|
|
int err;
|
|
int err;
|
|
|
|
|
|
if (flags & MSG_PROBE)
|
|
if (flags & MSG_PROBE)
|
|
@@ -1772,17 +1770,17 @@ struct sk_buff *ip6_make_skb(struct sock *sk,
|
|
cork.base.addr = 0;
|
|
cork.base.addr = 0;
|
|
cork.base.opt = NULL;
|
|
cork.base.opt = NULL;
|
|
v6_cork.opt = NULL;
|
|
v6_cork.opt = NULL;
|
|
- err = ip6_setup_cork(sk, &cork, &v6_cork, hlimit, tclass, opt, rt, fl6);
|
|
|
|
|
|
+ err = ip6_setup_cork(sk, &cork, &v6_cork, ipc6, rt, fl6);
|
|
if (err)
|
|
if (err)
|
|
return ERR_PTR(err);
|
|
return ERR_PTR(err);
|
|
|
|
|
|
- if (dontfrag < 0)
|
|
|
|
- dontfrag = inet6_sk(sk)->dontfrag;
|
|
|
|
|
|
+ if (ipc6->dontfrag < 0)
|
|
|
|
+ ipc6->dontfrag = inet6_sk(sk)->dontfrag;
|
|
|
|
|
|
err = __ip6_append_data(sk, fl6, &queue, &cork.base, &v6_cork,
|
|
err = __ip6_append_data(sk, fl6, &queue, &cork.base, &v6_cork,
|
|
¤t->task_frag, getfrag, from,
|
|
¤t->task_frag, getfrag, from,
|
|
length + exthdrlen, transhdrlen + exthdrlen,
|
|
length + exthdrlen, transhdrlen + exthdrlen,
|
|
- flags, dontfrag, sockc);
|
|
|
|
|
|
+ flags, ipc6, sockc);
|
|
if (err) {
|
|
if (err) {
|
|
__ip6_flush_pending_frames(sk, &queue, &cork, &v6_cork);
|
|
__ip6_flush_pending_frames(sk, &queue, &cork, &v6_cork);
|
|
return ERR_PTR(err);
|
|
return ERR_PTR(err);
|