diff options
Diffstat (limited to 'net/ipv6/ip6_output.c')
| -rw-r--r-- | net/ipv6/ip6_output.c | 90 | 
1 files changed, 45 insertions, 45 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 3d0f2ac868a..18208876aa8 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -174,15 +174,15 @@ int ip6_output(struct sk_buff *skb)   *	xmit an sk_buff (used by TCP, SCTP and DCCP)   */ -int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, +int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,  	     struct ipv6_txoptions *opt)  {  	struct net *net = sock_net(sk);  	struct ipv6_pinfo *np = inet6_sk(sk); -	struct in6_addr *first_hop = &fl->fl6_dst; +	struct in6_addr *first_hop = &fl6->daddr;  	struct dst_entry *dst = skb_dst(skb);  	struct ipv6hdr *hdr; -	u8  proto = fl->flowi_proto; +	u8  proto = fl6->flowi6_proto;  	int seg_len = skb->len;  	int hlimit = -1;  	int tclass = 0; @@ -230,13 +230,13 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,  	if (hlimit < 0)  		hlimit = ip6_dst_hoplimit(dst); -	*(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | fl->fl6_flowlabel; +	*(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | fl6->flowlabel;  	hdr->payload_len = htons(seg_len);  	hdr->nexthdr = proto;  	hdr->hop_limit = hlimit; -	ipv6_addr_copy(&hdr->saddr, &fl->fl6_src); +	ipv6_addr_copy(&hdr->saddr, &fl6->saddr);  	ipv6_addr_copy(&hdr->daddr, first_hop);  	skb->priority = sk->sk_priority; @@ -879,7 +879,7 @@ static inline int ip6_rt_check(struct rt6key *rt_key,  static struct dst_entry *ip6_sk_dst_check(struct sock *sk,  					  struct dst_entry *dst, -					  struct flowi *fl) +					  struct flowi6 *fl6)  {  	struct ipv6_pinfo *np = inet6_sk(sk);  	struct rt6_info *rt = (struct rt6_info *)dst; @@ -904,11 +904,11 @@ static struct dst_entry *ip6_sk_dst_check(struct sock *sk,  	 *    sockets.  	 * 2. oif also should be the same.  	 */ -	if (ip6_rt_check(&rt->rt6i_dst, &fl->fl6_dst, np->daddr_cache) || +	if (ip6_rt_check(&rt->rt6i_dst, &fl6->daddr, np->daddr_cache) ||  #ifdef CONFIG_IPV6_SUBTREES -	    ip6_rt_check(&rt->rt6i_src, &fl->fl6_src, np->saddr_cache) || +	    ip6_rt_check(&rt->rt6i_src, &fl6->saddr, np->saddr_cache) ||  #endif -	    (fl->flowi_oif && fl->flowi_oif != dst->dev->ifindex)) { +	    (fl6->flowi6_oif && fl6->flowi6_oif != dst->dev->ifindex)) {  		dst_release(dst);  		dst = NULL;  	} @@ -918,22 +918,22 @@ out:  }  static int ip6_dst_lookup_tail(struct sock *sk, -			       struct dst_entry **dst, struct flowi *fl) +			       struct dst_entry **dst, struct flowi6 *fl6)  {  	int err;  	struct net *net = sock_net(sk);  	if (*dst == NULL) -		*dst = ip6_route_output(net, sk, fl); +		*dst = ip6_route_output(net, sk, fl6);  	if ((err = (*dst)->error))  		goto out_err_release; -	if (ipv6_addr_any(&fl->fl6_src)) { +	if (ipv6_addr_any(&fl6->saddr)) {  		err = ipv6_dev_get_saddr(net, ip6_dst_idev(*dst)->dev, -					 &fl->fl6_dst, +					 &fl6->daddr,  					 sk ? inet6_sk(sk)->srcprefs : 0, -					 &fl->fl6_src); +					 &fl6->saddr);  		if (err)  			goto out_err_release;  	} @@ -949,10 +949,10 @@ static int ip6_dst_lookup_tail(struct sock *sk,  	 */  	if ((*dst)->neighbour && !((*dst)->neighbour->nud_state & NUD_VALID)) {  		struct inet6_ifaddr *ifp; -		struct flowi fl_gw; +		struct flowi6 fl_gw6;  		int redirect; -		ifp = ipv6_get_ifaddr(net, &fl->fl6_src, +		ifp = ipv6_get_ifaddr(net, &fl6->saddr,  				      (*dst)->dev, 1);  		redirect = (ifp && ifp->flags & IFA_F_OPTIMISTIC); @@ -965,9 +965,9 @@ static int ip6_dst_lookup_tail(struct sock *sk,  			 * default router instead  			 */  			dst_release(*dst); -			memcpy(&fl_gw, fl, sizeof(struct flowi)); -			memset(&fl_gw.fl6_dst, 0, sizeof(struct in6_addr)); -			*dst = ip6_route_output(net, sk, &fl_gw); +			memcpy(&fl_gw6, fl6, sizeof(struct flowi6)); +			memset(&fl_gw6.daddr, 0, sizeof(struct in6_addr)); +			*dst = ip6_route_output(net, sk, &fl_gw6);  			if ((err = (*dst)->error))  				goto out_err_release;  		} @@ -988,23 +988,23 @@ out_err_release:   *	ip6_dst_lookup - perform route lookup on flow   *	@sk: socket which provides route info   *	@dst: pointer to dst_entry * for result - *	@fl: flow to lookup + *	@fl6: flow to lookup   *   *	This function performs a route lookup on the given flow.   *   *	It returns zero on success, or a standard errno code on error.   */ -int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl) +int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi6 *fl6)  {  	*dst = NULL; -	return ip6_dst_lookup_tail(sk, dst, fl); +	return ip6_dst_lookup_tail(sk, dst, fl6);  }  EXPORT_SYMBOL_GPL(ip6_dst_lookup);  /**   *	ip6_dst_lookup_flow - perform route lookup on flow with ipsec   *	@sk: socket which provides route info - *	@fl: flow to lookup + *	@fl6: flow to lookup   *	@final_dst: final destination address for ipsec lookup   *	@can_sleep: we are in a sleepable context   * @@ -1013,29 +1013,29 @@ EXPORT_SYMBOL_GPL(ip6_dst_lookup);   *	It returns a valid dst pointer on success, or a pointer encoded   *	error code.   */ -struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi *fl, +struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,  				      const struct in6_addr *final_dst,  				      bool can_sleep)  {  	struct dst_entry *dst = NULL;  	int err; -	err = ip6_dst_lookup_tail(sk, &dst, fl); +	err = ip6_dst_lookup_tail(sk, &dst, fl6);  	if (err)  		return ERR_PTR(err);  	if (final_dst) -		ipv6_addr_copy(&fl->fl6_dst, final_dst); +		ipv6_addr_copy(&fl6->daddr, final_dst);  	if (can_sleep) -		fl->flowi_flags |= FLOWI_FLAG_CAN_SLEEP; +		fl6->flowi6_flags |= FLOWI_FLAG_CAN_SLEEP; -	return xfrm_lookup(sock_net(sk), dst, fl, sk, 0); +	return xfrm_lookup(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);  }  EXPORT_SYMBOL_GPL(ip6_dst_lookup_flow);  /**   *	ip6_sk_dst_lookup_flow - perform socket cached route lookup on flow   *	@sk: socket which provides the dst cache and route info - *	@fl: flow to lookup + *	@fl6: flow to lookup   *	@final_dst: final destination address for ipsec lookup   *	@can_sleep: we are in a sleepable context   * @@ -1047,24 +1047,24 @@ EXPORT_SYMBOL_GPL(ip6_dst_lookup_flow);   *	It returns a valid dst pointer on success, or a pointer encoded   *	error code.   */ -struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi *fl, +struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,  					 const struct in6_addr *final_dst,  					 bool can_sleep)  {  	struct dst_entry *dst = sk_dst_check(sk, inet6_sk(sk)->dst_cookie);  	int err; -	dst = ip6_sk_dst_check(sk, dst, fl); +	dst = ip6_sk_dst_check(sk, dst, fl6); -	err = ip6_dst_lookup_tail(sk, &dst, fl); +	err = ip6_dst_lookup_tail(sk, &dst, fl6);  	if (err)  		return ERR_PTR(err);  	if (final_dst) -		ipv6_addr_copy(&fl->fl6_dst, final_dst); +		ipv6_addr_copy(&fl6->daddr, final_dst);  	if (can_sleep) -		fl->flowi_flags |= FLOWI_FLAG_CAN_SLEEP; +		fl6->flowi6_flags |= FLOWI_FLAG_CAN_SLEEP; -	return xfrm_lookup(sock_net(sk), dst, fl, sk, 0); +	return xfrm_lookup(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);  }  EXPORT_SYMBOL_GPL(ip6_sk_dst_lookup_flow); @@ -1145,7 +1145,7 @@ static inline struct ipv6_rt_hdr *ip6_rthdr_dup(struct ipv6_rt_hdr *src,  int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,  	int offset, int len, int odd, struct sk_buff *skb),  	void *from, int length, int transhdrlen, -	int hlimit, int tclass, struct ipv6_txoptions *opt, struct flowi *fl, +	int hlimit, int tclass, struct ipv6_txoptions *opt, struct flowi6 *fl6,  	struct rt6_info *rt, unsigned int flags, int dontfrag)  {  	struct inet_sock *inet = inet_sk(sk); @@ -1203,7 +1203,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,  		}  		dst_hold(&rt->dst);  		inet->cork.dst = &rt->dst; -		inet->cork.fl = *fl; +		inet->cork.fl.u.ip6 = *fl6;  		np->cork.hop_limit = hlimit;  		np->cork.tclass = tclass;  		mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ? @@ -1224,7 +1224,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,  		transhdrlen += exthdrlen;  	} else {  		rt = (struct rt6_info *)inet->cork.dst; -		fl = &inet->cork.fl; +		fl6 = &inet->cork.fl.u.ip6;  		opt = np->cork.opt;  		transhdrlen = 0;  		exthdrlen = 0; @@ -1239,7 +1239,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,  	if (mtu <= sizeof(struct ipv6hdr) + IPV6_MAXPLEN) {  		if (inet->cork.length + length > sizeof(struct ipv6hdr) + IPV6_MAXPLEN - fragheaderlen) { -			ipv6_local_error(sk, EMSGSIZE, fl, mtu-exthdrlen); +			ipv6_local_error(sk, EMSGSIZE, fl6, mtu-exthdrlen);  			return -EMSGSIZE;  		}  	} @@ -1271,7 +1271,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,  	if (length > mtu) {  		int proto = sk->sk_protocol;  		if (dontfrag && (proto == IPPROTO_UDP || proto == IPPROTO_RAW)){ -			ipv6_local_rxpmtu(sk, fl, mtu-exthdrlen); +			ipv6_local_rxpmtu(sk, fl6, mtu-exthdrlen);  			return -EMSGSIZE;  		} @@ -1516,8 +1516,8 @@ int ip6_push_pending_frames(struct sock *sk)  	struct ipv6hdr *hdr;  	struct ipv6_txoptions *opt = np->cork.opt;  	struct rt6_info *rt = (struct rt6_info *)inet->cork.dst; -	struct flowi *fl = &inet->cork.fl; -	unsigned char proto = fl->flowi_proto; +	struct flowi6 *fl6 = &inet->cork.fl.u.ip6; +	unsigned char proto = fl6->flowi6_proto;  	int err = 0;  	if ((skb = __skb_dequeue(&sk->sk_write_queue)) == NULL) @@ -1542,7 +1542,7 @@ int ip6_push_pending_frames(struct sock *sk)  	if (np->pmtudisc < IPV6_PMTUDISC_DO)  		skb->local_df = 1; -	ipv6_addr_copy(final_dst, &fl->fl6_dst); +	ipv6_addr_copy(final_dst, &fl6->daddr);  	__skb_pull(skb, skb_network_header_len(skb));  	if (opt && opt->opt_flen)  		ipv6_push_frag_opts(skb, opt, &proto); @@ -1553,12 +1553,12 @@ int ip6_push_pending_frames(struct sock *sk)  	skb_reset_network_header(skb);  	hdr = ipv6_hdr(skb); -	*(__be32*)hdr = fl->fl6_flowlabel | +	*(__be32*)hdr = fl6->flowlabel |  		     htonl(0x60000000 | ((int)np->cork.tclass << 20));  	hdr->hop_limit = np->cork.hop_limit;  	hdr->nexthdr = proto; -	ipv6_addr_copy(&hdr->saddr, &fl->fl6_src); +	ipv6_addr_copy(&hdr->saddr, &fl6->saddr);  	ipv6_addr_copy(&hdr->daddr, final_dst);  	skb->priority = sk->sk_priority;  |