diff options
Diffstat (limited to 'net/ipv6/raw.c')
| -rw-r--r-- | net/ipv6/raw.c | 79 | 
1 files changed, 39 insertions, 40 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index d061465d682..259f1b23103 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -524,7 +524,7 @@ csum_copy_err:  	goto out;  } -static int rawv6_push_pending_frames(struct sock *sk, struct flowi *fl, +static int rawv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,  				     struct raw6_sock *rp)  {  	struct sk_buff *skb; @@ -586,11 +586,10 @@ static int rawv6_push_pending_frames(struct sock *sk, struct flowi *fl,  	if (unlikely(csum))  		tmp_csum = csum_sub(tmp_csum, csum_unfold(csum)); -	csum = csum_ipv6_magic(&fl->fl6_src, -				   &fl->fl6_dst, -				   total_len, fl->flowi_proto, tmp_csum); +	csum = csum_ipv6_magic(&fl6->saddr, &fl6->daddr, +			       total_len, fl6->flowi6_proto, tmp_csum); -	if (csum == 0 && fl->flowi_proto == IPPROTO_UDP) +	if (csum == 0 && fl6->flowi6_proto == IPPROTO_UDP)  		csum = CSUM_MANGLED_0;  	if (skb_store_bits(skb, offset, &csum, 2)) @@ -603,7 +602,7 @@ out:  }  static int rawv6_send_hdrinc(struct sock *sk, void *from, int length, -			struct flowi *fl, struct dst_entry **dstp, +			struct flowi6 *fl6, struct dst_entry **dstp,  			unsigned int flags)  {  	struct ipv6_pinfo *np = inet6_sk(sk); @@ -613,7 +612,7 @@ static int rawv6_send_hdrinc(struct sock *sk, void *from, int length,  	struct rt6_info *rt = (struct rt6_info *)*dstp;  	if (length > rt->dst.dev->mtu) { -		ipv6_local_error(sk, EMSGSIZE, fl, rt->dst.dev->mtu); +		ipv6_local_error(sk, EMSGSIZE, fl6, rt->dst.dev->mtu);  		return -EMSGSIZE;  	}  	if (flags&MSG_PROBE) @@ -662,7 +661,7 @@ error:  	return err;  } -static int rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg) +static int rawv6_probe_proto_opt(struct flowi6 *fl6, struct msghdr *msg)  {  	struct iovec *iov;  	u8 __user *type = NULL; @@ -679,7 +678,7 @@ static int rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg)  		if (!iov)  			continue; -		switch (fl->flowi_proto) { +		switch (fl6->flowi6_proto) {  		case IPPROTO_ICMPV6:  			/* check if one-byte field is readable or not. */  			if (iov->iov_base && iov->iov_len < 1) @@ -694,8 +693,8 @@ static int rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg)  				code = iov->iov_base;  			if (type && code) { -				if (get_user(fl->fl6_icmp_type, type) || -				    get_user(fl->fl6_icmp_code, code)) +				if (get_user(fl6->uli.icmpt.type, type) || +				    get_user(fl6->uli.icmpt.code, code))  					return -EFAULT;  				probed = 1;  			} @@ -706,7 +705,7 @@ static int rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg)  			/* check if type field is readable or not. */  			if (iov->iov_len > 2 - len) {  				u8 __user *p = iov->iov_base; -				if (get_user(fl->fl6_mh_type, &p[2 - len])) +				if (get_user(fl6->uli.mht.type, &p[2 - len]))  					return -EFAULT;  				probed = 1;  			} else @@ -735,7 +734,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,  	struct ipv6_txoptions *opt = NULL;  	struct ip6_flowlabel *flowlabel = NULL;  	struct dst_entry *dst = NULL; -	struct flowi fl; +	struct flowi6 fl6;  	int addr_len = msg->msg_namelen;  	int hlimit = -1;  	int tclass = -1; @@ -756,9 +755,9 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,  	/*  	 *	Get and verify the address.  	 */ -	memset(&fl, 0, sizeof(fl)); +	memset(&fl6, 0, sizeof(fl6)); -	fl.flowi_mark = sk->sk_mark; +	fl6.flowi6_mark = sk->sk_mark;  	if (sin6) {  		if (addr_len < SIN6_LEN_RFC2133) @@ -780,9 +779,9 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,  		daddr = &sin6->sin6_addr;  		if (np->sndflow) { -			fl.fl6_flowlabel = sin6->sin6_flowinfo&IPV6_FLOWINFO_MASK; -			if (fl.fl6_flowlabel&IPV6_FLOWLABEL_MASK) { -				flowlabel = fl6_sock_lookup(sk, fl.fl6_flowlabel); +			fl6.flowlabel = sin6->sin6_flowinfo&IPV6_FLOWINFO_MASK; +			if (fl6.flowlabel&IPV6_FLOWLABEL_MASK) { +				flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);  				if (flowlabel == NULL)  					return -EINVAL;  				daddr = &flowlabel->dst; @@ -800,32 +799,32 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,  		if (addr_len >= sizeof(struct sockaddr_in6) &&  		    sin6->sin6_scope_id &&  		    ipv6_addr_type(daddr)&IPV6_ADDR_LINKLOCAL) -			fl.flowi_oif = sin6->sin6_scope_id; +			fl6.flowi6_oif = sin6->sin6_scope_id;  	} else {  		if (sk->sk_state != TCP_ESTABLISHED)  			return -EDESTADDRREQ;  		proto = inet->inet_num;  		daddr = &np->daddr; -		fl.fl6_flowlabel = np->flow_label; +		fl6.flowlabel = np->flow_label;  	} -	if (fl.flowi_oif == 0) -		fl.flowi_oif = sk->sk_bound_dev_if; +	if (fl6.flowi6_oif == 0) +		fl6.flowi6_oif = sk->sk_bound_dev_if;  	if (msg->msg_controllen) {  		opt = &opt_space;  		memset(opt, 0, sizeof(struct ipv6_txoptions));  		opt->tot_len = sizeof(struct ipv6_txoptions); -		err = datagram_send_ctl(sock_net(sk), msg, &fl, opt, &hlimit, +		err = datagram_send_ctl(sock_net(sk), msg, &fl6, opt, &hlimit,  					&tclass, &dontfrag);  		if (err < 0) {  			fl6_sock_release(flowlabel);  			return err;  		} -		if ((fl.fl6_flowlabel&IPV6_FLOWLABEL_MASK) && !flowlabel) { -			flowlabel = fl6_sock_lookup(sk, fl.fl6_flowlabel); +		if ((fl6.flowlabel&IPV6_FLOWLABEL_MASK) && !flowlabel) { +			flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);  			if (flowlabel == NULL)  				return -EINVAL;  		} @@ -838,31 +837,31 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,  		opt = fl6_merge_options(&opt_space, flowlabel, opt);  	opt = ipv6_fixup_options(&opt_space, opt); -	fl.flowi_proto = proto; -	err = rawv6_probe_proto_opt(&fl, msg); +	fl6.flowi6_proto = proto; +	err = rawv6_probe_proto_opt(&fl6, msg);  	if (err)  		goto out;  	if (!ipv6_addr_any(daddr)) -		ipv6_addr_copy(&fl.fl6_dst, daddr); +		ipv6_addr_copy(&fl6.daddr, daddr);  	else -		fl.fl6_dst.s6_addr[15] = 0x1; /* :: means loopback (BSD'ism) */ -	if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr)) -		ipv6_addr_copy(&fl.fl6_src, &np->saddr); +		fl6.daddr.s6_addr[15] = 0x1; /* :: means loopback (BSD'ism) */ +	if (ipv6_addr_any(&fl6.saddr) && !ipv6_addr_any(&np->saddr)) +		ipv6_addr_copy(&fl6.saddr, &np->saddr); -	final_p = fl6_update_dst(&fl, opt, &final); +	final_p = fl6_update_dst(&fl6, opt, &final); -	if (!fl.flowi_oif && ipv6_addr_is_multicast(&fl.fl6_dst)) -		fl.flowi_oif = np->mcast_oif; -	security_sk_classify_flow(sk, &fl); +	if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr)) +		fl6.flowi6_oif = np->mcast_oif; +	security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); -	dst = ip6_dst_lookup_flow(sk, &fl, final_p, true); +	dst = ip6_dst_lookup_flow(sk, &fl6, final_p, true);  	if (IS_ERR(dst)) {  		err = PTR_ERR(dst);  		goto out;  	}  	if (hlimit < 0) { -		if (ipv6_addr_is_multicast(&fl.fl6_dst)) +		if (ipv6_addr_is_multicast(&fl6.daddr))  			hlimit = np->mcast_hops;  		else  			hlimit = np->hop_limit; @@ -881,17 +880,17 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,  back_from_confirm:  	if (inet->hdrincl) -		err = rawv6_send_hdrinc(sk, msg->msg_iov, len, &fl, &dst, msg->msg_flags); +		err = rawv6_send_hdrinc(sk, msg->msg_iov, len, &fl6, &dst, msg->msg_flags);  	else {  		lock_sock(sk);  		err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov, -			len, 0, hlimit, tclass, opt, &fl, (struct rt6_info*)dst, +			len, 0, hlimit, tclass, opt, &fl6, (struct rt6_info*)dst,  			msg->msg_flags, dontfrag);  		if (err)  			ip6_flush_pending_frames(sk);  		else if (!(msg->msg_flags & MSG_MORE)) -			err = rawv6_push_pending_frames(sk, &fl, rp); +			err = rawv6_push_pending_frames(sk, &fl6, rp);  		release_sock(sk);  	}  done:  |