Commit 6281dcc9 authored by David S. Miller's avatar David S. Miller
Browse files

net: Make flowi ports AF dependent.



Create two sets of port member accessors, one set prefixed by fl4_*
and the other prefixed by fl6_*

This will let us to create AF optimal flow instances.

It will work because every context in which we access the ports,
we have to be fully aware of which AF the flowi is anyways.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 08704bcb
Loading
Loading
Loading
Loading
+14 −7
Original line number Diff line number Diff line
@@ -89,13 +89,20 @@ struct flowi {
#define fl4_scope	flowi_scope

	union flowi_uli uli_u;
#define fl_ip_sport	uli_u.ports.sport
#define fl_ip_dport	uli_u.ports.dport
#define fl_icmp_type	uli_u.icmpt.type
#define fl_icmp_code	uli_u.icmpt.code
#define fl_ipsec_spi	uli_u.spi
#define fl_mh_type	uli_u.mht.type
#define fl_gre_key	uli_u.gre_key
#define fl4_sport	uli_u.ports.sport
#define fl4_dport	uli_u.ports.dport
#define fl4_icmp_type	uli_u.icmpt.type
#define fl4_icmp_code	uli_u.icmpt.code
#define fl4_ipsec_spi	uli_u.spi
#define fl4_mh_type	uli_u.mht.type
#define fl4_gre_key	uli_u.gre_key
#define fl6_sport	uli_u.ports.sport
#define fl6_dport	uli_u.ports.dport
#define fl6_icmp_type	uli_u.icmpt.type
#define fl6_icmp_code	uli_u.icmpt.code
#define fl6_ipsec_spi	uli_u.spi
#define fl6_mh_type	uli_u.mht.type
#define fl6_gre_key	uli_u.gre_key
} __attribute__((__aligned__(BITS_PER_LONG/8)));

#define FLOW_DIR_IN	0
+23 −20
Original line number Diff line number Diff line
@@ -157,8 +157,8 @@ static inline struct rtable *ip_route_output_ports(struct net *net, struct sock
		.fl4_src = saddr,
		.fl4_tos = tos,
		.flowi_proto = proto,
		.fl_ip_dport = dport,
		.fl_ip_sport = sport,
		.fl4_dport = dport,
		.fl4_sport = sport,
	};
	if (sk)
		security_sk_classify_flow(sk, &fl);
@@ -175,7 +175,7 @@ static inline struct rtable *ip_route_output_gre(struct net *net,
		.fl4_src = saddr,
		.fl4_tos = tos,
		.flowi_proto = IPPROTO_GRE,
		.fl_gre_key = gre_key,
		.fl4_gre_key = gre_key,
	};
	return ip_route_output_key(net, &fl);
}
@@ -228,14 +228,16 @@ static inline struct rtable *ip_route_connect(__be32 dst, __be32 src, u32 tos,
					      __be16 sport, __be16 dport,
					      struct sock *sk, bool can_sleep)
{
	struct flowi fl = { .flowi_oif = oif,
	struct flowi fl = {
		.flowi_oif = oif,
		.flowi_mark = sk->sk_mark,
		.fl4_dst = dst,
		.fl4_src = src,
		.fl4_tos = tos,
		.flowi_proto = protocol,
			    .fl_ip_sport = sport,
			    .fl_ip_dport = dport };
		.fl4_sport = sport,
		.fl4_dport = dport,
	};
	struct net *net = sock_net(sk);
	struct rtable *rt;

@@ -264,15 +266,16 @@ static inline struct rtable *ip_route_newports(struct rtable *rt,
					       __be16 dport, struct sock *sk)
{
	if (sport != orig_sport || dport != orig_dport) {
		struct flowi fl = { .flowi_oif = rt->rt_oif,
		struct flowi fl = {
			.flowi_oif = rt->rt_oif,
			.flowi_mark = rt->rt_mark,
			.fl4_dst = rt->rt_key_dst,
			.fl4_src = rt->rt_key_src,
			.fl4_tos = rt->rt_tos,
			.flowi_proto = protocol,
				    .fl_ip_sport = sport,
				    .fl_ip_dport = dport };

			.fl4_sport = sport,
			.fl4_dport = dport
		};
		if (inet_sk(sk)->transparent)
			fl.flowi_flags |= FLOWI_FLAG_ANYSRC;
		if (protocol == IPPROTO_TCP)
+9 −9
Original line number Diff line number Diff line
@@ -800,7 +800,7 @@ static inline bool addr_match(const void *token1, const void *token2,
}

static __inline__
__be16 xfrm_flowi_sport(const struct flowi *fl)
__be16 xfrm_flowi_sport(const struct flowi *fl, const union flowi_uli *uli)
{
	__be16 port;
	switch(fl->flowi_proto) {
@@ -808,17 +808,17 @@ __be16 xfrm_flowi_sport(const struct flowi *fl)
	case IPPROTO_UDP:
	case IPPROTO_UDPLITE:
	case IPPROTO_SCTP:
		port = fl->fl_ip_sport;
		port = uli->ports.sport;
		break;
	case IPPROTO_ICMP:
	case IPPROTO_ICMPV6:
		port = htons(fl->fl_icmp_type);
		port = htons(uli->icmpt.type);
		break;
	case IPPROTO_MH:
		port = htons(fl->fl_mh_type);
		port = htons(uli->mht.type);
		break;
	case IPPROTO_GRE:
		port = htons(ntohl(fl->fl_gre_key) >> 16);
		port = htons(ntohl(uli->gre_key) >> 16);
		break;
	default:
		port = 0;	/*XXX*/
@@ -827,7 +827,7 @@ __be16 xfrm_flowi_sport(const struct flowi *fl)
}

static __inline__
__be16 xfrm_flowi_dport(const struct flowi *fl)
__be16 xfrm_flowi_dport(const struct flowi *fl, const union flowi_uli *uli)
{
	__be16 port;
	switch(fl->flowi_proto) {
@@ -835,14 +835,14 @@ __be16 xfrm_flowi_dport(const struct flowi *fl)
	case IPPROTO_UDP:
	case IPPROTO_UDPLITE:
	case IPPROTO_SCTP:
		port = fl->fl_ip_dport;
		port = uli->ports.dport;
		break;
	case IPPROTO_ICMP:
	case IPPROTO_ICMPV6:
		port = htons(fl->fl_icmp_code);
		port = htons(uli->icmpt.code);
		break;
	case IPPROTO_GRE:
		port = htons(ntohl(fl->fl_gre_key) & 0xffff);
		port = htons(ntohl(uli->gre_key) & 0xffff);
		break;
	default:
		port = 0;	/*XXX*/
+2 −2
Original line number Diff line number Diff line
@@ -471,8 +471,8 @@ static struct dst_entry* dccp_v4_route_skb(struct net *net, struct sock *sk,
		.fl4_src = ip_hdr(skb)->daddr,
		.fl4_tos = RT_CONN_FLAGS(sk),
		.flowi_proto = sk->sk_protocol,
		.fl_ip_sport = dccp_hdr(skb)->dccph_dport,
		.fl_ip_dport = dccp_hdr(skb)->dccph_sport,
		.fl4_sport = dccp_hdr(skb)->dccph_dport,
		.fl4_dport = dccp_hdr(skb)->dccph_sport,
	};

	security_skb_classify_flow(skb, &fl);
+10 −10
Original line number Diff line number Diff line
@@ -158,8 +158,8 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
			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.fl_ip_dport = inet->inet_dport;
			fl.fl_ip_sport = inet->inet_sport;
			fl.fl6_dport = inet->inet_dport;
			fl.fl6_sport = inet->inet_sport;
			security_sk_classify_flow(sk, &fl);

			dst = ip6_dst_lookup_flow(sk, &fl, NULL, false);
@@ -253,8 +253,8 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req,
	ipv6_addr_copy(&fl.fl6_src, &ireq6->loc_addr);
	fl.fl6_flowlabel = 0;
	fl.flowi_oif = ireq6->iif;
	fl.fl_ip_dport = inet_rsk(req)->rmt_port;
	fl.fl_ip_sport = inet_rsk(req)->loc_port;
	fl.fl6_dport = inet_rsk(req)->rmt_port;
	fl.fl6_sport = inet_rsk(req)->loc_port;
	security_req_classify_flow(req, &fl);

	opt = np->opt;
@@ -323,8 +323,8 @@ static void dccp_v6_ctl_send_reset(struct sock *sk, struct sk_buff *rxskb)

	fl.flowi_proto = IPPROTO_DCCP;
	fl.flowi_oif = inet6_iif(rxskb);
	fl.fl_ip_dport = dccp_hdr(skb)->dccph_dport;
	fl.fl_ip_sport = dccp_hdr(skb)->dccph_sport;
	fl.fl6_dport = dccp_hdr(skb)->dccph_dport;
	fl.fl6_sport = dccp_hdr(skb)->dccph_sport;
	security_skb_classify_flow(rxskb, &fl);

	/* sk = NULL, but it is safe for now. RST socket required. */
@@ -535,8 +535,8 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk,
		final_p = fl6_update_dst(&fl, opt, &final);
		ipv6_addr_copy(&fl.fl6_src, &ireq6->loc_addr);
		fl.flowi_oif = sk->sk_bound_dev_if;
		fl.fl_ip_dport = inet_rsk(req)->rmt_port;
		fl.fl_ip_sport = inet_rsk(req)->loc_port;
		fl.fl6_dport = inet_rsk(req)->rmt_port;
		fl.fl6_sport = inet_rsk(req)->loc_port;
		security_sk_classify_flow(sk, &fl);

		dst = ip6_dst_lookup_flow(sk, &fl, final_p, false);
@@ -957,8 +957,8 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
	ipv6_addr_copy(&fl.fl6_dst, &np->daddr);
	ipv6_addr_copy(&fl.fl6_src, saddr ? saddr : &np->saddr);
	fl.flowi_oif = sk->sk_bound_dev_if;
	fl.fl_ip_dport = usin->sin6_port;
	fl.fl_ip_sport = inet->inet_sport;
	fl.fl6_dport = usin->sin6_port;
	fl.fl6_sport = inet->inet_sport;
	security_sk_classify_flow(sk, &fl);

	final_p = fl6_update_dst(&fl, np->opt, &final);
Loading