diff options
Diffstat (limited to 'net/ipv6/datagram.c')
| -rw-r--r-- | net/ipv6/datagram.c | 75 | 
1 files changed, 38 insertions, 37 deletions
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 07e03e68243..04ae676d14e 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c @@ -40,7 +40,7 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)  	struct ipv6_pinfo      	*np = inet6_sk(sk);  	struct in6_addr		*daddr, *final_p, final;  	struct dst_entry	*dst; -	struct flowi		fl; +	struct flowi6		fl6;  	struct ip6_flowlabel	*flowlabel = NULL;  	struct ipv6_txoptions   *opt;  	int			addr_type; @@ -59,11 +59,11 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)  	if (usin->sin6_family != AF_INET6)  		return -EAFNOSUPPORT; -	memset(&fl, 0, sizeof(fl)); +	memset(&fl6, 0, sizeof(fl6));  	if (np->sndflow) { -		fl.fl6_flowlabel = usin->sin6_flowinfo&IPV6_FLOWINFO_MASK; -		if (fl.fl6_flowlabel&IPV6_FLOWLABEL_MASK) { -			flowlabel = fl6_sock_lookup(sk, fl.fl6_flowlabel); +		fl6.flowlabel = usin->sin6_flowinfo&IPV6_FLOWINFO_MASK; +		if (fl6.flowlabel&IPV6_FLOWLABEL_MASK) { +			flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);  			if (flowlabel == NULL)  				return -EINVAL;  			ipv6_addr_copy(&usin->sin6_addr, &flowlabel->dst); @@ -137,7 +137,7 @@ ipv4_connected:  	}  	ipv6_addr_copy(&np->daddr, daddr); -	np->flow_label = fl.fl6_flowlabel; +	np->flow_label = fl6.flowlabel;  	inet->inet_dport = usin->sin6_port; @@ -146,23 +146,23 @@ ipv4_connected:  	 *	destination cache for it.  	 */ -	fl.flowi_proto = sk->sk_protocol; -	ipv6_addr_copy(&fl.fl6_dst, &np->daddr); -	ipv6_addr_copy(&fl.fl6_src, &np->saddr); -	fl.flowi_oif = sk->sk_bound_dev_if; -	fl.flowi_mark = sk->sk_mark; -	fl.fl6_dport = inet->inet_dport; -	fl.fl6_sport = inet->inet_sport; +	fl6.flowi6_proto = sk->sk_protocol; +	ipv6_addr_copy(&fl6.daddr, &np->daddr); +	ipv6_addr_copy(&fl6.saddr, &np->saddr); +	fl6.flowi6_oif = sk->sk_bound_dev_if; +	fl6.flowi6_mark = sk->sk_mark; +	fl6.uli.ports.dport = inet->inet_dport; +	fl6.uli.ports.sport = inet->inet_sport; -	if (!fl.flowi_oif && (addr_type&IPV6_ADDR_MULTICAST)) -		fl.flowi_oif = np->mcast_oif; +	if (!fl6.flowi6_oif && (addr_type&IPV6_ADDR_MULTICAST)) +		fl6.flowi6_oif = np->mcast_oif; -	security_sk_classify_flow(sk, &fl); +	security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));  	opt = flowlabel ? flowlabel->opt : np->opt; -	final_p = fl6_update_dst(&fl, opt, &final); +	final_p = fl6_update_dst(&fl6, opt, &final); -	dst = ip6_dst_lookup_flow(sk, &fl, final_p, true); +	dst = ip6_dst_lookup_flow(sk, &fl6, final_p, true);  	err = 0;  	if (IS_ERR(dst)) {  		err = PTR_ERR(dst); @@ -172,20 +172,20 @@ ipv4_connected:  	/* source address lookup done in ip6_dst_lookup */  	if (ipv6_addr_any(&np->saddr)) -		ipv6_addr_copy(&np->saddr, &fl.fl6_src); +		ipv6_addr_copy(&np->saddr, &fl6.saddr);  	if (ipv6_addr_any(&np->rcv_saddr)) { -		ipv6_addr_copy(&np->rcv_saddr, &fl.fl6_src); +		ipv6_addr_copy(&np->rcv_saddr, &fl6.saddr);  		inet->inet_rcv_saddr = LOOPBACK4_IPV6;  		if (sk->sk_prot->rehash)  			sk->sk_prot->rehash(sk);  	}  	ip6_dst_store(sk, dst, -		      ipv6_addr_equal(&fl.fl6_dst, &np->daddr) ? +		      ipv6_addr_equal(&fl6.daddr, &np->daddr) ?  		      &np->daddr : NULL,  #ifdef CONFIG_IPV6_SUBTREES -		      ipv6_addr_equal(&fl.fl6_src, &np->saddr) ? +		      ipv6_addr_equal(&fl6.saddr, &np->saddr) ?  		      &np->saddr :  #endif  		      NULL); @@ -231,7 +231,7 @@ void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err,  		kfree_skb(skb);  } -void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info) +void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info)  {  	struct ipv6_pinfo *np = inet6_sk(sk);  	struct sock_exterr_skb *serr; @@ -250,7 +250,7 @@ void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info)  	skb_put(skb, sizeof(struct ipv6hdr));  	skb_reset_network_header(skb);  	iph = ipv6_hdr(skb); -	ipv6_addr_copy(&iph->daddr, &fl->fl6_dst); +	ipv6_addr_copy(&iph->daddr, &fl6->daddr);  	serr = SKB_EXT_ERR(skb);  	serr->ee.ee_errno = err; @@ -261,7 +261,7 @@ void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info)  	serr->ee.ee_info = info;  	serr->ee.ee_data = 0;  	serr->addr_offset = (u8 *)&iph->daddr - skb_network_header(skb); -	serr->port = fl->fl6_dport; +	serr->port = fl6->uli.ports.dport;  	__skb_pull(skb, skb_tail_pointer(skb) - skb->data);  	skb_reset_transport_header(skb); @@ -270,7 +270,7 @@ void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info)  		kfree_skb(skb);  } -void ipv6_local_rxpmtu(struct sock *sk, struct flowi *fl, u32 mtu) +void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu)  {  	struct ipv6_pinfo *np = inet6_sk(sk);  	struct ipv6hdr *iph; @@ -287,7 +287,7 @@ void ipv6_local_rxpmtu(struct sock *sk, struct flowi *fl, u32 mtu)  	skb_put(skb, sizeof(struct ipv6hdr));  	skb_reset_network_header(skb);  	iph = ipv6_hdr(skb); -	ipv6_addr_copy(&iph->daddr, &fl->fl6_dst); +	ipv6_addr_copy(&iph->daddr, &fl6->daddr);  	mtu_info = IP6CBMTU(skb);  	if (!mtu_info) { @@ -299,7 +299,7 @@ void ipv6_local_rxpmtu(struct sock *sk, struct flowi *fl, u32 mtu)  	mtu_info->ip6m_addr.sin6_family = AF_INET6;  	mtu_info->ip6m_addr.sin6_port = 0;  	mtu_info->ip6m_addr.sin6_flowinfo = 0; -	mtu_info->ip6m_addr.sin6_scope_id = fl->flowi_oif; +	mtu_info->ip6m_addr.sin6_scope_id = fl6->flowi6_oif;  	ipv6_addr_copy(&mtu_info->ip6m_addr.sin6_addr, &ipv6_hdr(skb)->daddr);  	__skb_pull(skb, skb_tail_pointer(skb) - skb->data); @@ -593,7 +593,7 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)  }  int datagram_send_ctl(struct net *net, -		      struct msghdr *msg, struct flowi *fl, +		      struct msghdr *msg, struct flowi6 *fl6,  		      struct ipv6_txoptions *opt,  		      int *hlimit, int *tclass, int *dontfrag)  { @@ -629,16 +629,17 @@ int datagram_send_ctl(struct net *net,  			src_info = (struct in6_pktinfo *)CMSG_DATA(cmsg);  			if (src_info->ipi6_ifindex) { -				if (fl->flowi_oif && src_info->ipi6_ifindex != fl->flowi_oif) +				if (fl6->flowi6_oif && +				    src_info->ipi6_ifindex != fl6->flowi6_oif)  					return -EINVAL; -				fl->flowi_oif = src_info->ipi6_ifindex; +				fl6->flowi6_oif = src_info->ipi6_ifindex;  			}  			addr_type = __ipv6_addr_type(&src_info->ipi6_addr);  			rcu_read_lock(); -			if (fl->flowi_oif) { -				dev = dev_get_by_index_rcu(net, fl->flowi_oif); +			if (fl6->flowi6_oif) { +				dev = dev_get_by_index_rcu(net, fl6->flowi6_oif);  				if (!dev) {  					rcu_read_unlock();  					return -ENODEV; @@ -654,7 +655,7 @@ int datagram_send_ctl(struct net *net,  						   strict ? dev : NULL, 0))  					err = -EINVAL;  				else -					ipv6_addr_copy(&fl->fl6_src, &src_info->ipi6_addr); +					ipv6_addr_copy(&fl6->saddr, &src_info->ipi6_addr);  			}  			rcu_read_unlock(); @@ -671,13 +672,13 @@ int datagram_send_ctl(struct net *net,  				goto exit_f;  			} -			if (fl->fl6_flowlabel&IPV6_FLOWINFO_MASK) { -				if ((fl->fl6_flowlabel^*(__be32 *)CMSG_DATA(cmsg))&~IPV6_FLOWINFO_MASK) { +			if (fl6->flowlabel&IPV6_FLOWINFO_MASK) { +				if ((fl6->flowlabel^*(__be32 *)CMSG_DATA(cmsg))&~IPV6_FLOWINFO_MASK) {  					err = -EINVAL;  					goto exit_f;  				}  			} -			fl->fl6_flowlabel = IPV6_FLOWINFO_MASK & *(__be32 *)CMSG_DATA(cmsg); +			fl6->flowlabel = IPV6_FLOWINFO_MASK & *(__be32 *)CMSG_DATA(cmsg);  			break;  		case IPV6_2292HOPOPTS:  |