From patchwork Mon Jun 13 20:47:36 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Frederic Sowa X-Patchwork-Id: 634866 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3rT4bv0N8yz9t0R for ; Tue, 14 Jun 2016 06:47:55 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=stressinduktion.org header.i=@stressinduktion.org header.b=bF3uvvHQ; dkim=pass (1024-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b=YAFDPXju; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1423197AbcFMUrv (ORCPT ); Mon, 13 Jun 2016 16:47:51 -0400 Received: from out1-smtp.messagingengine.com ([66.111.4.25]:56328 "EHLO out1-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1161183AbcFMUrt (ORCPT ); Mon, 13 Jun 2016 16:47:49 -0400 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.nyi.internal (Postfix) with ESMTP id CF5FF21FA2; Mon, 13 Jun 2016 16:47:48 -0400 (EDT) Received: from frontend1 ([10.202.2.160]) by compute3.internal (MEProxy); Mon, 13 Jun 2016 16:47:48 -0400 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= stressinduktion.org; h=cc:date:from:in-reply-to:message-id :references:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=eDmCI fS7wgzBNtMKSjSmQ8rprzk=; b=bF3uvvHQElZRaGzYwOC9DYpPVxIGSBvnJhxiq 5Jt2y0si5wJFdX69PzSPgyNw2oWW1KwaYD0fe2eMOszmfCkFsscByD2++A5gGcC7 gqMPDlfhJWv88/Cc4M1J2I69tHPV7vJrCCBBVo5+rKy2Zn8QnO7wg4CjlDQ9cOS1 ffo28M= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=cc:date:from:in-reply-to:message-id :references:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=eDmC IfS7wgzBNtMKSjSmQ8rprzk=; b=YAFDPXjuCcsrbOFjwU9H9pO996510T5jrGaI 1ubscd6hWNf+Wx/hz/DZT4HNTEiRgiNi9vWLUUwVMPBM5btU8RcShFEbnPyeOhm3 nbRU9J5TKkY3STvPYoa/DyhbiRjQY3mgCZiWs1v4N/6kJeUn8Si7xjWYxZFkVi/a UXnob8c= X-Sasl-enc: hKg8JK9bQCwNmhmR3CQP02cE0kkcEUVNgZ8DuS2MffN1 1465850867 Received: from z.localhost.localdomain (unknown [213.55.184.227]) by mail.messagingengine.com (Postfix) with ESMTPA id EED8EF2022; Mon, 13 Jun 2016 16:47:46 -0400 (EDT) From: Hannes Frederic Sowa To: netdev@vger.kernel.org Cc: ja@ssi.bg, dsa@cumulusnetworks.com Subject: [PATCH RFC 1/3] ipv4: make flow functions more grepable by removing flowi4_init_output Date: Mon, 13 Jun 2016 22:47:36 +0200 Message-Id: <1465850858-8559-2-git-send-email-hannes@stressinduktion.org> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1465850858-8559-1-git-send-email-hannes@stressinduktion.org> References: <1465850858-8559-1-git-send-email-hannes@stressinduktion.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org No functional changes. Signed-off-by: Hannes Frederic Sowa Reviewed-by: David Ahern --- include/net/flow.h | 21 --------------------- include/net/route.h | 33 +++++++++++++++++++++++++++------ net/ipv4/inet_connection_sock.c | 41 +++++++++++++++++++++++++++++------------ net/ipv4/ip_output.c | 21 ++++++++++++++------- net/ipv4/ping.c | 16 +++++++++++++--- net/ipv4/raw.c | 20 ++++++++++++++------ net/ipv4/route.c | 38 +++++++++++++++++++++++++++++--------- net/ipv4/syncookies.c | 19 ++++++++++++++----- net/ipv4/udp.c | 17 +++++++++++++---- 9 files changed, 153 insertions(+), 73 deletions(-) diff --git a/include/net/flow.h b/include/net/flow.h index d47ef4bb5423a3..2c8e95b987c98c 100644 --- a/include/net/flow.h +++ b/include/net/flow.h @@ -90,27 +90,6 @@ struct flowi4 { #define fl4_gre_key uli.gre_key } __attribute__((__aligned__(BITS_PER_LONG/8))); -static inline void flowi4_init_output(struct flowi4 *fl4, int oif, - __u32 mark, __u8 tos, __u8 scope, - __u8 proto, __u8 flags, - __be32 daddr, __be32 saddr, - __be16 dport, __be16 sport) -{ - fl4->flowi4_oif = oif; - fl4->flowi4_iif = LOOPBACK_IFINDEX; - fl4->flowi4_mark = mark; - fl4->flowi4_tos = tos; - fl4->flowi4_scope = scope; - fl4->flowi4_proto = proto; - fl4->flowi4_flags = flags; - fl4->flowi4_secid = 0; - fl4->flowi4_tun_key.tun_id = 0; - fl4->daddr = daddr; - fl4->saddr = saddr; - fl4->fl4_dport = dport; - fl4->fl4_sport = sport; -} - /* Reset some input parameters after previous lookup */ static inline void flowi4_update_output(struct flowi4 *fl4, int oif, __u8 tos, __be32 daddr, __be32 saddr) diff --git a/include/net/route.h b/include/net/route.h index ad777d79af9458..61164593d41ecf 100644 --- a/include/net/route.h +++ b/include/net/route.h @@ -151,10 +151,20 @@ static inline struct rtable *ip_route_output_ports(struct net *net, struct flowi __be16 dport, __be16 sport, __u8 proto, __u8 tos, int oif) { - flowi4_init_output(fl4, oif, sk ? sk->sk_mark : 0, tos, - RT_SCOPE_UNIVERSE, proto, - sk ? inet_sk_flowi_flags(sk) : 0, - daddr, saddr, dport, sport); + fl4->flowi4_oif = oif; + fl4->flowi4_iif = LOOPBACK_IFINDEX; + fl4->flowi4_mark = sk ? sk->sk_mark : 0; + fl4->flowi4_tos = tos; + fl4->flowi4_scope = RT_SCOPE_UNIVERSE; + fl4->flowi4_proto = proto; + fl4->flowi4_flags = sk ? inet_sk_flowi_flags(sk) : 0; + fl4->flowi4_secid = 0; + fl4->flowi4_tun_key.tun_id = 0; + fl4->daddr = daddr; + fl4->saddr = saddr; + fl4->fl4_dport = dport; + fl4->fl4_sport = sport; + if (sk) security_sk_classify_flow(sk, flowi4_to_flowi(fl4)); return ip_route_output_flow(net, fl4, sk); @@ -269,8 +279,19 @@ static inline void ip_route_connect_init(struct flowi4 *fl4, __be32 dst, __be32 if (inet_sk(sk)->transparent) flow_flags |= FLOWI_FLAG_ANYSRC; - flowi4_init_output(fl4, oif, sk->sk_mark, tos, RT_SCOPE_UNIVERSE, - protocol, flow_flags, dst, src, dport, sport); + fl4->flowi4_oif = oif; + fl4->flowi4_iif = LOOPBACK_IFINDEX; + fl4->flowi4_mark = sk->sk_mark; + fl4->flowi4_tos = tos; + fl4->flowi4_scope = RT_SCOPE_UNIVERSE; + fl4->flowi4_proto = protocol; + fl4->flowi4_flags = flow_flags; + fl4->flowi4_secid = 0; + fl4->flowi4_tun_key.tun_id = 0; + fl4->daddr = dst; + fl4->saddr = src; + fl4->fl4_dport = dport; + fl4->fl4_sport = sport; } static inline struct rtable *ip_route_connect(struct flowi4 *fl4, diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index fa8c39804bdbae..f84b851e050534 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c @@ -410,12 +410,20 @@ struct dst_entry *inet_csk_route_req(const struct sock *sk, struct ip_options_rcu *opt = ireq->opt; struct rtable *rt; - flowi4_init_output(fl4, ireq->ir_iif, ireq->ir_mark, - RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE, - sk->sk_protocol, inet_sk_flowi_flags(sk), - (opt && opt->opt.srr) ? opt->opt.faddr : ireq->ir_rmt_addr, - ireq->ir_loc_addr, ireq->ir_rmt_port, - htons(ireq->ir_num)); + fl4->flowi4_oif = ireq->ir_iif; + fl4->flowi4_iif = LOOPBACK_IFINDEX; + fl4->flowi4_mark = ireq->ir_mark; + fl4->flowi4_tos = RT_CONN_FLAGS(sk); + fl4->flowi4_scope = RT_SCOPE_UNIVERSE; + fl4->flowi4_proto = sk->sk_protocol; + fl4->flowi4_flags = inet_sk_flowi_flags(sk); + fl4->flowi4_secid = 0; + fl4->flowi4_tun_key.tun_id = 0; + fl4->daddr = (opt && opt->opt.srr) ? opt->opt.faddr : ireq->ir_rmt_addr; + fl4->saddr = ireq->ir_loc_addr; + fl4->fl4_dport = ireq->ir_rmt_port; + fl4->fl4_sport = htons(ireq->ir_num); + security_req_classify_flow(req, flowi4_to_flowi(fl4)); rt = ip_route_output_flow(net, fl4, sk); if (IS_ERR(rt)) @@ -447,12 +455,21 @@ struct dst_entry *inet_csk_route_child_sock(const struct sock *sk, rcu_read_lock(); opt = rcu_dereference(newinet->inet_opt); - flowi4_init_output(fl4, ireq->ir_iif, ireq->ir_mark, - RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE, - sk->sk_protocol, inet_sk_flowi_flags(sk), - (opt && opt->opt.srr) ? opt->opt.faddr : ireq->ir_rmt_addr, - ireq->ir_loc_addr, ireq->ir_rmt_port, - htons(ireq->ir_num)); + + fl4->flowi4_oif = ireq->ir_iif; + fl4->flowi4_iif = LOOPBACK_IFINDEX; + fl4->flowi4_mark = ireq->ir_mark; + fl4->flowi4_tos = RT_CONN_FLAGS(sk); + fl4->flowi4_scope = RT_SCOPE_UNIVERSE; + fl4->flowi4_proto = sk->sk_protocol; + fl4->flowi4_flags = inet_sk_flowi_flags(sk); + fl4->flowi4_secid = 0; + fl4->flowi4_tun_key.tun_id = 0; + fl4->daddr = (opt && opt->opt.srr) ? opt->opt.faddr : ireq->ir_rmt_addr; + fl4->saddr = ireq->ir_loc_addr; + fl4->fl4_dport = ireq->ir_rmt_port; + fl4->fl4_sport = htons(ireq->ir_num); + security_req_classify_flow(req, flowi4_to_flowi(fl4)); rt = ip_route_output_flow(net, fl4, sk); if (IS_ERR(rt)) diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index cbac493c913ac3..90076310888d7f 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -1567,13 +1567,20 @@ void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, if (!oif && netif_index_is_l3_master(net, skb->skb_iif)) oif = skb->skb_iif; - flowi4_init_output(&fl4, oif, - IP4_REPLY_MARK(net, skb->mark), - RT_TOS(arg->tos), - RT_SCOPE_UNIVERSE, ip_hdr(skb)->protocol, - ip_reply_arg_flowi_flags(arg), - daddr, saddr, - tcp_hdr(skb)->source, tcp_hdr(skb)->dest); + fl4.flowi4_oif = oif; + fl4.flowi4_iif = LOOPBACK_IFINDEX; + fl4.flowi4_mark = IP4_REPLY_MARK(net, skb->mark); + fl4.flowi4_tos = RT_TOS(arg->tos); + fl4.flowi4_scope = RT_SCOPE_UNIVERSE; + fl4.flowi4_proto = ip_hdr(skb)->protocol; + fl4.flowi4_flags = ip_reply_arg_flowi_flags(arg); + fl4.flowi4_secid = 0; + fl4.flowi4_tun_key.tun_id = 0; + fl4.daddr = daddr; + fl4.saddr = saddr; + fl4.fl4_dport = tcp_hdr(skb)->source; + fl4.fl4_sport = tcp_hdr(skb)->dest; + security_skb_classify_flow(skb, flowi4_to_flowi(&fl4)); rt = ip_route_output_key(net, &fl4); if (IS_ERR(rt)) diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c index 66ddcb60519a16..dc6a42d1136752 100644 --- a/net/ipv4/ping.c +++ b/net/ipv4/ping.c @@ -792,9 +792,19 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) } else if (!ipc.oif) ipc.oif = inet->uc_index; - flowi4_init_output(&fl4, ipc.oif, sk->sk_mark, tos, - RT_SCOPE_UNIVERSE, sk->sk_protocol, - inet_sk_flowi_flags(sk), faddr, saddr, 0, 0); + fl4.flowi4_oif = ipc.oif; + fl4.flowi4_iif = LOOPBACK_IFINDEX; + fl4.flowi4_mark = sk->sk_mark; + fl4.flowi4_tos = tos; + fl4.flowi4_scope = RT_SCOPE_UNIVERSE; + fl4.flowi4_proto = sk->sk_protocol; + fl4.flowi4_flags = inet_sk_flowi_flags(sk); + fl4.flowi4_secid = 0; + fl4.flowi4_tun_key.tun_id = 0; + fl4.daddr = faddr; + fl4.saddr = saddr; + fl4.fl4_dport = 0; + fl4.fl4_sport = 0; security_sk_classify_flow(sk, flowi4_to_flowi(&fl4)); rt = ip_route_output_flow(net, &fl4, sk); diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 438f50c1a6765c..50057df31fc9da 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -599,12 +599,20 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) } else if (!ipc.oif) ipc.oif = inet->uc_index; - flowi4_init_output(&fl4, ipc.oif, sk->sk_mark, tos, - RT_SCOPE_UNIVERSE, - inet->hdrincl ? IPPROTO_RAW : sk->sk_protocol, - inet_sk_flowi_flags(sk) | - (inet->hdrincl ? FLOWI_FLAG_KNOWN_NH : 0), - daddr, saddr, 0, 0); + fl4.flowi4_oif = ipc.oif; + fl4.flowi4_iif = LOOPBACK_IFINDEX; + fl4.flowi4_mark = sk->sk_mark; + fl4.flowi4_tos = tos; + fl4.flowi4_scope = RT_SCOPE_UNIVERSE; + fl4.flowi4_proto = inet->hdrincl ? IPPROTO_RAW : sk->sk_protocol; + fl4.flowi4_flags = inet_sk_flowi_flags(sk) | + inet->hdrincl ? FLOWI_FLAG_KNOWN_NH : 0; + fl4.flowi4_secid = 0; + fl4.flowi4_tun_key.tun_id = 0; + fl4.daddr = daddr; + fl4.saddr = saddr; + fl4.fl4_dport = 0; + fl4.fl4_sport = 0; if (!saddr && ipc.oif) { err = l3mdev_get_saddr(net, ipc.oif, &fl4); diff --git a/net/ipv4/route.c b/net/ipv4/route.c index a1f2830d811025..e8f499d224ec2a 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -514,10 +514,20 @@ static void __build_flow_key(struct flowi4 *fl4, const struct sock *sk, tos = RT_CONN_FLAGS(sk); prot = inet->hdrincl ? IPPROTO_RAW : sk->sk_protocol; } - flowi4_init_output(fl4, oif, mark, tos, - RT_SCOPE_UNIVERSE, prot, - flow_flags, - iph->daddr, iph->saddr, 0, 0); + + fl4->flowi4_oif = oif; + fl4->flowi4_iif = LOOPBACK_IFINDEX; + fl4->flowi4_mark = mark; + fl4->flowi4_tos = tos; + fl4->flowi4_scope = RT_SCOPE_UNIVERSE; + fl4->flowi4_proto = prot; + fl4->flowi4_flags = flow_flags; + fl4->flowi4_secid = 0; + fl4->flowi4_tun_key.tun_id = 0; + fl4->daddr = iph->daddr; + fl4->saddr = iph->saddr; + fl4->fl4_dport = 0; + fl4->fl4_sport = 0; } static void build_skb_flow_key(struct flowi4 *fl4, const struct sk_buff *skb, @@ -542,11 +552,21 @@ static void build_sk_flow_key(struct flowi4 *fl4, const struct sock *sk) inet_opt = rcu_dereference(inet->inet_opt); if (inet_opt && inet_opt->opt.srr) daddr = inet_opt->opt.faddr; - flowi4_init_output(fl4, sk->sk_bound_dev_if, sk->sk_mark, - RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE, - inet->hdrincl ? IPPROTO_RAW : sk->sk_protocol, - inet_sk_flowi_flags(sk), - daddr, inet->inet_saddr, 0, 0); + + fl4->flowi4_oif = sk->sk_bound_dev_if; + fl4->flowi4_iif = LOOPBACK_IFINDEX; + fl4->flowi4_mark = sk->sk_mark; + fl4->flowi4_tos = RT_CONN_FLAGS(sk); + fl4->flowi4_scope = RT_SCOPE_UNIVERSE; + fl4->flowi4_proto = inet->hdrincl ? IPPROTO_RAW : sk->sk_protocol; + fl4->flowi4_flags = inet_sk_flowi_flags(sk); + fl4->flowi4_secid = 0; + fl4->flowi4_tun_key.tun_id = 0; + fl4->daddr = daddr; + fl4->saddr = inet->inet_saddr; + fl4->fl4_dport = 0; + fl4->fl4_sport = 0; + rcu_read_unlock(); } diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c index e3c4043c27de28..d5eedcae69f188 100644 --- a/net/ipv4/syncookies.c +++ b/net/ipv4/syncookies.c @@ -368,11 +368,20 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) * hasn't changed since we received the original syn, but I see * no easy way to do this. */ - flowi4_init_output(&fl4, ireq->ir_iif, ireq->ir_mark, - RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE, IPPROTO_TCP, - inet_sk_flowi_flags(sk), - opt->srr ? opt->faddr : ireq->ir_rmt_addr, - ireq->ir_loc_addr, th->source, th->dest); + fl4.flowi4_oif = ireq->ir_iif; + fl4.flowi4_iif = LOOPBACK_IFINDEX; + fl4.flowi4_mark = ireq->ir_mark; + fl4.flowi4_tos = RT_CONN_FLAGS(sk); + fl4.flowi4_scope = RT_SCOPE_UNIVERSE; + fl4.flowi4_proto = IPPROTO_TCP; + fl4.flowi4_flags = inet_sk_flowi_flags(sk); + fl4.flowi4_secid = 0; + fl4.flowi4_tun_key.tun_id = 0; + fl4.daddr = opt->srr ? opt->faddr : ireq->ir_rmt_addr; + fl4.saddr = ireq->ir_loc_addr; + fl4.fl4_dport = th->source; + fl4.fl4_sport = th->dest; + security_req_classify_flow(req, flowi4_to_flowi(&fl4)); rt = ip_route_output_key(sock_net(sk), &fl4); if (IS_ERR(rt)) { diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 0ff31d97d48586..2d3de2565e13bf 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1056,10 +1056,19 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) fl4 = &fl4_stack; - flowi4_init_output(fl4, ipc.oif, sk->sk_mark, tos, - RT_SCOPE_UNIVERSE, sk->sk_protocol, - flow_flags, - faddr, saddr, dport, inet->inet_sport); + fl4->flowi4_oif = ipc.oif; + fl4->flowi4_iif = LOOPBACK_IFINDEX; + fl4->flowi4_mark = sk->sk_mark; + fl4->flowi4_tos = tos; + fl4->flowi4_scope = RT_SCOPE_UNIVERSE; + fl4->flowi4_proto = sk->sk_protocol; + fl4->flowi4_flags = flow_flags; + fl4->flowi4_secid = 0; + fl4->flowi4_tun_key.tun_id = 0; + fl4->daddr = faddr; + fl4->saddr = saddr; + fl4->fl4_dport = dport; + fl4->fl4_sport = inet->inet_sport; if (!saddr && ipc.oif) { err = l3mdev_get_saddr(net, ipc.oif, fl4);