Commit 5d45d09c authored by David S. Miller's avatar David S. Miller

Merge bk://kernel.bkbits.net/acme/connection_sock-2.6

into nuts.davemloft.net:/disk1/BK/net-2.6
parents 4a4cda7b aced97aa
...@@ -247,27 +247,26 @@ struct ipv6_pinfo { ...@@ -247,27 +247,26 @@ struct ipv6_pinfo {
} cork; } cork;
}; };
struct raw6_opt {
__u32 checksum; /* perform checksum */
__u32 offset; /* checksum offset */
struct icmp6_filter filter;
};
/* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */ /* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */
struct raw6_sock { struct raw6_sock {
/* inet_sock has to be the first member of raw6_sock */
struct inet_sock inet; struct inet_sock inet;
struct raw6_opt raw6; __u32 checksum; /* perform checksum */
__u32 offset; /* checksum offset */
struct icmp6_filter filter;
/* ipv6_pinfo has to be the last member of raw6_sock, see inet6_sk_generic */
struct ipv6_pinfo inet6; struct ipv6_pinfo inet6;
}; };
struct udp6_sock { struct udp6_sock {
struct udp_sock udp; struct udp_sock udp;
/* ipv6_pinfo has to be the last member of udp6_sock, see inet6_sk_generic */
struct ipv6_pinfo inet6; struct ipv6_pinfo inet6;
}; };
struct tcp6_sock { struct tcp6_sock {
struct tcp_sock tcp; struct tcp_sock tcp;
/* ipv6_pinfo has to be the last member of tcp6_sock, see inet6_sk_generic */
struct ipv6_pinfo inet6; struct ipv6_pinfo inet6;
}; };
...@@ -277,9 +276,9 @@ static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk) ...@@ -277,9 +276,9 @@ static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
return inet_sk(__sk)->pinet6; return inet_sk(__sk)->pinet6;
} }
static inline struct raw6_opt * raw6_sk(const struct sock *__sk) static inline struct raw6_sock *raw6_sk(const struct sock *sk)
{ {
return &((struct raw6_sock *)__sk)->raw6; return (struct raw6_sock *)sk;
} }
static inline void inet_sk_copy_descendant(struct sock *sk_to, static inline void inet_sk_copy_descendant(struct sock *sk_to,
...@@ -304,7 +303,7 @@ static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk) ...@@ -304,7 +303,7 @@ static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
return NULL; return NULL;
} }
static inline struct raw6_opt * raw6_sk(const struct sock *__sk) static inline struct raw6_sock *raw6_sk(const struct sock *sk)
{ {
return NULL; return NULL;
} }
......
...@@ -115,10 +115,10 @@ struct sock *__raw_v6_lookup(struct sock *sk, unsigned short num, ...@@ -115,10 +115,10 @@ struct sock *__raw_v6_lookup(struct sock *sk, unsigned short num,
static __inline__ int icmpv6_filter(struct sock *sk, struct sk_buff *skb) static __inline__ int icmpv6_filter(struct sock *sk, struct sk_buff *skb)
{ {
struct icmp6hdr *icmph; struct icmp6hdr *icmph;
struct raw6_opt *opt = raw6_sk(sk); struct raw6_sock *rp = raw6_sk(sk);
if (pskb_may_pull(skb, sizeof(struct icmp6hdr))) { if (pskb_may_pull(skb, sizeof(struct icmp6hdr))) {
__u32 *data = &opt->filter.data[0]; __u32 *data = &rp->filter.data[0];
int bit_nr; int bit_nr;
icmph = (struct icmp6hdr *) skb->data; icmph = (struct icmp6hdr *) skb->data;
...@@ -315,14 +315,14 @@ static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb) ...@@ -315,14 +315,14 @@ static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb)
int rawv6_rcv(struct sock *sk, struct sk_buff *skb) int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
{ {
struct inet_sock *inet = inet_sk(sk); struct inet_sock *inet = inet_sk(sk);
struct raw6_opt *raw_opt = raw6_sk(sk); struct raw6_sock *rp = raw6_sk(sk);
if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) { if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) {
kfree_skb(skb); kfree_skb(skb);
return NET_RX_DROP; return NET_RX_DROP;
} }
if (!raw_opt->checksum) if (!rp->checksum)
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
if (skb->ip_summed != CHECKSUM_UNNECESSARY) { if (skb->ip_summed != CHECKSUM_UNNECESSARY) {
...@@ -451,21 +451,22 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk, ...@@ -451,21 +451,22 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
goto out_free; goto out_free;
} }
static int rawv6_push_pending_frames(struct sock *sk, struct flowi *fl, struct raw6_opt *opt, int len) static int rawv6_push_pending_frames(struct sock *sk, struct flowi *fl,
struct raw6_sock *rp, int len)
{ {
struct sk_buff *skb; struct sk_buff *skb;
int err = 0; int err = 0;
u16 *csum; u16 *csum;
u32 tmp_csum; u32 tmp_csum;
if (!opt->checksum) if (!rp->checksum)
goto send; goto send;
if ((skb = skb_peek(&sk->sk_write_queue)) == NULL) if ((skb = skb_peek(&sk->sk_write_queue)) == NULL)
goto out; goto out;
if (opt->offset + 1 < len) if (rp->offset + 1 < len)
csum = (u16 *)(skb->h.raw + opt->offset); csum = (u16 *)(skb->h.raw + rp->offset);
else { else {
err = -EINVAL; err = -EINVAL;
goto out; goto out;
...@@ -609,7 +610,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, ...@@ -609,7 +610,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
struct in6_addr *daddr, *final_p = NULL, final; struct in6_addr *daddr, *final_p = NULL, final;
struct inet_sock *inet = inet_sk(sk); struct inet_sock *inet = inet_sk(sk);
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk);
struct raw6_opt *raw_opt = raw6_sk(sk); struct raw6_sock *rp = raw6_sk(sk);
struct ipv6_txoptions *opt = NULL; struct ipv6_txoptions *opt = NULL;
struct ip6_flowlabel *flowlabel = NULL; struct ip6_flowlabel *flowlabel = NULL;
struct dst_entry *dst = NULL; struct dst_entry *dst = NULL;
...@@ -771,7 +772,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, ...@@ -771,7 +772,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
if (err) if (err)
ip6_flush_pending_frames(sk); ip6_flush_pending_frames(sk);
else if (!(msg->msg_flags & MSG_MORE)) else if (!(msg->msg_flags & MSG_MORE))
err = rawv6_push_pending_frames(sk, &fl, raw_opt, len); err = rawv6_push_pending_frames(sk, &fl, rp, len);
} }
done: done:
ip6_dst_store(sk, dst, ip6_dst_store(sk, dst,
...@@ -838,7 +839,7 @@ static int rawv6_geticmpfilter(struct sock *sk, int level, int optname, ...@@ -838,7 +839,7 @@ static int rawv6_geticmpfilter(struct sock *sk, int level, int optname,
static int rawv6_setsockopt(struct sock *sk, int level, int optname, static int rawv6_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, int optlen) char __user *optval, int optlen)
{ {
struct raw6_opt *opt = raw6_sk(sk); struct raw6_sock *rp = raw6_sk(sk);
int val; int val;
switch(level) { switch(level) {
...@@ -868,10 +869,10 @@ static int rawv6_setsockopt(struct sock *sk, int level, int optname, ...@@ -868,10 +869,10 @@ static int rawv6_setsockopt(struct sock *sk, int level, int optname,
if (val > 0 && (val&1)) if (val > 0 && (val&1))
return(-EINVAL); return(-EINVAL);
if (val < 0) { if (val < 0) {
opt->checksum = 0; rp->checksum = 0;
} else { } else {
opt->checksum = 1; rp->checksum = 1;
opt->offset = val; rp->offset = val;
} }
return 0; return 0;
...@@ -885,7 +886,7 @@ static int rawv6_setsockopt(struct sock *sk, int level, int optname, ...@@ -885,7 +886,7 @@ static int rawv6_setsockopt(struct sock *sk, int level, int optname,
static int rawv6_getsockopt(struct sock *sk, int level, int optname, static int rawv6_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen) char __user *optval, int __user *optlen)
{ {
struct raw6_opt *opt = raw6_sk(sk); struct raw6_sock *rp = raw6_sk(sk);
int val, len; int val, len;
switch(level) { switch(level) {
...@@ -910,10 +911,10 @@ static int rawv6_getsockopt(struct sock *sk, int level, int optname, ...@@ -910,10 +911,10 @@ static int rawv6_getsockopt(struct sock *sk, int level, int optname,
switch (optname) { switch (optname) {
case IPV6_CHECKSUM: case IPV6_CHECKSUM:
if (opt->checksum == 0) if (rp->checksum == 0)
val = -1; val = -1;
else else
val = opt->offset; val = rp->offset;
break; break;
default: default:
...@@ -966,9 +967,9 @@ static void rawv6_close(struct sock *sk, long timeout) ...@@ -966,9 +967,9 @@ static void rawv6_close(struct sock *sk, long timeout)
static int rawv6_init_sk(struct sock *sk) static int rawv6_init_sk(struct sock *sk)
{ {
if (inet_sk(sk)->num == IPPROTO_ICMPV6) { if (inet_sk(sk)->num == IPPROTO_ICMPV6) {
struct raw6_opt *opt = raw6_sk(sk); struct raw6_sock *rp = raw6_sk(sk);
opt->checksum = 1; rp->checksum = 1;
opt->offset = 2; rp->offset = 2;
} }
return(0); return(0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment