Passing net through the netfilter hooks
Subsystems (15)
PATCH 40/84 ipvs: Pass ipvs not net to ip_vs_sync_conn
In reply to Eric W. Biederman--- include/net/ip_vs.h | 2 +- net/netfilter/ipvs/ip_vs_conn.c | 3 +-- net/netfilter/ipvs/ip_vs_core.c | 2 +- net/netfilter/ipvs/ip_vs_sync.c | 5 ++--- 4 files changed, 5 insertions(+), 7 deletions(-)
include/net/ip_vs.h +1 -1
@@ -1452,7 +1452,7 @@ static inline void ip_vs_dest_put_and_free(struct ip_vs_dest *dest)int start_sync_thread (struct netns_ipvs *ipvs,struct ipvs_sync_daemon_cfg *cfg,int state);int stop_sync_thread (struct netns_ipvs *ipvs,int state); -void ip_vs_sync_conn (struct net *net,struct ip_vs_conn *cp,int pkts); +void ip_vs_sync_conn (struct netns_ipvs *ipvs,struct ip_vs_conn *cp,int pkts);/* IPVS rate estimator prototypes (from ip_vs_est.c) */ void ip_vs_start_estimator (struct net *net,struct ip_vs_stats *stats);
net/netfilter/ipvs/ip_vs_conn.c +1 -2
@@ -801,7 +801,6 @@ static void ip_vs_conn_expire(unsigned long data) {struct ip_vs_conn *cp = (struct ip_vs_conn *)data;struct netns_ipvs *ipvs = cp->ipvs; -struct net *net = ipvs->net;/* * do I control anybody?
@@ -847,7 +846,7 @@ static void ip_vs_conn_expire(unsigned long data) cp->timeout =60 *HZ ;if (ipvs->sync_state &IP_VS_STATE_MASTER ) -ip_vs_sync_conn (net, cp,sysctl_sync_threshold (ipvs)); +ip_vs_sync_conn (ipvs, cp,sysctl_sync_threshold (ipvs));ip_vs_conn_put (cp); }
net/netfilter/ipvs/ip_vs_core.c +1 -1
@@ -1842,7 +1842,7 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af) pkts =atomic_add_return (1 , &cp->in_pkts);if (ipvs->sync_state &IP_VS_STATE_MASTER ) -ip_vs_sync_conn (net, cp, pkts); +ip_vs_sync_conn (ipvs, cp, pkts);ip_vs_conn_put (cp);return ret;
net/netfilter/ipvs/ip_vs_sync.c +2 -3
@@ -614,7 +614,7 @@ static void ip_vs_sync_conn_v0(struct netns_ipvs *ipvs, struct ip_vs_conn *cp, pkts =atomic_add_return (1 , &cp->in_pkts); else pkts =sysctl_sync_threshold (ipvs); -ip_vs_sync_conn (ipvs->net, cp, pkts); +ip_vs_sync_conn (ipvs, cp, pkts); } }
@@ -623,9 +623,8 @@ static void ip_vs_sync_conn_v0(struct netns_ipvs *ipvs, struct ip_vs_conn *cp,* Called by ip_vs_in. * Sending Version 1 messages */ -void ip_vs_sync_conn (struct net *net,struct ip_vs_conn *cp,int pkts) +void ip_vs_sync_conn (struct netns_ipvs *ipvs,struct ip_vs_conn *cp,int pkts) { -struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_sync_mesg *m;union ip_vs_sync_conn *s;struct ip_vs_sync_buff *buff;
Signature · 1 line
2.2.1
PATCH 41/84 ipvs: Pass ipvs not net to ip_vs_proc_conn
In reply to Eric W. Biederman--- net/netfilter/ipvs/ip_vs_sync.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
net/netfilter/ipvs/ip_vs_sync.c +6 -6
@@ -835,7 +835,7 @@ ip_vs_conn_fill_param_sync(struct netns_ipvs *ipvs, int af, union ip_vs_sync_con* Param: ... * timeout is in sec. */ -static void ip_vs_proc_conn(struct net *net, struct ip_vs_conn_param *param, +static void ip_vs_proc_conn(struct netns_ipvs *ipvs, struct ip_vs_conn_param *param, unsigned int flags, unsigned int state, unsigned int protocol, unsigned int type, const union nf_inet_addr *daddr, __be16 dport,
@@ -844,7 +844,6 @@ static void ip_vs_proc_conn(struct net *net, struct ip_vs_conn_param *param, {struct ip_vs_dest *dest;struct ip_vs_conn *cp; -struct netns_ipvs *ipvs =net_ipvs (net);if (!(flags &IP_VS_CONN_F_TEMPLATE )) { cp =ip_vs_conn_in_get (param);
@@ -1014,7 +1013,7 @@ static void ip_vs_process_message_v0(struct netns_ipvs *ipvs, const char *buffer s->vport, ¶m);/* Send timeout as Zero */ -ip_vs_proc_conn (ipvs->net, ¶m, flags, state, s->protocol,AF_INET , +ip_vs_proc_conn (ipvs, ¶m, flags, state, s->protocol,AF_INET , (union nf_inet_addr *)&s->daddr, s->dport,0 ,0 , opt); }
@@ -1067,6 +1066,7 @@ static int ip_vs_proc_str(__u8 *p, unsigned int plen, unsigned int *data_len,*/ static inline int ip_vs_proc_sync_conn (struct net *net,__u8 *p,__u8 *msg_end) { +struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_sync_conn_options opt;union ip_vs_sync_conn *s;struct ip_vs_protocol *pp;
@@ -1169,21 +1169,21 @@ static inline int ip_vs_proc_sync_conn(struct net *net, __u8 *p, __u8 *msg_end) state =0 ; } } -if (ip_vs_conn_fill_param_sync (net_ipvs (net), af, s, ¶m, pe_data, +if (ip_vs_conn_fill_param_sync (ipvs, af, s, ¶m, pe_data, pe_data_len, pe_name, pe_name_len)) { retc =50 ; goto out; }/* If only IPv4, just silent skip IPv6 */ if (af ==AF_INET ) -ip_vs_proc_conn (net, ¶m, flags, state, s->v4.protocol, af, +ip_vs_proc_conn (ipvs, ¶m, flags, state, s->v4.protocol, af, (union nf_inet_addr *)&s->v4.daddr, s->v4.dport,ntohl (s->v4.timeout),ntohl (s->v4.fwmark), (opt_flags &IPVS_OPT_F_SEQ_DATA ? &opt :NULL ) );#ifdef CONFIG_IP_VS_IPV6 else - ip_vs_proc_conn(net, ¶m, flags, state, s->v6.protocol, af, + ip_vs_proc_conn(ipvs, ¶m, flags, state, s->v6.protocol, af, (union nf_inet_addr *)&s->v6.daddr, s->v6.dport,ntohl (s->v6.timeout),ntohl (s->v6.fwmark), (opt_flags &IPVS_OPT_F_SEQ_DATA ? &opt :NULL )
Signature · 1 line
2.2.1
PATCH 42/84 ipvs: Pass ipvs not net to ip_vs_proc_sync_conn
In reply to Eric W. Biederman--- net/netfilter/ipvs/ip_vs_sync.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
net/netfilter/ipvs/ip_vs_sync.c +2 -3
@@ -1064,9 +1064,8 @@ static int ip_vs_proc_str(__u8 *p, unsigned int plen, unsigned int *data_len,/* * Process a Version 1 sync. connection */ -static inline int ip_vs_proc_sync_conn (struct net *net,__u8 *p,__u8 *msg_end) +static inline int ip_vs_proc_sync_conn (struct netns_ipvs *ipvs,__u8 *p,__u8 *msg_end) { -struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_sync_conn_options opt;union ip_vs_sync_conn *s;struct ip_vs_protocol *pp;
@@ -1254,7 +1253,7 @@ static void ip_vs_process_message(struct netns_ipvs *ipvs, __u8 *buffer,return ; }/* Process a single sync_conn */ - retc =ip_vs_proc_sync_conn (ipvs->net, p, msg_end); + retc =ip_vs_proc_sync_conn (ipvs, p, msg_end);if (retc <0 ) {IP_VS_ERR_RL ("BACKUP, Dropping buffer, Err: %d in decoding\n" , retc);
Signature · 1 line
2.2.1
PATCH 43/84 ipvs: Pass ipvs not net to ip_vs_sync_net_init
In reply to Eric W. Biederman--- include/net/ip_vs.h | 2 +- net/netfilter/ipvs/ip_vs_core.c | 2 +- net/netfilter/ipvs/ip_vs_sync.c | 4 +--- 3 files changed, 3 insertions(+), 5 deletions(-)
include/net/ip_vs.h +1 -1
@@ -1328,7 +1328,7 @@ int ip_vs_control_net_init(struct net *net);int ip_vs_protocol_net_init (struct net *net);int ip_vs_app_net_init (struct net *net);int ip_vs_conn_net_init (struct net *net); -int ip_vs_sync_net_init (struct net *net); +int ip_vs_sync_net_init (struct netns_ipvs *ipvs);void ip_vs_conn_net_cleanup (struct net *net);void ip_vs_app_net_cleanup (struct net *net);void ip_vs_protocol_net_cleanup (struct net *net);
net/netfilter/ipvs/ip_vs_core.c +1 -1
@@ -2087,7 +2087,7 @@ static int __net_init __ip_vs_init(struct net *net)if (ip_vs_conn_net_init (net) <0 ) goto conn_fail; -if (ip_vs_sync_net_init (net) <0 ) +if (ip_vs_sync_net_init (ipvs) <0 ) goto sync_fail; printk(KERN_INFO "IPVS: Creating netns size=%zu id=%d\n",
net/netfilter/ipvs/ip_vs_sync.c +1 -3
@@ -2007,10 +2007,8 @@ int stop_sync_thread(struct netns_ipvs *ipvs, int state)/* * Initialize data struct for each netns */ -int __net_init ip_vs_sync_net_init (struct net *net) +int __net_init ip_vs_sync_net_init (struct netns_ipvs *ipvs) { -struct netns_ipvs *ipvs =net_ipvs (net); -__mutex_init (&ipvs->sync_mutex,"ipvs->sync_mutex" , &__ipvs_sync_key);spin_lock_init (&ipvs->sync_lock);spin_lock_init (&ipvs->sync_buff_lock);
Signature · 1 line
2.2.1
PATCH 44/84 ipvs: Pass ipvs not net to ip_vs_sync_net_cleanup
In reply to Eric W. Biederman--- include/net/ip_vs.h | 2 +- net/netfilter/ipvs/ip_vs_core.c | 5 +++-- net/netfilter/ipvs/ip_vs_sync.c | 3 +-- 3 files changed, 5 insertions(+), 5 deletions(-)
include/net/ip_vs.h +1 -1
@@ -1334,7 +1334,7 @@ void ip_vs_app_net_cleanup(struct net *net);void ip_vs_protocol_net_cleanup (struct net *net);void ip_vs_control_net_cleanup (struct net *net);void ip_vs_estimator_net_cleanup (struct net *net); -void ip_vs_sync_net_cleanup (struct net *net); +void ip_vs_sync_net_cleanup (struct netns_ipvs *ipvs);void ip_vs_service_net_cleanup (struct netns_ipvs *ipvs);/* IPVS application functions
net/netfilter/ipvs/ip_vs_core.c +3 -2
@@ -2128,10 +2128,11 @@ static void __net_exit __ip_vs_cleanup(struct net *net) static void __net_exit __ip_vs_dev_cleanup(struct net *net) { +struct netns_ipvs *ipvs =net_ipvs (net);EnterFunction (2 ); -net_ipvs (net)->enable =0 ;/* Disable packet reception */ + ipvs->enable =0 ;/* Disable packet reception */ smp_wmb (); -ip_vs_sync_net_cleanup (net); +ip_vs_sync_net_cleanup (ipvs);LeaveFunction (2 ); }
net/netfilter/ipvs/ip_vs_sync.c +1 -2
@@ -2015,10 +2015,9 @@ int __net_init ip_vs_sync_net_init(struct netns_ipvs *ipvs)return 0 ; } -void ip_vs_sync_net_cleanup (struct net *net) +void ip_vs_sync_net_cleanup (struct netns_ipvs *ipvs) {int retc; -struct netns_ipvs *ipvs =net_ipvs (net);mutex_lock (&ipvs->sync_mutex); retc =stop_sync_thread (ipvs,IP_VS_STATE_MASTER );
Signature · 1 line
2.2.1
PATCH 45/84 ipvs: Pass ipvs not net to ip_vs_genl_set_config
In reply to Eric W. Biederman--- net/netfilter/ipvs/ip_vs_ctl.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
net/netfilter/ipvs/ip_vs_ctl.c +2 -3
@@ -3453,9 +3453,8 @@ static int ip_vs_genl_del_daemon(struct netns_ipvs *ipvs, struct nlattr **attrs)return ret; } -static int ip_vs_genl_set_config (struct net *net,struct nlattr **attrs) +static int ip_vs_genl_set_config (struct netns_ipvs *ipvs,struct nlattr **attrs) { -struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_timeout_user t;__ip_vs_get_timeouts (ipvs, &t);
@@ -3522,7 +3521,7 @@ static int ip_vs_genl_set_cmd(struct sk_buff *skb, struct genl_info *info) ret =ip_vs_flush (ipvs, false); goto out; }else if (cmd ==IPVS_CMD_SET_CONFIG ) { - ret =ip_vs_genl_set_config (net, info->attrs); + ret =ip_vs_genl_set_config (ipvs, info->attrs); goto out; }else if (cmd ==IPVS_CMD_ZERO && !info->attrs[IPVS_CMD_ATTR_SERVICE ]) {
Signature · 1 line
2.2.1
PATCH 46/84 ipvs: Pass ipvs not net to ip_vs_start_estimator aned ip_vs_stop_estimator
In reply to Eric W. Biederman--- include/net/ip_vs.h | 4 ++-- net/netfilter/ipvs/ip_vs_ctl.c | 12 ++++++------ net/netfilter/ipvs/ip_vs_est.c | 6 ++---- 3 files changed, 10 insertions(+), 12 deletions(-)
include/net/ip_vs.h +2 -2
@@ -1455,8 +1455,8 @@ int stop_sync_thread(struct netns_ipvs *ipvs, int state);void ip_vs_sync_conn (struct netns_ipvs *ipvs,struct ip_vs_conn *cp,int pkts);/* IPVS rate estimator prototypes (from ip_vs_est.c) */ -void ip_vs_start_estimator (struct net *net,struct ip_vs_stats *stats); -void ip_vs_stop_estimator (struct net *net,struct ip_vs_stats *stats); +void ip_vs_start_estimator (struct netns_ipvs *ipvs,struct ip_vs_stats *stats); +void ip_vs_stop_estimator (struct netns_ipvs *ipvs,struct ip_vs_stats *stats);void ip_vs_zero_estimator (struct ip_vs_stats *stats);void ip_vs_read_estimator (struct ip_vs_kstats *dst,struct ip_vs_stats *stats);
net/netfilter/ipvs/ip_vs_ctl.c +6 -6
@@ -840,7 +840,7 @@ __ip_vs_update_dest(struct ip_vs_service *svc, struct ip_vs_dest *dest,spin_unlock_bh (&dest->dst_lock);if (add) { -ip_vs_start_estimator (svc->ipvs->net, &dest->stats); +ip_vs_start_estimator (svc->ipvs, &dest->stats);list_add_rcu (&dest->n_list, &svc->destinations); svc->num_dests++; sched =rcu_dereference_protected (svc->scheduler,1 );
@@ -1036,7 +1036,7 @@ ip_vs_edit_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest)static void __ip_vs_del_dest (struct netns_ipvs *ipvs,struct ip_vs_dest *dest,bool cleanup) { -ip_vs_stop_estimator (ipvs->net, &dest->stats); +ip_vs_stop_estimator (ipvs, &dest->stats);/* * Remove it from the d-linked list with the real services.
@@ -1254,7 +1254,7 @@ ip_vs_add_service(struct netns_ipvs *ipvs, struct ip_vs_service_user_kern *u,else if (svc->port ==0 )atomic_inc (&ipvs->nullsvc_counter); -ip_vs_start_estimator (ipvs->net, &svc->stats); +ip_vs_start_estimator (ipvs, &svc->stats);/* Count only IPv4 services for old get/setsockopt interface */ if (svc->af ==AF_INET )
@@ -1382,7 +1382,7 @@ static void __ip_vs_del_service(struct ip_vs_service *svc, bool cleanup)if (svc->af ==AF_INET ) ipvs->num_services--; -ip_vs_stop_estimator (svc->ipvs->net, &svc->stats); +ip_vs_stop_estimator (svc->ipvs, &svc->stats);/* Unbind scheduler */ old_sched =rcu_dereference_protected (svc->scheduler,1 );
@@ -3917,7 +3917,7 @@ static int __net_init ip_vs_control_net_init_sysctl(struct net *net)kfree (tbl);return -ENOMEM ; } -ip_vs_start_estimator (net, &ipvs->tot_stats); +ip_vs_start_estimator (ipvs, &ipvs->tot_stats); ipvs->sysctl_tbl = tbl;/* Schedule defense work */ INIT_DELAYED_WORK (&ipvs->defense_work, defense_work_handler);
@@ -3933,7 +3933,7 @@ static void __net_exit ip_vs_control_net_cleanup_sysctl(struct net *net)cancel_delayed_work_sync (&ipvs->defense_work);cancel_work_sync (&ipvs->defense_work.work);unregister_net_sysctl_table (ipvs->sysctl_hdr); -ip_vs_stop_estimator (net, &ipvs->tot_stats); +ip_vs_stop_estimator (ipvs, &ipvs->tot_stats);if (!net_eq (net, &init_net))kfree (ipvs->sysctl_tbl);
net/netfilter/ipvs/ip_vs_est.c +2 -4
@@ -140,9 +140,8 @@ static void estimation_timer(unsigned long arg)mod_timer (&ipvs->est_timer, jiffies +2 *HZ ); } -void ip_vs_start_estimator (struct net *net,struct ip_vs_stats *stats) +void ip_vs_start_estimator (struct netns_ipvs *ipvs,struct ip_vs_stats *stats) { -struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_estimator *est = &stats->est;INIT_LIST_HEAD (&est->list);
@@ -152,9 +151,8 @@ void ip_vs_start_estimator(struct net *net, struct ip_vs_stats *stats)spin_unlock_bh (&ipvs->est_lock); } -void ip_vs_stop_estimator (struct net *net,struct ip_vs_stats *stats) +void ip_vs_stop_estimator (struct netns_ipvs *ipvs,struct ip_vs_stats *stats) { -struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_estimator *est = &stats->est;spin_lock_bh (&ipvs->est_lock);
Signature · 1 line
2.2.1
PATCH 47/84 ipvs: Pass ipvs not net to ip_vs_random_drop_entry
In reply to Eric W. Biederman--- include/net/ip_vs.h | 2 +- net/netfilter/ipvs/ip_vs_conn.c | 4 ++-- net/netfilter/ipvs/ip_vs_ctl.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-)
include/net/ip_vs.h +1 -1
@@ -1258,7 +1258,7 @@ const char *ip_vs_state_name(__u16 proto, int state);void ip_vs_tcp_conn_listen (struct net *net,struct ip_vs_conn *cp);int ip_vs_check_template (struct ip_vs_conn *ct); -void ip_vs_random_dropentry (struct net *net); +void ip_vs_random_dropentry (struct netns_ipvs *ipvs);int ip_vs_conn_init (void );void ip_vs_conn_cleanup (void );
net/netfilter/ipvs/ip_vs_conn.c +2 -2
@@ -1239,7 +1239,7 @@ static inline int todrop_entry(struct ip_vs_conn *cp) }/* Called from keventd and must protect itself from softirqs */ -void ip_vs_random_dropentry (struct net *net) +void ip_vs_random_dropentry (struct netns_ipvs *ipvs) {int idx;struct ip_vs_conn *cp, *cp_c;
@@ -1255,7 +1255,7 @@ void ip_vs_random_dropentry(struct net *net)if (cp->flags &IP_VS_CONN_F_TEMPLATE )/* connection template */ continue ; -if (!net_eq (cp->ipvs->net, net)) +if (cp->ipvs != ipvs)continue ;if (cp->protocol ==IPPROTO_TCP ) {switch (cp->state) {
net/netfilter/ipvs/ip_vs_ctl.c +1 -1
@@ -228,7 +228,7 @@ static void defense_work_handler(struct work_struct *work)update_defense_level (ipvs);if (atomic_read (&ipvs->dropentry)) -ip_vs_random_dropentry (ipvs->net); +ip_vs_random_dropentry (ipvs); schedule_delayed_work(&ipvs->defense_work, DEFENSE_TIMER_PERIOD); }#endif
Signature · 1 line
2.2.1
PATCH 48/84 ipvs: Pass ipvs not net to ip_vs_control_net_(init|cleanup)_sysctl
In reply to Eric W. Biederman--- net/netfilter/ipvs/ip_vs_ctl.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
net/netfilter/ipvs/ip_vs_ctl.c +8 -8
@@ -3841,10 +3841,10 @@ static void ip_vs_genl_unregister(void)* per netns intit/exit func. */ #ifdef CONFIG_SYSCTL -static int __net_init ip_vs_control_net_init_sysctl (struct net *net) +static int __net_init ip_vs_control_net_init_sysctl (struct netns_ipvs *ipvs) { +struct net *net = ipvs->net;int idx; -struct netns_ipvs *ipvs =net_ipvs (net);struct ctl_table *tbl;atomic_set (&ipvs->dropentry,0 );
@@ -3926,9 +3926,9 @@ static int __net_init ip_vs_control_net_init_sysctl(struct net *net)return 0 ; } -static void __net_exit ip_vs_control_net_cleanup_sysctl(struct net *net) +static void __net_exit ip_vs_control_net_cleanup_sysctl(struct netns_ipvs *ipvs) { -struct netns_ipvs *ipvs =net_ipvs (net); +struct net *net = ipvs->net;cancel_delayed_work_sync (&ipvs->defense_work);cancel_work_sync (&ipvs->defense_work.work);
@@ -3941,8 +3941,8 @@ static void __net_exit ip_vs_control_net_cleanup_sysctl(struct net *net)#else -static int __net_init ip_vs_control_net_init_sysctl (struct net *net) {return 0 ; } -static void __net_exit ip_vs_control_net_cleanup_sysctl(struct net *net) { } +static int __net_init ip_vs_control_net_init_sysctl (struct netns_ipvs *ipvs) {return 0 ; } +static void __net_exit ip_vs_control_net_cleanup_sysctl(struct netns_ipvs *ipvs) { }#endif
@@ -3984,7 +3984,7 @@ int __net_init ip_vs_control_net_init(struct net *net)proc_create ("ip_vs_stats_percpu" ,0 , net->proc_net, &ip_vs_stats_percpu_fops); -if (ip_vs_control_net_init_sysctl (net)) +if (ip_vs_control_net_init_sysctl (ipvs)) goto err;return 0 ;
@@ -3999,7 +3999,7 @@ void __net_exit ip_vs_control_net_cleanup(struct net *net)struct netns_ipvs *ipvs =net_ipvs (net);ip_vs_trash_cleanup (ipvs); -ip_vs_control_net_cleanup_sysctl (net); +ip_vs_control_net_cleanup_sysctl (ipvs);remove_proc_entry ("ip_vs_stats_percpu" , net->proc_net);remove_proc_entry ("ip_vs_stats" , net->proc_net);remove_proc_entry ("ip_vs" , net->proc_net);
Signature · 1 line
2.2.1
PATCH 49/84 ipvs: Pass ipvs not net into ip_vs_control_net_(init|cleanup)
In reply to Eric W. Biederman--- include/net/ip_vs.h | 4 ++-- net/netfilter/ipvs/ip_vs_core.c | 6 +++--- net/netfilter/ipvs/ip_vs_ctl.c | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-)
include/net/ip_vs.h +2 -2
@@ -1324,7 +1324,7 @@ ip_vs_control_add(struct ip_vs_conn *cp, struct ip_vs_conn *ctl_cp)/* IPVS netns init & cleanup functions */ int ip_vs_estimator_net_init (struct net *net); -int ip_vs_control_net_init (struct net *net); +int ip_vs_control_net_init (struct netns_ipvs *ipvs);int ip_vs_protocol_net_init (struct net *net);int ip_vs_app_net_init (struct net *net);int ip_vs_conn_net_init (struct net *net);
@@ -1332,7 +1332,7 @@ int ip_vs_sync_net_init(struct netns_ipvs *ipvs);void ip_vs_conn_net_cleanup (struct net *net);void ip_vs_app_net_cleanup (struct net *net);void ip_vs_protocol_net_cleanup (struct net *net); -void ip_vs_control_net_cleanup (struct net *net); +void ip_vs_control_net_cleanup (struct netns_ipvs *ipvs);void ip_vs_estimator_net_cleanup (struct net *net);void ip_vs_sync_net_cleanup (struct netns_ipvs *ipvs);void ip_vs_service_net_cleanup (struct netns_ipvs *ipvs);
net/netfilter/ipvs/ip_vs_core.c +3 -3
@@ -2075,7 +2075,7 @@ static int __net_init __ip_vs_init(struct net *net)if (ip_vs_estimator_net_init (net) <0 ) goto estimator_fail; -if (ip_vs_control_net_init (net) <0 ) +if (ip_vs_control_net_init (ipvs) <0 ) goto control_fail;if (ip_vs_protocol_net_init (net) <0 )
@@ -2104,7 +2104,7 @@ conn_fail: app_fail:ip_vs_protocol_net_cleanup (net); protocol_fail: -ip_vs_control_net_cleanup (net); +ip_vs_control_net_cleanup (ipvs); control_fail:ip_vs_estimator_net_cleanup (net); estimator_fail:
@@ -2120,7 +2120,7 @@ static void __net_exit __ip_vs_cleanup(struct net *net)ip_vs_conn_net_cleanup (net);ip_vs_app_net_cleanup (net);ip_vs_protocol_net_cleanup (net); -ip_vs_control_net_cleanup (net); +ip_vs_control_net_cleanup (ipvs);ip_vs_estimator_net_cleanup (net);IP_VS_DBG (2 ,"ipvs netns %d released\n" , ipvs->gen); net->ipvs =NULL ;
net/netfilter/ipvs/ip_vs_ctl.c +4 -4
@@ -3950,10 +3950,10 @@ static struct notifier_block ip_vs_dst_notifier = { .notifier_call = ip_vs_dst_event, }; -int __net_init ip_vs_control_net_init (struct net *net) +int __net_init ip_vs_control_net_init (struct netns_ipvs *ipvs) { +struct net *net = ipvs->net;int i, idx; -struct netns_ipvs *ipvs =net_ipvs (net);/* Initialize rs_table */ for (idx =0 ; idx <IP_VS_RTAB_SIZE ; idx++)
@@ -3994,9 +3994,9 @@ err:return -ENOMEM ; } -void __net_exit ip_vs_control_net_cleanup(struct net *net) +void __net_exit ip_vs_control_net_cleanup(struct netns_ipvs *ipvs) { -struct netns_ipvs *ipvs =net_ipvs (net); +struct net *net = ipvs->net;ip_vs_trash_cleanup (ipvs);ip_vs_control_net_cleanup_sysctl (ipvs);
Signature · 1 line
2.2.1
PATCH 50/84 ipvs: Pass ipvs not net to estimation_timer
In reply to Eric W. Biederman--- net/netfilter/ipvs/ip_vs_est.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
net/netfilter/ipvs/ip_vs_est.c +2 -4
@@ -102,10 +102,8 @@ static void estimation_timer(unsigned long arg)struct ip_vs_estimator *e;struct ip_vs_stats *s;u64 rate; -struct net *net = (struct net *)arg; -struct netns_ipvs *ipvs; +struct netns_ipvs *ipvs = (struct netns_ipvs *)arg; - ipvs =net_ipvs (net);spin_lock (&ipvs->est_lock);list_for_each_entry (e, &ipvs->est_list, list) { s = container_of(e, struct ip_vs_stats, est);
@@ -196,7 +194,7 @@ int __net_init ip_vs_estimator_net_init(struct net *net)INIT_LIST_HEAD (&ipvs->est_list);spin_lock_init (&ipvs->est_lock); -setup_timer (&ipvs->est_timer, estimation_timer, (unsigned long )net); +setup_timer (&ipvs->est_timer, estimation_timer, (unsigned long )ipvs);mod_timer (&ipvs->est_timer, jiffies +2 *HZ );return 0 ; }
Signature · 1 line
2.2.1
PATCH 51/84 ipvs: Pass ipvs not net to ip_vs_estimator_net_init and ip_vs_estimator_cleanup
In reply to Eric W. Biederman--- include/net/ip_vs.h | 4 ++-- net/netfilter/ipvs/ip_vs_core.c | 6 +++--- net/netfilter/ipvs/ip_vs_est.c | 8 +++----- 3 files changed, 8 insertions(+), 10 deletions(-)
include/net/ip_vs.h +2 -2
@@ -1323,7 +1323,7 @@ ip_vs_control_add(struct ip_vs_conn *cp, struct ip_vs_conn *ctl_cp) }/* IPVS netns init & cleanup functions */ -int ip_vs_estimator_net_init (struct net *net); +int ip_vs_estimator_net_init (struct netns_ipvs *ipvs);int ip_vs_control_net_init (struct netns_ipvs *ipvs);int ip_vs_protocol_net_init (struct net *net);int ip_vs_app_net_init (struct net *net);
@@ -1333,7 +1333,7 @@ void ip_vs_conn_net_cleanup(struct net *net);void ip_vs_app_net_cleanup (struct net *net);void ip_vs_protocol_net_cleanup (struct net *net);void ip_vs_control_net_cleanup (struct netns_ipvs *ipvs); -void ip_vs_estimator_net_cleanup (struct net *net); +void ip_vs_estimator_net_cleanup (struct netns_ipvs *ipvs);void ip_vs_sync_net_cleanup (struct netns_ipvs *ipvs);void ip_vs_service_net_cleanup (struct netns_ipvs *ipvs);
net/netfilter/ipvs/ip_vs_core.c +3 -3
@@ -2072,7 +2072,7 @@ static int __net_init __ip_vs_init(struct net *net)atomic_inc (&ipvs_netns_cnt); net->ipvs = ipvs; -if (ip_vs_estimator_net_init (net) <0 ) +if (ip_vs_estimator_net_init (ipvs) <0 ) goto estimator_fail;if (ip_vs_control_net_init (ipvs) <0 )
@@ -2106,7 +2106,7 @@ app_fail: protocol_fail:ip_vs_control_net_cleanup (ipvs); control_fail: -ip_vs_estimator_net_cleanup (net); +ip_vs_estimator_net_cleanup (ipvs); estimator_fail: net->ipvs =NULL ;return -ENOMEM ;
@@ -2121,7 +2121,7 @@ static void __net_exit __ip_vs_cleanup(struct net *net)ip_vs_app_net_cleanup (net);ip_vs_protocol_net_cleanup (net);ip_vs_control_net_cleanup (ipvs); -ip_vs_estimator_net_cleanup (net); +ip_vs_estimator_net_cleanup (ipvs);IP_VS_DBG (2 ,"ipvs netns %d released\n" , ipvs->gen); net->ipvs =NULL ; }
net/netfilter/ipvs/ip_vs_est.c +3 -5
@@ -188,10 +188,8 @@ void ip_vs_read_estimator(struct ip_vs_kstats *dst, struct ip_vs_stats *stats) dst->outbps = (e->outbps +0xF ) >>5 ; } -int __net_init ip_vs_estimator_net_init (struct net *net) +int __net_init ip_vs_estimator_net_init (struct netns_ipvs *ipvs) { -struct netns_ipvs *ipvs =net_ipvs (net); -INIT_LIST_HEAD (&ipvs->est_list);spin_lock_init (&ipvs->est_lock);setup_timer (&ipvs->est_timer, estimation_timer, (unsigned long )ipvs);
@@ -199,7 +197,7 @@ int __net_init ip_vs_estimator_net_init(struct net *net)return 0 ; } -void __net_exit ip_vs_estimator_net_cleanup(struct net *net) +void __net_exit ip_vs_estimator_net_cleanup(struct netns_ipvs *ipvs) { -del_timer_sync (&net_ipvs (net)->est_timer); +del_timer_sync (&ipvs->est_timer); }
Signature · 1 line
2.2.1
PATCH 52/84 ipvs: Pass ipvs not net into register_app and unregister_app
In reply to Eric W. Biederman--- include/net/ip_vs.h | 4 ++-- net/netfilter/ipvs/ip_vs_app.c | 6 ++++-- net/netfilter/ipvs/ip_vs_proto_sctp.c | 7 +++---- net/netfilter/ipvs/ip_vs_proto_tcp.c | 7 +++---- net/netfilter/ipvs/ip_vs_proto_udp.c | 7 +++---- 5 files changed, 15 insertions(+), 16 deletions(-)
include/net/ip_vs.h +2 -2
@@ -517,9 +517,9 @@ struct ip_vs_protocol {const struct sk_buff *skb, struct ip_vs_proto_data *pd); -int (*register_app)(struct net *net,struct ip_vs_app *inc); +int (*register_app)(struct netns_ipvs *ipvs,struct ip_vs_app *inc); -void (*unregister_app)(struct net *net,struct ip_vs_app *inc); +void (*unregister_app)(struct netns_ipvs *ipvs,struct ip_vs_app *inc);int (*app_conn_bind)(struct ip_vs_conn *cp);
net/netfilter/ipvs/ip_vs_app.c +4 -2
@@ -78,6 +78,7 @@ static int ip_vs_app_inc_new(struct net *net, struct ip_vs_app *app, __u16 proto, __u16 port) { + struct netns_ipvs *ipvs = net_ipvs(net);struct ip_vs_protocol *pp;struct ip_vs_app *inc;int ret;
@@ -107,7 +108,7 @@ ip_vs_app_inc_new(struct net *net, struct ip_vs_app *app, __u16 proto, } } - ret = pp->register_app (net, inc); + ret = pp->register_app (ipvs, inc);if (ret) goto out;
@@ -129,13 +130,14 @@ ip_vs_app_inc_new(struct net *net, struct ip_vs_app *app, __u16 proto,static void ip_vs_app_inc_release (struct net *net,struct ip_vs_app *inc) { +struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_protocol *pp;if (!(pp =ip_vs_proto_get (inc->protocol)))return ;if (pp->unregister_app) - pp->unregister_app (net, inc); + pp->unregister_app (ipvs, inc);IP_VS_DBG (9 ,"%s App %s:%u unregistered\n" , pp->name, inc->name,ntohs (inc->port));
net/netfilter/ipvs/ip_vs_proto_sctp.c +3 -4
@@ -487,13 +487,12 @@ static inline __u16 sctp_app_hashkey(__be16 port) &SCTP_APP_TAB_MASK ; } -static int sctp_register_app (struct net *net,struct ip_vs_app *inc) +static int sctp_register_app (struct netns_ipvs *ipvs,struct ip_vs_app *inc) {struct ip_vs_app *i;__u16 hash;__be16 port = inc->port;int ret =0 ; -struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_proto_data *pd =ip_vs_proto_data_get (ipvs,IPPROTO_SCTP ); hash =sctp_app_hashkey (port);
@@ -511,9 +510,9 @@ out:return ret; } -static void sctp_unregister_app (struct net *net,struct ip_vs_app *inc) +static void sctp_unregister_app (struct netns_ipvs *ipvs,struct ip_vs_app *inc) { -struct ip_vs_proto_data *pd =ip_vs_proto_data_get (net_ipvs (net),IPPROTO_SCTP ); +struct ip_vs_proto_data *pd =ip_vs_proto_data_get (ipvs,IPPROTO_SCTP );atomic_dec (&pd->appcnt);list_del_rcu (&inc->p_list);
net/netfilter/ipvs/ip_vs_proto_tcp.c +3 -4
@@ -595,13 +595,12 @@ static inline __u16 tcp_app_hashkey(__be16 port) } -static int tcp_register_app (struct net *net,struct ip_vs_app *inc) +static int tcp_register_app (struct netns_ipvs *ipvs,struct ip_vs_app *inc) {struct ip_vs_app *i;__u16 hash;__be16 port = inc->port;int ret =0 ; -struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_proto_data *pd =ip_vs_proto_data_get (ipvs,IPPROTO_TCP ); hash =tcp_app_hashkey (port);
@@ -621,9 +620,9 @@ static int tcp_register_app(struct net *net, struct ip_vs_app *inc)static void -tcp_unregister_app (struct net *net,struct ip_vs_app *inc) +tcp_unregister_app (struct netns_ipvs *ipvs,struct ip_vs_app *inc) { -struct ip_vs_proto_data *pd =ip_vs_proto_data_get (net_ipvs (net),IPPROTO_TCP ); +struct ip_vs_proto_data *pd =ip_vs_proto_data_get (ipvs,IPPROTO_TCP );atomic_dec (&pd->appcnt);list_del_rcu (&inc->p_list);
net/netfilter/ipvs/ip_vs_proto_udp.c +3 -4
@@ -365,13 +365,12 @@ static inline __u16 udp_app_hashkey(__be16 port) } -static int udp_register_app (struct net *net,struct ip_vs_app *inc) +static int udp_register_app (struct netns_ipvs *ipvs,struct ip_vs_app *inc) {struct ip_vs_app *i;__u16 hash;__be16 port = inc->port;int ret =0 ; -struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_proto_data *pd =ip_vs_proto_data_get (ipvs,IPPROTO_UDP ); hash =udp_app_hashkey (port);
@@ -391,9 +390,9 @@ static int udp_register_app(struct net *net, struct ip_vs_app *inc)static void -udp_unregister_app (struct net *net,struct ip_vs_app *inc) +udp_unregister_app (struct netns_ipvs *ipvs,struct ip_vs_app *inc) { -struct ip_vs_proto_data *pd =ip_vs_proto_data_get (net_ipvs (net),IPPROTO_UDP ); +struct ip_vs_proto_data *pd =ip_vs_proto_data_get (ipvs,IPPROTO_UDP );atomic_dec (&pd->appcnt);list_del_rcu (&inc->p_list);
Signature · 1 line
2.2.1
PATCH 53/84 ipvs: Pass ipvs not net into ip_vs_app_inc_new
In reply to Eric W. Biederman--- net/netfilter/ipvs/ip_vs_app.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/netfilter/ipvs/ip_vs_app.c +3 -3
@@ -75,10 +75,9 @@ static void ip_vs_app_inc_rcu_free(struct rcu_head *head)* Allocate/initialize app incarnation and register it in proto apps. */ static int -ip_vs_app_inc_new (struct net *net,struct ip_vs_app *app,__u16 proto, +ip_vs_app_inc_new (struct netns_ipvs *ipvs,struct ip_vs_app *app,__u16 proto,__u16 port) { -struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_protocol *pp;struct ip_vs_app *inc;int ret;
@@ -180,11 +179,12 @@ int register_ip_vs_app_inc(struct net *net, struct ip_vs_app *app, __u16 proto, __u16 port) { + struct netns_ipvs *ipvs = net_ipvs(net);int result;mutex_lock (&__ip_vs_app_mutex); - result =ip_vs_app_inc_new (net, app, proto, port); + result =ip_vs_app_inc_new (ipvs, app, proto, port);mutex_unlock (&__ip_vs_app_mutex);
Signature · 1 line
2.2.1
PATCH 54/84 ipvs: Pass ipvs not net to register_ip_vs_app_inc
In reply to Eric W. Biederman--- include/net/ip_vs.h | 2 +- net/netfilter/ipvs/ip_vs_app.c | 3 +-- net/netfilter/ipvs/ip_vs_ftp.c | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-)
include/net/ip_vs.h +1 -1
@@ -1345,7 +1345,7 @@ struct ip_vs_app *register_ip_vs_app(struct net *net, struct ip_vs_app *app);void unregister_ip_vs_app (struct net *net,struct ip_vs_app *app);int ip_vs_bind_app (struct ip_vs_conn *cp,struct ip_vs_protocol *pp);void ip_vs_unbind_app (struct ip_vs_conn *cp); -int register_ip_vs_app_inc (struct net *net,struct ip_vs_app *app,__u16 proto, +int register_ip_vs_app_inc (struct netns_ipvs *ipvs,struct ip_vs_app *app,__u16 proto,__u16 port);int ip_vs_app_inc_get (struct ip_vs_app *inc);void ip_vs_app_inc_put (struct ip_vs_app *inc);
net/netfilter/ipvs/ip_vs_app.c +1 -2
@@ -176,10 +176,9 @@ void ip_vs_app_inc_put(struct ip_vs_app *inc)* Register an application incarnation in protocol applications */ int -register_ip_vs_app_inc (struct net *net,struct ip_vs_app *app,__u16 proto, +register_ip_vs_app_inc (struct netns_ipvs *ipvs,struct ip_vs_app *app,__u16 proto,__u16 port) { -struct netns_ipvs *ipvs =net_ipvs (net);int result;mutex_lock (&__ip_vs_app_mutex);
net/netfilter/ipvs/ip_vs_ftp.c +1 -1
@@ -454,7 +454,7 @@ static int __net_init __ip_vs_ftp_init(struct net *net)for (i =0 ; i < ports_count; i++) {if (!ports[i])continue ; - ret =register_ip_vs_app_inc (net, app, app->protocol, ports[i]); + ret =register_ip_vs_app_inc (ipvs, app, app->protocol, ports[i]);if (ret) goto err_unreg; pr_info("%s: loaded support on port[%d] = %d\n",
Signature · 1 line
2.2.1
PATCH 55/84 ipvs: Pass ipvs not net to register_ip_vs_app and unregister_ip_vs_app
In reply to Eric W. BiedermanAlso move the tests for net_ipvs being NULL into __ip_vs_ftp_init and __ip_vs_ftp_exit. The only places where they possibly make sense.
--- include/net/ip_vs.h | 4 ++-- net/netfilter/ipvs/ip_vs_app.c | 17 ++++++----------- net/netfilter/ipvs/ip_vs_ftp.c | 11 ++++++++--- 3 files changed, 16 insertions(+), 16 deletions(-)
include/net/ip_vs.h +2 -2
@@ -1341,8 +1341,8 @@ void ip_vs_service_net_cleanup(struct netns_ipvs *ipvs);* (from ip_vs_app.c) */ #define IP_VS_APP_MAX_PORTS 8 -struct ip_vs_app *register_ip_vs_app (struct net *net,struct ip_vs_app *app); -void unregister_ip_vs_app (struct net *net,struct ip_vs_app *app); +struct ip_vs_app *register_ip_vs_app (struct netns_ipvs *ipvs,struct ip_vs_app *app); +void unregister_ip_vs_app (struct netns_ipvs *ipvs,struct ip_vs_app *app);int ip_vs_bind_app (struct ip_vs_conn *cp,struct ip_vs_protocol *pp);void ip_vs_unbind_app (struct ip_vs_conn *cp); int register_ip_vs_app_inc(struct netns_ipvs *ipvs, struct ip_vs_app *app, __u16 proto,
net/netfilter/ipvs/ip_vs_app.c +6 -11
@@ -192,15 +192,11 @@ register_ip_vs_app_inc(struct netns_ipvs *ipvs, struct ip_vs_app *app, __u16 pro/* Register application for netns */ -struct ip_vs_app *register_ip_vs_app (struct net *net,struct ip_vs_app *app) +struct ip_vs_app *register_ip_vs_app (struct netns_ipvs *ipvs,struct ip_vs_app *app) { -struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_app *a;int err =0 ; -if (!ipvs) -return ERR_PTR (-ENOENT ); -mutex_lock (&__ip_vs_app_mutex);list_for_each_entry (a, &ipvs->app_list, a_list) {
@@ -231,13 +227,10 @@ out_unlock:* We are sure there are no app incarnations attached to services * Caller should use synchronize_rcu() or rcu_barrier() */ -void unregister_ip_vs_app (struct net *net,struct ip_vs_app *app) +void unregister_ip_vs_app (struct netns_ipvs *ipvs,struct ip_vs_app *app) { -struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_app *a, *anxt, *inc, *nxt; - -if (!ipvs) -return ; +struct net *net = ipvs->net;mutex_lock (&__ip_vs_app_mutex);
@@ -623,6 +616,8 @@ int __net_init ip_vs_app_net_init(struct net *net) void __net_exit ip_vs_app_net_cleanup(struct net *net) { -unregister_ip_vs_app (net,NULL /* all */ ); +struct netns_ipvs *ipvs =net_ipvs (net); + +unregister_ip_vs_app (ipvs,NULL /* all */ );remove_proc_entry ("ip_vs_app" , net->proc_net); }
net/netfilter/ipvs/ip_vs_ftp.c +8 -3
@@ -447,7 +447,7 @@ static int __net_init __ip_vs_ftp_init(struct net *net)if (!ipvs)return -ENOENT ; - app =register_ip_vs_app (net, &ip_vs_ftp); + app =register_ip_vs_app (ipvs, &ip_vs_ftp);if (IS_ERR (app))return PTR_ERR (app);
@@ -463,7 +463,7 @@ static int __net_init __ip_vs_ftp_init(struct net *net)return 0 ; err_unreg: -unregister_ip_vs_app (net, &ip_vs_ftp); +unregister_ip_vs_app (ipvs, &ip_vs_ftp);return ret; }/*
@@ -471,7 +471,12 @@ err_unreg:*/ static void __ip_vs_ftp_exit (struct net *net) { -unregister_ip_vs_app (net, &ip_vs_ftp); +struct netns_ipvs *ipvs =net_ipvs (net); + +if (!ipvs) +return ; + +unregister_ip_vs_app (ipvs, &ip_vs_ftp); }static struct pernet_operations ip_vs_ftp_ops = {
Signature · 1 line
2.2.1
PATCH 56/84 ipvs: Pass ipvs not net into ip_vs_app_inc_release
In reply to Eric W. Biederman--- net/netfilter/ipvs/ip_vs_app.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
net/netfilter/ipvs/ip_vs_app.c +2 -4
@@ -127,9 +127,8 @@ ip_vs_app_inc_new(struct netns_ipvs *ipvs, struct ip_vs_app *app, __u16 proto,* Release app incarnation */ static void -ip_vs_app_inc_release (struct net *net,struct ip_vs_app *inc) +ip_vs_app_inc_release (struct netns_ipvs *ipvs,struct ip_vs_app *inc) { -struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_protocol *pp;if (!(pp =ip_vs_proto_get (inc->protocol)))
@@ -230,7 +229,6 @@ out_unlock:void unregister_ip_vs_app (struct netns_ipvs *ipvs,struct ip_vs_app *app) {struct ip_vs_app *a, *anxt, *inc, *nxt; -struct net *net = ipvs->net;mutex_lock (&__ip_vs_app_mutex);
@@ -238,7 +236,7 @@ void unregister_ip_vs_app(struct netns_ipvs *ipvs, struct ip_vs_app *app)if (app &&strcmp (app->name, a->name))continue ;list_for_each_entry_safe (inc, nxt, &a->incs_list, a_list) { -ip_vs_app_inc_release (net, inc); +ip_vs_app_inc_release (ipvs, inc); }list_del (&a->a_list);
Signature · 1 line
2.2.1
PATCH 57/84 ipvs: Pass ipvs not net into ip_vs_app_net_init and ip_vs_app_net_cleanup
In reply to Eric W. Biederman--- include/net/ip_vs.h | 4 ++-- net/netfilter/ipvs/ip_vs_app.c | 8 ++++---- net/netfilter/ipvs/ip_vs_core.c | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-)
include/net/ip_vs.h +2 -2
@@ -1326,11 +1326,11 @@ ip_vs_control_add(struct ip_vs_conn *cp, struct ip_vs_conn *ctl_cp)int ip_vs_estimator_net_init (struct netns_ipvs *ipvs);int ip_vs_control_net_init (struct netns_ipvs *ipvs);int ip_vs_protocol_net_init (struct net *net); -int ip_vs_app_net_init (struct net *net); +int ip_vs_app_net_init (struct netns_ipvs *ipvs);int ip_vs_conn_net_init (struct net *net);int ip_vs_sync_net_init (struct netns_ipvs *ipvs);void ip_vs_conn_net_cleanup (struct net *net); -void ip_vs_app_net_cleanup (struct net *net); +void ip_vs_app_net_cleanup (struct netns_ipvs *ipvs);void ip_vs_protocol_net_cleanup (struct net *net);void ip_vs_control_net_cleanup (struct netns_ipvs *ipvs);void ip_vs_estimator_net_cleanup (struct netns_ipvs *ipvs);
net/netfilter/ipvs/ip_vs_app.c +4 -4
@@ -603,18 +603,18 @@ static const struct file_operations ip_vs_app_fops = { };#endif -int __net_init ip_vs_app_net_init (struct net *net) +int __net_init ip_vs_app_net_init (struct netns_ipvs *ipvs) { -struct netns_ipvs *ipvs =net_ipvs (net); +struct net *net = ipvs->net;INIT_LIST_HEAD (&ipvs->app_list);proc_create ("ip_vs_app" ,0 , net->proc_net, &ip_vs_app_fops);return 0 ; } -void __net_exit ip_vs_app_net_cleanup(struct net *net) +void __net_exit ip_vs_app_net_cleanup(struct netns_ipvs *ipvs) { -struct netns_ipvs *ipvs =net_ipvs (net); +struct net *net = ipvs->net;unregister_ip_vs_app (ipvs,NULL /* all */ );remove_proc_entry ("ip_vs_app" , net->proc_net);
net/netfilter/ipvs/ip_vs_core.c +3 -3
@@ -2081,7 +2081,7 @@ static int __net_init __ip_vs_init(struct net *net)if (ip_vs_protocol_net_init (net) <0 ) goto protocol_fail; -if (ip_vs_app_net_init (net) <0 ) +if (ip_vs_app_net_init (ipvs) <0 ) goto app_fail;if (ip_vs_conn_net_init (net) <0 )
@@ -2100,7 +2100,7 @@ static int __net_init __ip_vs_init(struct net *net) sync_fail:ip_vs_conn_net_cleanup (net); conn_fail: -ip_vs_app_net_cleanup (net); +ip_vs_app_net_cleanup (ipvs); app_fail:ip_vs_protocol_net_cleanup (net); protocol_fail:
@@ -2118,7 +2118,7 @@ static void __net_exit __ip_vs_cleanup(struct net *net)ip_vs_service_net_cleanup (ipvs);/* ip_vs_flush() with locks */ ip_vs_conn_net_cleanup (net); -ip_vs_app_net_cleanup (net); +ip_vs_app_net_cleanup (ipvs);ip_vs_protocol_net_cleanup (net);ip_vs_control_net_cleanup (ipvs);ip_vs_estimator_net_cleanup (ipvs);
Signature · 1 line
2.2.1
PATCH 58/84 ipvs: Pass ipvs not net into [un]register_ip_vs_proto_netns
In reply to Eric W. Biederman--- net/netfilter/ipvs/ip_vs_proto.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
net/netfilter/ipvs/ip_vs_proto.c +7 -8
@@ -63,9 +63,8 @@ static int __used __init register_ip_vs_protocol(struct ip_vs_protocol *pp)* register an ipvs protocols netns related data */ static int -register_ip_vs_proto_netns (struct net *net,struct ip_vs_protocol *pp) +register_ip_vs_proto_netns (struct netns_ipvs *ipvs,struct ip_vs_protocol *pp) { -struct netns_ipvs *ipvs =net_ipvs (net);unsigned int hash =IP_VS_PROTO_HASH (pp->protocol);struct ip_vs_proto_data *pd =kzalloc (sizeof (struct ip_vs_proto_data ),GFP_KERNEL );
@@ -79,7 +78,7 @@ register_ip_vs_proto_netns(struct net *net, struct ip_vs_protocol *pp)atomic_set (&pd->appcnt,0 );/* Init app counter */ if (pp->init_netns !=NULL ) { -int ret = pp->init_netns (net, pd); +int ret = pp->init_netns (ipvs->net, pd);if (ret) {/* unlink an free proto data */ ipvs->proto_data_table[hash] = pd->next;
@@ -116,9 +115,8 @@ static int unregister_ip_vs_protocol(struct ip_vs_protocol *pp)* unregister an ipvs protocols netns data */ static int -unregister_ip_vs_proto_netns (struct net *net,struct ip_vs_proto_data *pd) +unregister_ip_vs_proto_netns (struct netns_ipvs *ipvs,struct ip_vs_proto_data *pd) { -struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_proto_data **pd_p;unsigned int hash =IP_VS_PROTO_HASH (pd->pp->protocol);
@@ -127,7 +125,7 @@ unregister_ip_vs_proto_netns(struct net *net, struct ip_vs_proto_data *pd)if (*pd_p == pd) { *pd_p = pd->next;if (pd->pp->exit_netns !=NULL ) - pd->pp->exit_netns (net, pd); + pd->pp->exit_netns (ipvs->net, pd);kfree (pd);return 0 ; }
@@ -329,9 +327,10 @@ int __net_init ip_vs_protocol_net_init(struct net *net) &ip_vs_protocol_esp,#endif }; +struct netns_ipvs *ipvs =net_ipvs (net);for (i =0 ; i <ARRAY_SIZE (protos); i++) { - ret =register_ip_vs_proto_netns (net, protos[i]); + ret =register_ip_vs_proto_netns (ipvs, protos[i]);if (ret <0 ) goto cleanup; }
@@ -351,7 +350,7 @@ void __net_exit ip_vs_protocol_net_cleanup(struct net *net)/* unregister all the ipvs proto data for this netns */ for (i =0 ; i <IP_VS_PROTO_TAB_SIZE ; i++) {while ((pd = ipvs->proto_data_table[i]) !=NULL ) -unregister_ip_vs_proto_netns (net, pd); +unregister_ip_vs_proto_netns (ipvs, pd); } }
Signature · 1 line
2.2.1
PATCH 59/84 ipvs: Pass ipvs not net into init_netns and exit_netns
In reply to Eric W. Biederman--- include/net/ip_vs.h | 4 ++-- net/netfilter/ipvs/ip_vs_proto.c | 4 ++-- net/netfilter/ipvs/ip_vs_proto_sctp.c | 6 ++---- net/netfilter/ipvs/ip_vs_proto_tcp.c | 6 ++---- net/netfilter/ipvs/ip_vs_proto_udp.c | 6 ++---- 5 files changed, 10 insertions(+), 16 deletions(-)
include/net/ip_vs.h +2 -2
@@ -483,9 +483,9 @@ struct ip_vs_protocol {void (*exit)(struct ip_vs_protocol *pp); -int (*init_netns)(struct net *net,struct ip_vs_proto_data *pd); +int (*init_netns)(struct netns_ipvs *ipvs,struct ip_vs_proto_data *pd); -void (*exit_netns)(struct net *net,struct ip_vs_proto_data *pd); +void (*exit_netns)(struct netns_ipvs *ipvs,struct ip_vs_proto_data *pd); int (*conn_schedule)(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,
net/netfilter/ipvs/ip_vs_proto.c +2 -2
@@ -78,7 +78,7 @@ register_ip_vs_proto_netns(struct netns_ipvs *ipvs, struct ip_vs_protocol *pp)atomic_set (&pd->appcnt,0 );/* Init app counter */ if (pp->init_netns !=NULL ) { -int ret = pp->init_netns (ipvs->net, pd); +int ret = pp->init_netns (ipvs, pd);if (ret) {/* unlink an free proto data */ ipvs->proto_data_table[hash] = pd->next;
@@ -125,7 +125,7 @@ unregister_ip_vs_proto_netns(struct netns_ipvs *ipvs, struct ip_vs_proto_data *pif (*pd_p == pd) { *pd_p = pd->next;if (pd->pp->exit_netns !=NULL ) - pd->pp->exit_netns (ipvs->net, pd); + pd->pp->exit_netns (ipvs, pd);kfree (pd);return 0 ; }
net/netfilter/ipvs/ip_vs_proto_sctp.c +2 -4
@@ -561,10 +561,8 @@ out:* timeouts is netns related now. * --------------------------------------------- */ -static int __ip_vs_sctp_init (struct net *net,struct ip_vs_proto_data *pd) +static int __ip_vs_sctp_init (struct netns_ipvs *ipvs,struct ip_vs_proto_data *pd) { -struct netns_ipvs *ipvs =net_ipvs (net); -ip_vs_init_hash_table (ipvs->sctp_apps,SCTP_APP_TAB_SIZE ); pd->timeout_table =ip_vs_create_timeout_table ((int *)sctp_timeouts,sizeof (sctp_timeouts));
@@ -573,7 +571,7 @@ static int __ip_vs_sctp_init(struct net *net, struct ip_vs_proto_data *pd)return 0 ; } -static void __ip_vs_sctp_exit (struct net *net,struct ip_vs_proto_data *pd) +static void __ip_vs_sctp_exit (struct netns_ipvs *ipvs,struct ip_vs_proto_data *pd) {kfree (pd->timeout_table); }
net/netfilter/ipvs/ip_vs_proto_tcp.c +2 -4
@@ -691,10 +691,8 @@ void ip_vs_tcp_conn_listen(struct net *net, struct ip_vs_conn *cp)* timeouts is netns related now. * --------------------------------------------- */ -static int __ip_vs_tcp_init (struct net *net,struct ip_vs_proto_data *pd) +static int __ip_vs_tcp_init (struct netns_ipvs *ipvs,struct ip_vs_proto_data *pd) { -struct netns_ipvs *ipvs =net_ipvs (net); -ip_vs_init_hash_table (ipvs->tcp_apps,TCP_APP_TAB_SIZE ); pd->timeout_table =ip_vs_create_timeout_table ((int *)tcp_timeouts,sizeof (tcp_timeouts));
@@ -704,7 +702,7 @@ static int __ip_vs_tcp_init(struct net *net, struct ip_vs_proto_data *pd)return 0 ; } -static void __ip_vs_tcp_exit (struct net *net,struct ip_vs_proto_data *pd) +static void __ip_vs_tcp_exit (struct netns_ipvs *ipvs,struct ip_vs_proto_data *pd) {kfree (pd->timeout_table); }
net/netfilter/ipvs/ip_vs_proto_udp.c +2 -4
@@ -472,10 +472,8 @@ udp_state_transition(struct ip_vs_conn *cp, int direction, cp->timeout = pd->timeout_table[IP_VS_UDP_S_NORMAL ]; } -static int __udp_init (struct net *net,struct ip_vs_proto_data *pd) +static int __udp_init (struct netns_ipvs *ipvs,struct ip_vs_proto_data *pd) { -struct netns_ipvs *ipvs =net_ipvs (net); -ip_vs_init_hash_table (ipvs->udp_apps,UDP_APP_TAB_SIZE ); pd->timeout_table =ip_vs_create_timeout_table ((int *)udp_timeouts,sizeof (udp_timeouts));
@@ -484,7 +482,7 @@ static int __udp_init(struct net *net, struct ip_vs_proto_data *pd)return 0 ; } -static void __udp_exit (struct net *net,struct ip_vs_proto_data *pd) +static void __udp_exit (struct netns_ipvs *ipvs,struct ip_vs_proto_data *pd) {kfree (pd->timeout_table); }
Signature · 1 line
2.2.1
PATCH 60/84 ipvs: Pass ipvs into ip_vs_conn_fill_param_proto
In reply to Eric W. BiedermanMove the ugly hack net_ipvs(skb_net(skb)) up a layer in the call stack so it is easier to remove.
--- net/netfilter/ipvs/ip_vs_conn.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
net/netfilter/ipvs/ip_vs_conn.c +6 -4
@@ -314,12 +314,12 @@ struct ip_vs_conn *ip_vs_conn_in_get(const struct ip_vs_conn_param *p) }static int -ip_vs_conn_fill_param_proto (int af,const struct sk_buff *skb, +ip_vs_conn_fill_param_proto (struct netns_ipvs *ipvs, +int af,const struct sk_buff *skb,const struct ip_vs_iphdr *iph,struct ip_vs_conn_param *p) {__be16 _ports[2 ], *pptr; -struct netns_ipvs *ipvs =net_ipvs (skb_net (skb)); pptr =frag_safe_skb_hp (skb, iph->len,sizeof (_ports), _ports, iph);if (pptr ==NULL )
@@ -338,9 +338,10 @@ struct ip_vs_conn * ip_vs_conn_in_get_proto(int af, const struct sk_buff *skb, const struct ip_vs_iphdr *iph) { + struct netns_ipvs *ipvs = net_ipvs(skb_net(skb));struct ip_vs_conn_param p; -if (ip_vs_conn_fill_param_proto (af, skb, iph, &p)) +if (ip_vs_conn_fill_param_proto (ipvs, af, skb, iph, &p))return NULL ;return ip_vs_conn_in_get (&p);
@@ -442,9 +443,10 @@ struct ip_vs_conn * ip_vs_conn_out_get_proto(int af, const struct sk_buff *skb, const struct ip_vs_iphdr *iph) { + struct netns_ipvs *ipvs = net_ipvs(skb_net(skb));struct ip_vs_conn_param p; -if (ip_vs_conn_fill_param_proto (af, skb, iph, &p)) +if (ip_vs_conn_fill_param_proto (ipvs, af, skb, iph, &p))return NULL ;return ip_vs_conn_out_get (&p);
Signature · 1 line
2.2.1
PATCH 61/84 ipvs: Pass ipvs into .conn_in_get and ip_vs_conn_in_get_proto
In reply to Eric W. BiedermanStop relying on "net_ipvs(skb_net(skb))" to derive the ipvs as skb_net is a hack.
--- include/net/ip_vs.h | 6 ++++-- net/netfilter/ipvs/ip_vs_conn.c | 4 ++-- net/netfilter/ipvs/ip_vs_core.c | 8 ++++---- net/netfilter/ipvs/ip_vs_proto_ah_esp.c | 3 +-- 4 files changed, 11 insertions(+), 10 deletions(-)
include/net/ip_vs.h +4 -2
@@ -493,7 +493,8 @@ struct ip_vs_protocol { struct ip_vs_iphdr *iph);struct ip_vs_conn * - (*conn_in_get)(int af, + (*conn_in_get)(struct netns_ipvs *ipvs, +int af,const struct sk_buff *skb,const struct ip_vs_iphdr *iph);
@@ -1222,7 +1223,8 @@ static inline void ip_vs_conn_fill_param(struct netns_ipvs *ipvs, int af, int prstruct ip_vs_conn *ip_vs_conn_in_get (const struct ip_vs_conn_param *p);struct ip_vs_conn *ip_vs_ct_in_get (const struct ip_vs_conn_param *p); -struct ip_vs_conn *ip_vs_conn_in_get_proto (int af,const struct sk_buff *skb, +struct ip_vs_conn *ip_vs_conn_in_get_proto (struct netns_ipvs *ipvs,int af, +const struct sk_buff *skb,const struct ip_vs_iphdr *iph);struct ip_vs_conn *ip_vs_conn_out_get (const struct ip_vs_conn_param *p);
net/netfilter/ipvs/ip_vs_conn.c +2 -2
@@ -335,10 +335,10 @@ ip_vs_conn_fill_param_proto(struct netns_ipvs *ipvs, }struct ip_vs_conn * -ip_vs_conn_in_get_proto (int af,const struct sk_buff *skb, +ip_vs_conn_in_get_proto (struct netns_ipvs *ipvs,int af, +const struct sk_buff *skb,const struct ip_vs_iphdr *iph) { -struct netns_ipvs *ipvs =net_ipvs (skb_net (skb));struct ip_vs_conn_param p;if (ip_vs_conn_fill_param_proto (ipvs, af, skb, iph, &p))
net/netfilter/ipvs/ip_vs_core.c +4 -4
@@ -469,7 +469,7 @@ ip_vs_schedule(struct ip_vs_service *svc, struct sk_buff *skb,*/ if ((!skb->dev || skb->dev->flags &IFF_LOOPBACK )) { iph->hdr_flags ^=IP_VS_HDR_INVERSE ; - cp = pp->conn_in_get (svc->af, skb, iph); + cp = pp->conn_in_get (svc->ipvs, svc->af, skb, iph); iph->hdr_flags ^=IP_VS_HDR_INVERSE ;if (cp) {
@@ -1490,7 +1490,7 @@ ip_vs_in_icmp(struct sk_buff *skb, int *related, unsigned int hooknum)/* The embedded headers contain source and dest in reverse order. * For IPIP this is error for request, not for reply. */ - cp = pp->conn_in_get (AF_INET , skb, &ciph); + cp = pp->conn_in_get (ipvs,AF_INET , skb, &ciph);if (!cp) {int v;
@@ -1648,7 +1648,7 @@ static int ip_vs_in_icmp_v6(struct sk_buff *skb, int *related,/* The embedded headers contain source and dest in reverse order * if not from localhost */ - cp = pp->conn_in_get (AF_INET6 , skb, &ciph); + cp = pp->conn_in_get (ipvs,AF_INET6 , skb, &ciph);if (!cp) {int v;
@@ -1780,7 +1780,7 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af)/* * Check if the packet belongs to an existing connection entry */ - cp = pp->conn_in_get (af, skb, &iph); + cp = pp->conn_in_get (ipvs, af, skb, &iph); conn_reuse_mode =sysctl_conn_reuse_mode (ipvs); if (conn_reuse_mode && !iph.fragoffs &&
net/netfilter/ipvs/ip_vs_proto_ah_esp.c +1 -2
@@ -56,12 +56,11 @@ ah_esp_conn_fill_param_proto(struct netns_ipvs *ipvs, int af, }static struct ip_vs_conn * -ah_esp_conn_in_get (int af,const struct sk_buff *skb, +ah_esp_conn_in_get (struct netns_ipvs *ipvs,int af,const struct sk_buff *skb,const struct ip_vs_iphdr *iph) {struct ip_vs_conn *cp;struct ip_vs_conn_param p; -struct netns_ipvs *ipvs =net_ipvs (skb_net (skb));ah_esp_conn_fill_param_proto (ipvs, af, iph, &p); cp =ip_vs_conn_in_get (&p);
Signature · 1 line
2.2.1
PATCH 62/84 ipvs: Pass ipvs into conn_out_get
In reply to Eric W. BiedermanMove the hack of relying on "net_ipvs(skb_net(skb))" to derive the ipvs up a layer.
--- include/net/ip_vs.h | 6 ++++-- net/netfilter/ipvs/ip_vs_conn.c | 4 ++-- net/netfilter/ipvs/ip_vs_core.c | 8 +++++--- net/netfilter/ipvs/ip_vs_proto_ah_esp.c | 3 +-- net/netfilter/xt_ipvs.c | 3 ++- 5 files changed, 14 insertions(+), 10 deletions(-)
include/net/ip_vs.h +4 -2
@@ -499,7 +499,8 @@ struct ip_vs_protocol { const struct ip_vs_iphdr *iph);struct ip_vs_conn * - (*conn_out_get)(int af, + (*conn_out_get)(struct netns_ipvs *ipvs, +int af,const struct sk_buff *skb,const struct ip_vs_iphdr *iph);
@@ -1229,7 +1230,8 @@ struct ip_vs_conn * ip_vs_conn_in_get_proto(struct netns_ipvs *ipvs, int af,struct ip_vs_conn *ip_vs_conn_out_get (const struct ip_vs_conn_param *p); -struct ip_vs_conn *ip_vs_conn_out_get_proto (int af,const struct sk_buff *skb, +struct ip_vs_conn *ip_vs_conn_out_get_proto (struct netns_ipvs *ipvs,int af, +const struct sk_buff *skb,const struct ip_vs_iphdr *iph);/* Get reference to gain full access to conn.
net/netfilter/ipvs/ip_vs_conn.c +2 -2
@@ -440,10 +440,10 @@ struct ip_vs_conn *ip_vs_conn_out_get(const struct ip_vs_conn_param *p) }struct ip_vs_conn * -ip_vs_conn_out_get_proto (int af,const struct sk_buff *skb, +ip_vs_conn_out_get_proto (struct netns_ipvs *ipvs,int af, +const struct sk_buff *skb,const struct ip_vs_iphdr *iph) { -struct netns_ipvs *ipvs =net_ipvs (skb_net (skb));struct ip_vs_conn_param p;if (ip_vs_conn_fill_param_proto (ipvs, af, skb, iph, &p))
net/netfilter/ipvs/ip_vs_core.c +5 -3
@@ -912,6 +912,7 @@ out:static int ip_vs_out_icmp (struct sk_buff *skb,int *related,unsigned int hooknum) { +struct netns_ipvs *ipvs =net_ipvs (skb_net (skb));struct iphdr *iph;struct icmphdr _icmph, *ic;struct iphdr _ciph, *cih;/* The ip header contained within the ICMP */
@@ -974,7 +975,7 @@ static int ip_vs_out_icmp(struct sk_buff *skb, int *related,ip_vs_fill_iph_skb_icmp (AF_INET , skb, offset, true, &ciph);/* The embedded headers contain source and dest in reverse order */ - cp = pp->conn_out_get (AF_INET , skb, &ciph); + cp = pp->conn_out_get (ipvs,AF_INET , skb, &ciph);if (!cp)return NF_ACCEPT ;
@@ -987,6 +988,7 @@ static int ip_vs_out_icmp(struct sk_buff *skb, int *related,static int ip_vs_out_icmp_v6 (struct sk_buff *skb,int *related,unsigned int hooknum,struct ip_vs_iphdr *ipvsh) { +struct netns_ipvs *ipvs =net_ipvs (skb_net (skb));struct icmp6hdr _icmph, *ic;struct ip_vs_iphdr ciph = {.flags =0 , .fragoffs =0 };/*Contained IP */ struct ip_vs_conn *cp;
@@ -1029,7 +1031,7 @@ static int ip_vs_out_icmp_v6(struct sk_buff *skb, int *related,return NF_ACCEPT ;/* The embedded headers contain source and dest in reverse order */ - cp = pp->conn_out_get (AF_INET6 , skb, &ciph); + cp = pp->conn_out_get (ipvs,AF_INET6 , skb, &ciph);if (!cp)return NF_ACCEPT ;
@@ -1257,7 +1259,7 @@ ip_vs_out(unsigned int hooknum, struct sk_buff *skb, int af)/* * Check if the packet belongs to an existing entry */ - cp = pp->conn_out_get (af, skb, &iph); + cp = pp->conn_out_get (ipvs, af, skb, &iph);if (likely (cp))return handle_response (af, skb, pd, cp, &iph, hooknum);
net/netfilter/ipvs/ip_vs_proto_ah_esp.c +1 -2
@@ -82,12 +82,11 @@ ah_esp_conn_in_get(struct netns_ipvs *ipvs, int af, const struct sk_buff *skb,static struct ip_vs_conn * -ah_esp_conn_out_get (int af,const struct sk_buff *skb, +ah_esp_conn_out_get (struct netns_ipvs *ipvs,int af,const struct sk_buff *skb,const struct ip_vs_iphdr *iph) {struct ip_vs_conn *cp;struct ip_vs_conn_param p; -struct netns_ipvs *ipvs =net_ipvs (skb_net (skb));ah_esp_conn_fill_param_proto (ipvs, af, iph, &p); cp =ip_vs_conn_out_get (&p);
net/netfilter/xt_ipvs.c +2 -1
@@ -48,6 +48,7 @@ static bool ipvs_mt(const struct sk_buff *skb, struct xt_action_param *par) { const struct xt_ipvs_mtinfo *data = par->matchinfo; +struct netns_ipvs *ipvs =net_ipvs (par->net);/* ipvs_mt_check ensures that family is only NFPROTO_IPV[46]. */ const u_int8_t family = par->family;struct ip_vs_iphdr iph;
@@ -85,7 +86,7 @@ ipvs_mt(const struct sk_buff *skb, struct xt_action_param *par)/* * Check if the packet belongs to an existing entry */ - cp = pp->conn_out_get (family, skb, &iph); + cp = pp->conn_out_get (ipvs, family, skb, &iph);if (unlikely (cp ==NULL )) { match = false; goto out;
Signature · 1 line
2.2.1
PATCH 63/84 ipvs: Pass ipvs not net to ip_vs_conn_hashkey
In reply to Eric W. BiedermanUse the address of struct netns_ipvs in the hash not the address of struct net. Both addresses are equally valid candidates and by using the address of struct netns_ipvs there becomes no need deal with struct net in this part of the code.
--- net/netfilter/ipvs/ip_vs_conn.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/netfilter/ipvs/ip_vs_conn.c +4 -4
@@ -108,7 +108,7 @@ static inline void ct_write_unlock_bh(unsigned int key)/* * Returns hash value for IPVS connection entry */ -static unsigned int ip_vs_conn_hashkey (struct net *net,int af,unsigned int proto, +static unsigned int ip_vs_conn_hashkey (struct netns_ipvs *ipvs,int af,unsigned int proto,const union nf_inet_addr *addr,__be16 port) {
@@ -116,11 +116,11 @@ static unsigned int ip_vs_conn_hashkey(struct net *net, int af, unsigned int proif (af ==AF_INET6 )return (jhash_3words (jhash (addr,16 , ip_vs_conn_rnd), (__force u32 )port, proto, ip_vs_conn_rnd) ^ - ((size_t )net>>8 )) & ip_vs_conn_tab_mask; + ((size_t )ipvs>>8 )) & ip_vs_conn_tab_mask;#endif return (jhash_3words ((__force u32 )addr->ip, (__force u32 )port, proto, ip_vs_conn_rnd) ^ - ((size_t )net>>8 )) & ip_vs_conn_tab_mask; + ((size_t )ipvs>>8 )) & ip_vs_conn_tab_mask; } static unsigned int ip_vs_conn_hashkey_param(const struct ip_vs_conn_param *p,
@@ -141,7 +141,7 @@ static unsigned int ip_vs_conn_hashkey_param(const struct ip_vs_conn_param *p, port = p->vport; } -return ip_vs_conn_hashkey (p->ipvs->net, p->af, p->protocol, addr, port); +return ip_vs_conn_hashkey (p->ipvs, p->af, p->protocol, addr, port); }static unsigned int ip_vs_conn_hashkey_conn (const struct ip_vs_conn *cp)
Signature · 1 line
2.2.1
PATCH 64/84 ipvs: Pass ipvs not net into ip_vs_conn_net_flush
In reply to Eric W. Biederman--- net/netfilter/ipvs/ip_vs_conn.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/netfilter/ipvs/ip_vs_conn.c +4 -3
@@ -1309,11 +1309,10 @@ void ip_vs_random_dropentry(struct netns_ipvs *ipvs)/* * Flush all the connection entries in the ip_vs_conn_tab */ -static void ip_vs_conn_flush (struct net *net) +static void ip_vs_conn_flush (struct netns_ipvs *ipvs) {int idx;struct ip_vs_conn *cp, *cp_c; -struct netns_ipvs *ipvs =net_ipvs (net); flush_again:rcu_read_lock ();
@@ -1359,8 +1358,10 @@ int __net_init ip_vs_conn_net_init(struct net *net) void __net_exit ip_vs_conn_net_cleanup(struct net *net) { +struct netns_ipvs *ipvs =net_ipvs (net); +/* flush all the connection entries first */ -ip_vs_conn_flush (net); +ip_vs_conn_flush (ipvs);remove_proc_entry ("ip_vs_conn" , net->proc_net);remove_proc_entry ("ip_vs_conn_sync" , net->proc_net); }
Signature · 1 line
2.2.1
PATCH 65/84 ipvs: Pass ipvs not net into ip_vs_conn_net_init and ip_vs_conn_net_cleanup
In reply to Eric W. Biederman--- include/net/ip_vs.h | 4 ++-- net/netfilter/ipvs/ip_vs_conn.c | 8 ++++---- net/netfilter/ipvs/ip_vs_core.c | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-)
include/net/ip_vs.h +2 -2
@@ -1331,9 +1331,9 @@ int ip_vs_estimator_net_init(struct netns_ipvs *ipvs);int ip_vs_control_net_init (struct netns_ipvs *ipvs);int ip_vs_protocol_net_init (struct net *net);int ip_vs_app_net_init (struct netns_ipvs *ipvs); -int ip_vs_conn_net_init (struct net *net); +int ip_vs_conn_net_init (struct netns_ipvs *ipvs);int ip_vs_sync_net_init (struct netns_ipvs *ipvs); -void ip_vs_conn_net_cleanup (struct net *net); +void ip_vs_conn_net_cleanup (struct netns_ipvs *ipvs);void ip_vs_app_net_cleanup (struct netns_ipvs *ipvs);void ip_vs_protocol_net_cleanup (struct net *net);void ip_vs_control_net_cleanup (struct netns_ipvs *ipvs);
net/netfilter/ipvs/ip_vs_conn.c +4 -4
@@ -1345,9 +1345,9 @@ flush_again:/* * per netns init and exit */ -int __net_init ip_vs_conn_net_init (struct net *net) +int __net_init ip_vs_conn_net_init (struct netns_ipvs *ipvs) { -struct netns_ipvs *ipvs =net_ipvs (net); +struct net *net = ipvs->net;atomic_set (&ipvs->conn_count,0 );
@@ -1356,9 +1356,9 @@ int __net_init ip_vs_conn_net_init(struct net *net)return 0 ; } -void __net_exit ip_vs_conn_net_cleanup(struct net *net) +void __net_exit ip_vs_conn_net_cleanup(struct netns_ipvs *ipvs) { -struct netns_ipvs *ipvs =net_ipvs (net); +struct net *net = ipvs->net;/* flush all the connection entries first */ ip_vs_conn_flush (ipvs);
net/netfilter/ipvs/ip_vs_core.c +3 -3
@@ -2086,7 +2086,7 @@ static int __net_init __ip_vs_init(struct net *net)if (ip_vs_app_net_init (ipvs) <0 ) goto app_fail; -if (ip_vs_conn_net_init (net) <0 ) +if (ip_vs_conn_net_init (ipvs) <0 ) goto conn_fail;if (ip_vs_sync_net_init (ipvs) <0 )
@@ -2100,7 +2100,7 @@ static int __net_init __ip_vs_init(struct net *net)*/ sync_fail: -ip_vs_conn_net_cleanup (net); +ip_vs_conn_net_cleanup (ipvs); conn_fail:ip_vs_app_net_cleanup (ipvs); app_fail:
@@ -2119,7 +2119,7 @@ static void __net_exit __ip_vs_cleanup(struct net *net)struct netns_ipvs *ipvs =net_ipvs (net);ip_vs_service_net_cleanup (ipvs);/* ip_vs_flush() with locks */ -ip_vs_conn_net_cleanup (net); +ip_vs_conn_net_cleanup (ipvs);ip_vs_app_net_cleanup (ipvs);ip_vs_protocol_net_cleanup (net);ip_vs_control_net_cleanup (ipvs);
Signature · 1 line
2.2.1
PATCH 66/84 ipvs: Pass ipvs into .conn_schedule and ip_vs_try_to_schedule
In reply to Eric W. BiedermanThis moves the hack "net_ipvs(skb_net(skb))" up one level where it will be easier to remove.
--- include/net/ip_vs.h | 3 ++- net/netfilter/ipvs/ip_vs_core.c | 11 ++++++----- net/netfilter/ipvs/ip_vs_proto_ah_esp.c | 3 ++- net/netfilter/ipvs/ip_vs_proto_sctp.c | 8 ++------ net/netfilter/ipvs/ip_vs_proto_tcp.c | 8 ++------ net/netfilter/ipvs/ip_vs_proto_udp.c | 9 +++------ 6 files changed, 17 insertions(+), 25 deletions(-)
include/net/ip_vs.h +2 -1
@@ -487,7 +487,8 @@ struct ip_vs_protocol {void (*exit_netns)(struct netns_ipvs *ipvs,struct ip_vs_proto_data *pd); -int (*conn_schedule)(int af,struct sk_buff *skb, +int (*conn_schedule)(struct netns_ipvs *ipvs, +int af,struct sk_buff *skb,struct ip_vs_proto_data *pd,int *verdict,struct ip_vs_conn **cpp,struct ip_vs_iphdr *iph);
net/netfilter/ipvs/ip_vs_core.c +6 -5
@@ -1360,7 +1360,8 @@ ip_vs_local_reply6(void *priv, struct sk_buff *skb,#endif static unsigned int -ip_vs_try_to_schedule (int af,struct sk_buff *skb,struct ip_vs_proto_data *pd, +ip_vs_try_to_schedule (struct netns_ipvs *ipvs,int af,struct sk_buff *skb, +struct ip_vs_proto_data *pd,int *verdict,struct ip_vs_conn **cpp,struct ip_vs_iphdr *iph) {
@@ -1372,7 +1373,7 @@ ip_vs_try_to_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,*/ /* Schedule and create new connection entry into cpp */ -if (!pp->conn_schedule (af, skb, pd, verdict, cpp, iph)) +if (!pp->conn_schedule (ipvs, af, skb, pd, verdict, cpp, iph))return 0 ; }
@@ -1500,7 +1501,7 @@ ip_vs_in_icmp(struct sk_buff *skb, int *related, unsigned int hooknum)if (!sysctl_schedule_icmp (ipvs))return NF_ACCEPT ; -if (!ip_vs_try_to_schedule (AF_INET , skb, pd, &v, &cp, &ciph)) +if (!ip_vs_try_to_schedule (ipvs,AF_INET , skb, pd, &v, &cp, &ciph))return v; new_cp = true; }
@@ -1658,7 +1659,7 @@ static int ip_vs_in_icmp_v6(struct sk_buff *skb, int *related,if (!sysctl_schedule_icmp (ipvs))return NF_ACCEPT ; -if (!ip_vs_try_to_schedule (AF_INET6 , skb, pd, &v, &cp, &ciph)) +if (!ip_vs_try_to_schedule (ipvs,AF_INET6 , skb, pd, &v, &cp, &ciph))return v; new_cp = true;
@@ -1799,7 +1800,7 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af)if (unlikely (!cp)) {int v; -if (!ip_vs_try_to_schedule (af, skb, pd, &v, &cp, &iph)) +if (!ip_vs_try_to_schedule (ipvs, af, skb, pd, &v, &cp, &iph))return v; }
net/netfilter/ipvs/ip_vs_proto_ah_esp.c +2 -1
@@ -104,7 +104,8 @@ ah_esp_conn_out_get(struct netns_ipvs *ipvs, int af, const struct sk_buff *skb,static int -ah_esp_conn_schedule (int af,struct sk_buff *skb,struct ip_vs_proto_data *pd, +ah_esp_conn_schedule (struct netns_ipvs *ipvs,int af,struct sk_buff *skb, +struct ip_vs_proto_data *pd,int *verdict,struct ip_vs_conn **cpp,struct ip_vs_iphdr *iph) {
net/netfilter/ipvs/ip_vs_proto_sctp.c +2 -6
@@ -9,20 +9,16 @@#include <net/ip_vs.h> static int -sctp_conn_schedule (int af,struct sk_buff *skb,struct ip_vs_proto_data *pd, +sctp_conn_schedule (struct netns_ipvs *ipvs,int af,struct sk_buff *skb, +struct ip_vs_proto_data *pd,int *verdict,struct ip_vs_conn **cpp,struct ip_vs_iphdr *iph) { -struct net *net;struct ip_vs_service *svc; -struct netns_ipvs *ipvs;sctp_chunkhdr_t _schunkh, *sch;sctp_sctphdr_t *sh, _sctph;__be16 _ports[2 ], *ports =NULL ; - net =skb_net (skb); - ipvs =net_ipvs (net); -if (likely (!ip_vs_iph_icmp (iph))) { sh =skb_header_pointer (skb, iph->len,sizeof (_sctph), &_sctph);if (sh) {
net/netfilter/ipvs/ip_vs_proto_tcp.c +2 -6
@@ -32,19 +32,15 @@#include <net/ip_vs.h> static int -tcp_conn_schedule (int af,struct sk_buff *skb,struct ip_vs_proto_data *pd, +tcp_conn_schedule (struct netns_ipvs *ipvs,int af,struct sk_buff *skb, +struct ip_vs_proto_data *pd,int *verdict,struct ip_vs_conn **cpp,struct ip_vs_iphdr *iph) { -struct net *net;struct ip_vs_service *svc;struct tcphdr _tcph, *th; -struct netns_ipvs *ipvs;__be16 _ports[2 ], *ports =NULL ; - net =skb_net (skb); - ipvs =net_ipvs (net); -/* In the event of icmp, we're only guaranteed to have the first 8 * bytes of the transport header, so we only check the rest of the * TCP packet for non-ICMP packets
net/netfilter/ipvs/ip_vs_proto_udp.c +3 -6
@@ -29,12 +29,11 @@#include <net/ip6_checksum.h> static int -udp_conn_schedule (int af,struct sk_buff *skb,struct ip_vs_proto_data *pd, +udp_conn_schedule (struct netns_ipvs *ipvs,int af,struct sk_buff *skb, +struct ip_vs_proto_data *pd,int *verdict,struct ip_vs_conn **cpp,struct ip_vs_iphdr *iph) { -struct net *net; -struct netns_ipvs *ipvs;struct ip_vs_service *svc;struct udphdr _udph, *uh;__be16 _ports[2 ], *ports =NULL ;
@@ -54,8 +53,6 @@ udp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,return 0 ; } - net =skb_net (skb); - ipvs =net_ipvs (net);rcu_read_lock ();if (likely (!ip_vs_iph_inverse (iph))) svc = ip_vs_service_find(ipvs, af, skb->mark, iph->protocol,
@@ -67,7 +64,7 @@ udp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,if (svc) {int ignored; -if (ip_vs_todrop (net_ipvs (net))) { +if (ip_vs_todrop (ipvs)) {/* * It seems that we are very loaded. * We have to drop this packet :(
Signature · 1 line
2.2.1
PATCH 67/84 ipvs: Better derivation of ipvs in ip_vs_tunnel_xmit
In reply to Eric W. BiedermanDon't use "net_ipvs(skb_net(skb))" as skb_net is a bad hack. Instead use cp->ipvs and ipvs->net for the net.
--- net/netfilter/ipvs/ip_vs_xmit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/netfilter/ipvs/ip_vs_xmit.c +2 -2
@@ -971,8 +971,8 @@ int ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp, struct ip_vs_iphdr *ipvsh) { - struct net *net = skb_net(skb); -struct netns_ipvs *ipvs =net_ipvs (net); + struct netns_ipvs *ipvs = cp->ipvs; +struct net *net = ipvs->net;struct rtable *rt;/* Route to the other host */ __be32 saddr;/* Source for tunnel */ struct net_device *tdev;/* Device to other host */
Signature · 1 line
2.2.1
PATCH 68/84 ipvs: Pass ipvs into __ip_vs_get_out_rt
In reply to Eric W. Biederman--- net/netfilter/ipvs/ip_vs_xmit.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
net/netfilter/ipvs/ip_vs_xmit.c +8 -7
@@ -257,11 +257,12 @@ static inline bool ensure_mtu_is_adequate(int skb_af, int rt_mode,/* Get route to destination or remote server */ static int -__ip_vs_get_out_rt (int skb_af,struct sk_buff *skb,struct ip_vs_dest *dest, +__ip_vs_get_out_rt (struct netns_ipvs *ipvs,int skb_af,struct sk_buff *skb, +struct ip_vs_dest *dest,__be32 daddr,int rt_mode,__be32 *ret_saddr,struct ip_vs_iphdr *ipvsh) { -struct net *net =dev_net (skb_dst (skb)->dev); +struct net *net = ipvs->net;struct ip_vs_dest_dst *dest_dst;struct rtable *rt;/* Route to the other host */ int mtu;
@@ -630,7 +631,7 @@ ip_vs_bypass_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,EnterFunction (10 );rcu_read_lock (); -if (__ip_vs_get_out_rt (cp->af, skb,NULL , iph->daddr, +if (__ip_vs_get_out_rt (cp->ipvs, cp->af, skb,NULL , iph->daddr,IP_VS_RT_MODE_NON_LOCAL ,NULL , ipvsh) <0 ) goto tx_error;
@@ -709,7 +710,7 @@ ip_vs_nat_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, } was_input =rt_is_input_route (skb_rtable (skb)); - local =__ip_vs_get_out_rt (cp->af, skb, cp->dest, cp->daddr.ip, + local =__ip_vs_get_out_rt (cp->ipvs, cp->af, skb, cp->dest, cp->daddr.ip,IP_VS_RT_MODE_LOCAL |IP_VS_RT_MODE_NON_LOCAL |IP_VS_RT_MODE_RDR ,NULL , ipvsh);
@@ -988,7 +989,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,EnterFunction (10 );rcu_read_lock (); - local = __ip_vs_get_out_rt(cp->af, skb, cp->dest, cp->daddr.ip, + local = __ip_vs_get_out_rt(ipvs, cp->af, skb, cp->dest, cp->daddr.ip, IP_VS_RT_MODE_LOCAL | IP_VS_RT_MODE_NON_LOCAL | IP_VS_RT_MODE_CONNECT |
@@ -1169,7 +1170,7 @@ ip_vs_dr_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,EnterFunction (10 );rcu_read_lock (); - local =__ip_vs_get_out_rt (cp->af, skb, cp->dest, cp->daddr.ip, + local =__ip_vs_get_out_rt (cp->ipvs, cp->af, skb, cp->dest, cp->daddr.ip,IP_VS_RT_MODE_LOCAL |IP_VS_RT_MODE_NON_LOCAL |IP_VS_RT_MODE_KNOWN_NH ,NULL , ipvsh);
@@ -1277,7 +1278,7 @@ ip_vs_icmp_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,IP_VS_RT_MODE_LOCAL |IP_VS_RT_MODE_NON_LOCAL | IP_VS_RT_MODE_RDR : IP_VS_RT_MODE_NON_LOCAL;rcu_read_lock (); - local =__ip_vs_get_out_rt (cp->af, skb, cp->dest, cp->daddr.ip, rt_mode, + local =__ip_vs_get_out_rt (cp->ipvs, cp->af, skb, cp->dest, cp->daddr.ip, rt_mode,NULL , iph);if (local <0 ) goto tx_error;
Signature · 1 line
2.2.1
PATCH 69/84 ipvs: Pass ipvs into __ip_vs_get_out_rt_v6
In reply to Eric W. Biederman--- net/netfilter/ipvs/ip_vs_xmit.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-)
net/netfilter/ipvs/ip_vs_xmit.c +13 -8
@@ -404,11 +404,12 @@ out_err:* Get route to destination or remote server */ static int -__ip_vs_get_out_rt_v6 (int skb_af,struct sk_buff *skb,struct ip_vs_dest *dest, +__ip_vs_get_out_rt_v6 (struct netns_ipvs *ipvs,int skb_af,struct sk_buff *skb, +struct ip_vs_dest *dest,struct in6_addr *daddr,struct in6_addr *ret_saddr,struct ip_vs_iphdr *ipvsh,int do_xfrm,int rt_mode) { -struct net *net =dev_net (skb_dst (skb)->dev); +struct net *net = ipvs->net;struct ip_vs_dest_dst *dest_dst;struct rt6_info *rt;/* Route to the other host */ struct dst_entry *dst;
@@ -663,7 +664,8 @@ ip_vs_bypass_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,EnterFunction (10 );rcu_read_lock (); -if (__ip_vs_get_out_rt_v6 (cp->af, skb,NULL , &iph->daddr,NULL , +if (__ip_vs_get_out_rt_v6 (cp->ipvs, cp->af, skb,NULL , + &iph->daddr,NULL , ipvsh,0 ,IP_VS_RT_MODE_NON_LOCAL ) <0 ) goto tx_error;
@@ -799,7 +801,8 @@ ip_vs_nat_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,IP_VS_DBG (10 ,"filled cport=%d\n" ,ntohs (*p)); } - local = __ip_vs_get_out_rt_v6(cp->af, skb, cp->dest, &cp->daddr.in6, + local = __ip_vs_get_out_rt_v6(cp->ipvs, cp->af, skb, cp->dest, + &cp->daddr.in6, NULL, ipvsh, 0, IP_VS_RT_MODE_LOCAL | IP_VS_RT_MODE_NON_LOCAL |
@@ -1083,7 +1086,8 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,EnterFunction (10 );rcu_read_lock (); - local = __ip_vs_get_out_rt_v6(cp->af, skb, cp->dest, &cp->daddr.in6, + local = __ip_vs_get_out_rt_v6(cp->ipvs, cp->af, skb, cp->dest, + &cp->daddr.in6, &saddr, ipvsh, 1, IP_VS_RT_MODE_LOCAL | IP_VS_RT_MODE_NON_LOCAL |
@@ -1209,7 +1213,8 @@ ip_vs_dr_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,EnterFunction (10 );rcu_read_lock (); - local = __ip_vs_get_out_rt_v6(cp->af, skb, cp->dest, &cp->daddr.in6, + local = __ip_vs_get_out_rt_v6(cp->ipvs, cp->af, skb, cp->dest, + &cp->daddr.in6, NULL, ipvsh, 0, IP_VS_RT_MODE_LOCAL | IP_VS_RT_MODE_NON_LOCAL |
@@ -1370,8 +1375,8 @@ ip_vs_icmp_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,IP_VS_RT_MODE_LOCAL |IP_VS_RT_MODE_NON_LOCAL | IP_VS_RT_MODE_RDR : IP_VS_RT_MODE_NON_LOCAL;rcu_read_lock (); - local =__ip_vs_get_out_rt_v6 (cp->af, skb, cp->dest, &cp->daddr.in6, -NULL , ipvsh,0 , rt_mode); + local =__ip_vs_get_out_rt_v6 (cp->ipvs, cp->af, skb, cp->dest, + &cp->daddr.in6,NULL , ipvsh,0 , rt_mode);if (local <0 ) goto tx_error; rt = (struct rt6_info *)skb_dst (skb);
Signature · 1 line
2.2.1
PATCH 70/84 ipvs: Pass ipvs into ensure_mtu_is adequate
In reply to Eric W. BiedermanThis allows two different ways for computing/guessing net to be removed from ensure_mtu_is_adequate.
--- net/netfilter/ipvs/ip_vs_xmit.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
net/netfilter/ipvs/ip_vs_xmit.c +5 -6
@@ -212,13 +212,14 @@ static inline void maybe_update_pmtu(int skb_af, struct sk_buff *skb, int mtu) ort->dst.ops->update_pmtu (&ort->dst, sk,NULL , mtu); } -static inline bool ensure_mtu_is_adequate (int skb_af,int rt_mode, +static inline bool ensure_mtu_is_adequate (struct netns_ipvs *ipvs,int skb_af, +int rt_mode,struct ip_vs_iphdr *ipvsh,struct sk_buff *skb,int mtu) {#ifdef CONFIG_IP_VS_IPV6 if (skb_af ==AF_INET6 ) { -struct net *net =dev_net (skb_dst (skb)->dev); +struct net *net = ipvs->net;if (unlikely (__mtu_check_toobig_v6 (skb, mtu))) {if (!skb->dev)
@@ -233,8 +234,6 @@ static inline bool ensure_mtu_is_adequate(int skb_af, int rt_mode, } else#endif { -struct netns_ipvs *ipvs =net_ipvs (skb_net (skb)); -/* If we're going to tunnel the packet and pmtu discovery * is disabled, we'll just fragment it anyway */
@@ -338,7 +337,7 @@ __ip_vs_get_out_rt(struct netns_ipvs *ipvs, int skb_af, struct sk_buff *skb,maybe_update_pmtu (skb_af, skb, mtu); } -if (!ensure_mtu_is_adequate (skb_af, rt_mode, ipvsh, skb, mtu)) +if (!ensure_mtu_is_adequate (ipvs, skb_af, rt_mode, ipvsh, skb, mtu)) goto err_put;skb_dst_drop (skb);
@@ -487,7 +486,7 @@ __ip_vs_get_out_rt_v6(struct netns_ipvs *ipvs, int skb_af, struct sk_buff *skb,maybe_update_pmtu (skb_af, skb, mtu); } -if (!ensure_mtu_is_adequate (skb_af, rt_mode, ipvsh, skb, mtu)) +if (!ensure_mtu_is_adequate (ipvs, skb_af, rt_mode, ipvsh, skb, mtu)) goto err_put;skb_dst_drop (skb);
Signature · 1 line
2.2.1
PATCH 71/84 ipvs: Better derivation of ipvs in ip_vs_in_stats and ip_vs_out_stats
In reply to Eric W. Biederman--- net/netfilter/ipvs/ip_vs_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/netfilter/ipvs/ip_vs_core.c +2 -2
@@ -112,7 +112,7 @@ static inline void ip_vs_in_stats(struct ip_vs_conn *cp, struct sk_buff *skb) { struct ip_vs_dest *dest = cp->dest; -struct netns_ipvs *ipvs =net_ipvs (skb_net (skb)); +struct netns_ipvs *ipvs = cp->ipvs;if (dest && (dest->flags &IP_VS_DEST_F_AVAILABLE )) {struct ip_vs_cpu_stats *s;
@@ -146,7 +146,7 @@ static inline void ip_vs_out_stats(struct ip_vs_conn *cp, struct sk_buff *skb) { struct ip_vs_dest *dest = cp->dest; -struct netns_ipvs *ipvs =net_ipvs (skb_net (skb)); +struct netns_ipvs *ipvs = cp->ipvs;if (dest && (dest->flags &IP_VS_DEST_F_AVAILABLE )) {struct ip_vs_cpu_stats *s;
Signature · 1 line
2.2.1
PATCH 72/84 ipvs: Wrap sysctl_cache_bypass and remove ifdefs in ip_vs_leave
In reply to Eric W. BiedermanWith sysctl_cache_bypass now a compile time constant the compiler can figue out that it can elimiate all of the code that depends on sysctl_cache_bypass being true.
Also remove the duplicate computation of net previously necessitated by #ifdef CONFIG_SYSCTL
--- include/net/ip_vs.h | 10 ++++++++++ net/netfilter/ipvs/ip_vs_core.c | 13 +++---------- 2 files changed, 13 insertions(+), 10 deletions(-)
include/net/ip_vs.h +10 -0
@@ -1101,6 +1101,11 @@ static inline int sysctl_ignore_tunneled(struct netns_ipvs *ipvs) return ipvs->sysctl_ignore_tunneled; } +static inline int sysctl_cache_bypass (struct netns_ipvs *ipvs) +{ +return ipvs->sysctl_cache_bypass; +} +#else static inline int sysctl_sync_threshold (struct netns_ipvs *ipvs)
@@ -1183,6 +1188,11 @@ static inline int sysctl_ignore_tunneled(struct netns_ipvs *ipvs) return 0; } +static inline int sysctl_cache_bypass (struct netns_ipvs *ipvs) +{ +return 0 ; +} +#endif /* IPVS core functions
net/netfilter/ipvs/ip_vs_core.c +3 -10
@@ -568,17 +568,14 @@ int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb, struct ip_vs_proto_data *pd, struct ip_vs_iphdr *iph) { __be16 _ports[2], *pptr, dport; -#ifdef CONFIG_SYSCTL struct net *net;struct netns_ipvs *ipvs; -#endif pptr =frag_safe_skb_hp (skb, iph->len,sizeof (_ports), _ports, iph);if (!pptr)return NF_DROP ; dport =likely (!ip_vs_iph_inverse (iph)) ? pptr[1 ] : pptr[0 ]; -#ifdef CONFIG_SYSCTL net =skb_net (skb);
@@ -586,7 +583,7 @@ int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb,and the destination is a non-local unicast, then create a cache_bypass connection entry */ ipvs =net_ipvs (net); -if (ipvs->sysctl_cache_bypass && svc->fwmark && +if (sysctl_cache_bypass (ipvs) && svc->fwmark && !(iph->hdr_flags & (IP_VS_HDR_INVERSE |IP_VS_HDR_ICMP )) &&ip_vs_addr_is_unicast (net, svc->af, &iph->daddr)) {int ret;
@@ -624,7 +621,6 @@ int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb,ip_vs_conn_put (cp);return ret; } -#endif /* * When the virtual ftp service is presented, packets destined
@@ -647,11 +643,8 @@ int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb,*/ #ifdef CONFIG_IP_VS_IPV6 if (svc->af ==AF_INET6 ) { -if (!skb->dev) { -struct net *net_ =dev_net (skb_dst (skb)->dev); - - skb->dev = net_->loopback_dev; - } +if (!skb->dev) + skb->dev = net->loopback_dev;icmpv6_send (skb,ICMPV6_DEST_UNREACH ,ICMPV6_PORT_UNREACH ,0 ); } else#endif
Signature · 1 line
2.2.1
PATCH 73/84 ipvs: Simplify ipvs and net access in ip_vs_leave
In reply to Eric W. BiedermanStop using the hack skb_net(skb) to compute the network namespace.
--- net/netfilter/ipvs/ip_vs_core.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
net/netfilter/ipvs/ip_vs_core.c +2 -6
@@ -568,21 +568,17 @@ int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb, struct ip_vs_proto_data *pd, struct ip_vs_iphdr *iph) { __be16 _ports[2], *pptr, dport; -struct net *net; -struct netns_ipvs *ipvs; +struct netns_ipvs *ipvs = svc->ipvs; +struct net *net = ipvs->net; pptr =frag_safe_skb_hp (skb, iph->len,sizeof (_ports), _ports, iph);if (!pptr)return NF_DROP ; dport =likely (!ip_vs_iph_inverse (iph)) ? pptr[1 ] : pptr[0 ]; - net =skb_net (skb); - -/* if it is fwmark-based service, the cache_bypass sysctl is up and the destination is a non-local unicast, then create a cache_bypass connection entry */ - ipvs =net_ipvs (net);if (sysctl_cache_bypass (ipvs) && svc->fwmark && !(iph->hdr_flags & (IP_VS_HDR_INVERSE |IP_VS_HDR_ICMP )) &&ip_vs_addr_is_unicast (net, svc->af, &iph->daddr)) {
Signature · 1 line
2.2.1
PATCH 74/84 ipvs: Pass ipvs not net into sysctl_nat_icmp_send
In reply to Eric W. Biederman--- net/netfilter/ipvs/ip_vs_core.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
net/netfilter/ipvs/ip_vs_core.c +3 -4
@@ -657,9 +657,8 @@ static int sysctl_snat_reroute(struct sk_buff *skb)return ipvs->sysctl_snat_reroute; } -static int sysctl_nat_icmp_send (struct net *net) +static int sysctl_nat_icmp_send (struct netns_ipvs *ipvs) { -struct netns_ipvs *ipvs =net_ipvs (net);return ipvs->sysctl_nat_icmp_send; }
@@ -671,7 +670,7 @@ static int sysctl_expire_nodest_conn(struct netns_ipvs *ipvs)#else static int sysctl_snat_reroute (struct sk_buff *skb) {return 0 ; } -static int sysctl_nat_icmp_send (struct net *net) {return 0 ; } +static int sysctl_nat_icmp_send (struct netns_ipvs *ipvs) {return 0 ; }static int sysctl_expire_nodest_conn (struct netns_ipvs *ipvs) {return 0 ; }#endif
@@ -1252,7 +1251,7 @@ ip_vs_out(unsigned int hooknum, struct sk_buff *skb, int af)if (likely (cp))return handle_response (af, skb, pd, cp, &iph, hooknum); -if (sysctl_nat_icmp_send (net) && +if (sysctl_nat_icmp_send (ipvs) && (pp->protocol ==IPPROTO_TCP || pp->protocol ==IPPROTO_UDP || pp->protocol ==IPPROTO_SCTP )) {
Signature · 1 line
2.2.1
PATCH 75/84 ipvs: Pass ipvs into ip_vs_out
In reply to Eric W. BiedermanDerive ipvs from state->net in the callers of ip_vs_out and pass it into ip_vs_out. Removing the need to use the hack skb_net.
--- net/netfilter/ipvs/ip_vs_core.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-)
net/netfilter/ipvs/ip_vs_core.c +6 -9
@@ -1173,10 +1173,9 @@ drop:* Check if outgoing packet belongs to the established ip_vs_conn. */ static unsigned int -ip_vs_out (unsigned int hooknum,struct sk_buff *skb,int af) +ip_vs_out (struct netns_ipvs *ipvs,unsigned int hooknum,struct sk_buff *skb,int af) { -struct net *net =NULL ; -struct netns_ipvs *ipvs; +struct net *net = ipvs->net;struct ip_vs_iphdr iph;struct ip_vs_protocol *pp;struct ip_vs_proto_data *pd;
@@ -1201,8 +1200,6 @@ ip_vs_out(unsigned int hooknum, struct sk_buff *skb, int af)if (unlikely (!skb_dst (skb)))return NF_ACCEPT ; - net =skb_net (skb); - ipvs =net_ipvs (net);if (!ipvs->enable)return NF_ACCEPT ;
@@ -1306,7 +1303,7 @@ static unsigned int ip_vs_reply4(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) { -return ip_vs_out (state->hook, skb,AF_INET ); +return ip_vs_out (net_ipvs (state->net), state->hook, skb,AF_INET ); }/*
@@ -1317,7 +1314,7 @@ static unsigned int ip_vs_local_reply4(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) { -return ip_vs_out (state->hook, skb,AF_INET ); +return ip_vs_out (net_ipvs (state->net), state->hook, skb,AF_INET ); }#ifdef CONFIG_IP_VS_IPV6
@@ -1331,7 +1328,7 @@ static unsigned int ip_vs_reply6(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) { -return ip_vs_out (state->hook, skb,AF_INET6 ); +return ip_vs_out (net_ipvs (state->net), state->hook, skb,AF_INET6 ); }/*
@@ -1342,7 +1339,7 @@ static unsigned int ip_vs_local_reply6(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) { -return ip_vs_out (state->hook, skb,AF_INET6 ); +return ip_vs_out (net_ipvs (state->net), state->hook, skb,AF_INET6 ); }#endif
Signature · 1 line
2.2.1
PATCH 76/84 ipvs: Pass ipvs into ip_vs_in
In reply to Eric W. BiedermanDerive ipvs from state->net in the callers of ip_vs_in and pass it into ip_vs_out. Removing the need to use the hack skb_net.
--- net/netfilter/ipvs/ip_vs_core.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-)
net/netfilter/ipvs/ip_vs_core.c +5 -9
@@ -1684,15 +1684,13 @@ out:* and send it on its way... */ static unsigned int -ip_vs_in (unsigned int hooknum,struct sk_buff *skb,int af) +ip_vs_in (struct netns_ipvs *ipvs,unsigned int hooknum,struct sk_buff *skb,int af) { -struct net *net;struct ip_vs_iphdr iph;struct ip_vs_protocol *pp;struct ip_vs_proto_data *pd;struct ip_vs_conn *cp;int ret, pkts; -struct netns_ipvs *ipvs;int conn_reuse_mode;/* Already marked as IPVS request or reply? */
@@ -1715,8 +1713,6 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af)return NF_ACCEPT ; }/* ipvs enabled in this netns ? */ - net =skb_net (skb); - ipvs =net_ipvs (net);if (unlikely (sysctl_backup_only (ipvs) || !ipvs->enable))return NF_ACCEPT ;
@@ -1844,7 +1840,7 @@ static unsigned int ip_vs_remote_request4(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) { -return ip_vs_in (state->hook, skb,AF_INET ); +return ip_vs_in (net_ipvs (state->net), state->hook, skb,AF_INET ); }/*
@@ -1855,7 +1851,7 @@ static unsigned int ip_vs_local_request4(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) { -return ip_vs_in (state->hook, skb,AF_INET ); +return ip_vs_in (net_ipvs (state->net), state->hook, skb,AF_INET ); }#ifdef CONFIG_IP_VS_IPV6
@@ -1868,7 +1864,7 @@ static unsigned int ip_vs_remote_request6(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) { -return ip_vs_in (state->hook, skb,AF_INET6 ); +return ip_vs_in (net_ipvs (state->net), state->hook, skb,AF_INET6 ); }/*
@@ -1879,7 +1875,7 @@ static unsigned int ip_vs_local_request6(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) { -return ip_vs_in (state->hook, skb,AF_INET6 ); +return ip_vs_in (net_ipvs (state->net), state->hook, skb,AF_INET6 ); }#endif
Signature · 1 line
2.2.1
PATCH 77/84 ipvs: Pass ipvs into ip_vs_in_icmp and ip_vs_in_icmp_v6
In reply to Eric W. BiedermanWith ipvs passed into ip_vs_in_icmp and ip_vs_in_icmp_v6 they no longer need to call the hack that is skb_net.
Additionally ipvs_in_icmp no longer needs to call dev_net(skb->dev) and can use the ipvs->net instead.
--- net/netfilter/ipvs/ip_vs_core.c | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-)
net/netfilter/ipvs/ip_vs_core.c +14 -22
@@ -1388,10 +1388,9 @@ ip_vs_try_to_schedule(struct netns_ipvs *ipvs, int af, struct sk_buff *skb,* Currently handles error types - unreachable, quench, ttl exceeded. */ static int -ip_vs_in_icmp (struct sk_buff *skb,int *related,unsigned int hooknum) +ip_vs_in_icmp (struct netns_ipvs *ipvs,struct sk_buff *skb,int *related, +unsigned int hooknum) { -struct net *net =NULL ; -struct netns_ipvs *ipvs;struct iphdr *iph;struct icmphdr _icmph, *ic;struct iphdr _ciph, *cih;/* The ip header contained within the ICMP */
@@ -1440,9 +1439,6 @@ ip_vs_in_icmp(struct sk_buff *skb, int *related, unsigned int hooknum)if (cih ==NULL )return NF_ACCEPT ;/* The packet looks wrong, ignore */ - net =skb_net (skb); - ipvs =net_ipvs (net); -/* Special case for errors for IPIP packets */ ipip = false;if (cih->protocol ==IPPROTO_IPIP ) {
@@ -1520,7 +1516,7 @@ ip_vs_in_icmp(struct sk_buff *skb, int *related, unsigned int hooknum)skb_reset_network_header (skb);IP_VS_DBG (12 ,"ICMP for IPIP %pI4->%pI4: mtu=%u\n" , &ip_hdr (skb)->saddr, &ip_hdr (skb)->daddr, mtu); -ipv4_update_pmtu (skb,dev_net (skb->dev), +ipv4_update_pmtu (skb, ipvs->net, mtu,0 ,0 ,0 ,0 );/* Client uses PMTUD? */ if (!(frag_off &htons (IP_DF )))
@@ -1575,11 +1571,10 @@ out: }#ifdef CONFIG_IP_VS_IPV6 -static int ip_vs_in_icmp_v6 (struct sk_buff *skb,int *related, -unsigned int hooknum,struct ip_vs_iphdr *iph) +static int ip_vs_in_icmp_v6 (struct netns_ipvs *ipvs,struct sk_buff *skb, +int *related,unsigned int hooknum, +struct ip_vs_iphdr *iph) { -struct net *net =NULL ; -struct netns_ipvs *ipvs;struct icmp6hdr _icmph, *ic;struct ip_vs_iphdr ciph = {.flags =0 , .fragoffs =0 };/*Contained IP */ struct ip_vs_conn *cp;
@@ -1619,8 +1614,6 @@ static int ip_vs_in_icmp_v6(struct sk_buff *skb, int *related,if (!ip_vs_fill_iph_skb_icmp (AF_INET6 , skb, offset, true, &ciph))return NF_ACCEPT ; - net =skb_net (skb); - ipvs =net_ipvs (net); pd =ip_vs_proto_data_get (ipvs, ciph.protocol);if (!pd)return NF_ACCEPT ;
@@ -1732,8 +1725,8 @@ ip_vs_in(struct netns_ipvs *ipvs, unsigned int hooknum, struct sk_buff *skb, intif (af ==AF_INET6 ) {if (unlikely (iph.protocol ==IPPROTO_ICMPV6 )) {int related; -int verdict =ip_vs_in_icmp_v6 (skb, &related, hooknum, - &iph); +int verdict =ip_vs_in_icmp_v6 (ipvs, skb, &related, + hooknum, &iph);if (related)return verdict;
@@ -1742,7 +1735,8 @@ ip_vs_in(struct netns_ipvs *ipvs, unsigned int hooknum, struct sk_buff *skb, int#endif if (unlikely (iph.protocol ==IPPROTO_ICMP )) {int related; -int verdict =ip_vs_in_icmp (skb, &related, hooknum); +int verdict =ip_vs_in_icmp (ipvs, skb, &related, + hooknum);if (related)return verdict;
@@ -1895,17 +1889,16 @@ ip_vs_forward_icmp(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {int r; -struct netns_ipvs *ipvs; +struct netns_ipvs *ipvs =net_ipvs (state->net);if (ip_hdr (skb)->protocol !=IPPROTO_ICMP )return NF_ACCEPT ;/* ipvs enabled in this netns ? */ - ipvs =net_ipvs (state->net);if (unlikely (sysctl_backup_only (ipvs) || !ipvs->enable))return NF_ACCEPT ; -return ip_vs_in_icmp (skb, &r, state->hook); +return ip_vs_in_icmp (ipvs, skb, &r, state->hook); }#ifdef CONFIG_IP_VS_IPV6
@@ -1914,7 +1907,7 @@ ip_vs_forward_icmp_v6(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {int r; -struct netns_ipvs *ipvs; +struct netns_ipvs *ipvs =net_ipvs (state->net);struct ip_vs_iphdr iphdr;ip_vs_fill_iph_skb (AF_INET6 , skb, false, &iphdr);
@@ -1922,11 +1915,10 @@ ip_vs_forward_icmp_v6(void *priv, struct sk_buff *skb,return NF_ACCEPT ;/* ipvs enabled in this netns ? */ - ipvs =net_ipvs (state->net);if (unlikely (sysctl_backup_only (ipvs) || !ipvs->enable))return NF_ACCEPT ; - return ip_vs_in_icmp_v6(skb, &r, state->hook, &iphdr); + return ip_vs_in_icmp_v6(ipvs, skb, &r, state->hook, &iphdr); }#endif
Signature · 1 line
2.2.1
PATCH 78/84 ipvs: Pass ipvs into ip_vs_out_icmp and ip_vs_out_icmp_v6
In reply to Eric W. BiedermanThis removes the need to compute ipvs with the hack "net_ipvs(skb_net(skb))"
--- net/netfilter/ipvs/ip_vs_core.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
net/netfilter/ipvs/ip_vs_core.c +7 -8
@@ -897,10 +897,9 @@ out:* Find any that might be relevant, check against existing connections. * Currently handles error types - unreachable, quench, ttl exceeded. */ -static int ip_vs_out_icmp (struct sk_buff *skb,int *related, -unsigned int hooknum) +static int ip_vs_out_icmp (struct netns_ipvs *ipvs,struct sk_buff *skb, +int *related,unsigned int hooknum) { -struct netns_ipvs *ipvs =net_ipvs (skb_net (skb));struct iphdr *iph;struct icmphdr _icmph, *ic;struct iphdr _ciph, *cih;/* The ip header contained within the ICMP */
@@ -973,10 +972,10 @@ static int ip_vs_out_icmp(struct sk_buff *skb, int *related, }#ifdef CONFIG_IP_VS_IPV6 -static int ip_vs_out_icmp_v6 (struct sk_buff *skb,int *related, -unsigned int hooknum,struct ip_vs_iphdr *ipvsh) +static int ip_vs_out_icmp_v6 (struct netns_ipvs *ipvs,struct sk_buff *skb, +int *related,unsigned int hooknum, +struct ip_vs_iphdr *ipvsh) { -struct netns_ipvs *ipvs =net_ipvs (skb_net (skb));struct icmp6hdr _icmph, *ic;struct ip_vs_iphdr ciph = {.flags =0 , .fragoffs =0 };/*Contained IP */ struct ip_vs_conn *cp;
@@ -1208,7 +1207,7 @@ ip_vs_out(struct netns_ipvs *ipvs, unsigned int hooknum, struct sk_buff *skb, inif (af ==AF_INET6 ) {if (unlikely (iph.protocol ==IPPROTO_ICMPV6 )) {int related; -int verdict =ip_vs_out_icmp_v6 (skb, &related, +int verdict =ip_vs_out_icmp_v6 (ipvs, skb, &related, hooknum, &iph);if (related)
@@ -1218,7 +1217,7 @@ ip_vs_out(struct netns_ipvs *ipvs, unsigned int hooknum, struct sk_buff *skb, in#endif if (unlikely (iph.protocol ==IPPROTO_ICMP )) {int related; -int verdict =ip_vs_out_icmp (skb, &related, hooknum); +int verdict =ip_vs_out_icmp (ipvs, skb, &related, hooknum);if (related)return verdict;
Signature · 1 line
2.2.1
PATCH 79/84 ipvs: Pass ipvs through ip_vs_route_me_harder into sysctl_snat_reroute
In reply to Eric W. BiedermanThis removes the need to use the hack skb_net.
--- net/netfilter/ipvs/ip_vs_core.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
net/netfilter/ipvs/ip_vs_core.c +7 -8
@@ -651,9 +651,8 @@ int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb,#ifdef CONFIG_SYSCTL -static int sysctl_snat_reroute (struct sk_buff *skb) +static int sysctl_snat_reroute (struct netns_ipvs *ipvs) { -struct netns_ipvs *ipvs =net_ipvs (skb_net (skb));return ipvs->sysctl_snat_reroute; }
@@ -669,7 +668,7 @@ static int sysctl_expire_nodest_conn(struct netns_ipvs *ipvs)#else -static int sysctl_snat_reroute (struct sk_buff *skb) {return 0 ; } +static int sysctl_snat_reroute (struct netns_ipvs *ipvs) {return 0 ; }static int sysctl_nat_icmp_send (struct netns_ipvs *ipvs) {return 0 ; }static int sysctl_expire_nodest_conn (struct netns_ipvs *ipvs) {return 0 ; }
@@ -702,10 +701,10 @@ static inline int ip_vs_gather_frags(struct sk_buff *skb, u_int32_t user)return err; } -static int ip_vs_route_me_harder (int af,struct sk_buff *skb, -unsigned int hooknum) +static int ip_vs_route_me_harder (struct netns_ipvs *ipvs,int af, +struct sk_buff *skb,unsigned int hooknum) { -if (!sysctl_snat_reroute (skb)) +if (!sysctl_snat_reroute (ipvs))return 0 ;/* Reroute replies only to remote clients (FORWARD and LOCAL_OUT) */ if (NF_INET_LOCAL_IN == hooknum)
@@ -873,7 +872,7 @@ static int handle_response_icmp(int af, struct sk_buff *skb,#endif ip_vs_nat_icmp (skb, pp, cp,1 ); -if (ip_vs_route_me_harder (af, skb, hooknum)) +if (ip_vs_route_me_harder (cp->ipvs, af, skb, hooknum)) goto out;/* do the statistics and put it back */
@@ -1144,7 +1143,7 @@ handle_response(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,* if it came from this machine itself. So re-compute * the routing information. */ -if (ip_vs_route_me_harder (af, skb, hooknum)) +if (ip_vs_route_me_harder (cp->ipvs, af, skb, hooknum)) goto drop;IP_VS_DBG_PKT (10 , af, pp, skb, iph->off,"After SNAT" );
Signature · 1 line
2.2.1
PATCH 80/84 ipvs: Remove net argument from ip_vs_tcp_conn_listen
In reply to Eric W. BiedermanThe argument is unnecessary and in practice confusing, and has caused the callers to do all manner of silly things.
--- include/net/ip_vs.h | 2 +- net/netfilter/ipvs/ip_vs_ftp.c | 8 ++------ net/netfilter/ipvs/ip_vs_proto_tcp.c | 4 ++-- 3 files changed, 5 insertions(+), 9 deletions(-)
include/net/ip_vs.h +1 -1
@@ -1271,7 +1271,7 @@ void ip_vs_conn_expire_now(struct ip_vs_conn *cp);const char *ip_vs_state_name (__u16 proto,int state); -void ip_vs_tcp_conn_listen (struct net *net,struct ip_vs_conn *cp); +void ip_vs_tcp_conn_listen (struct ip_vs_conn *cp);int ip_vs_check_template (struct ip_vs_conn *ct);void ip_vs_random_dropentry (struct netns_ipvs *ipvs);int ip_vs_conn_init (void );
net/netfilter/ipvs/ip_vs_ftp.c +2 -6
@@ -181,7 +181,6 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp,int ret =0 ;enum ip_conntrack_info ctinfo;struct nf_conn *ct; -struct net *net; *diff =0 ;
@@ -289,9 +288,8 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp,* would be adjusted twice. */ - net =skb_net (skb); cp->app_data =NULL ; -ip_vs_tcp_conn_listen (net, n_cp); +ip_vs_tcp_conn_listen (n_cp);ip_vs_conn_put (n_cp);return ret; }
@@ -320,7 +318,6 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp,union nf_inet_addr to;__be16 port;struct ip_vs_conn *n_cp; -struct net *net;/* no diff required for incoming packets */ *diff =0 ;
@@ -413,8 +410,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp,/* * Move tunnel to listen state */ - net =skb_net (skb); -ip_vs_tcp_conn_listen (net, n_cp); +ip_vs_tcp_conn_listen (n_cp);ip_vs_conn_put (n_cp);return 1 ;
net/netfilter/ipvs/ip_vs_proto_tcp.c +2 -2
@@ -672,9 +672,9 @@ tcp_app_conn_bind(struct ip_vs_conn *cp)/* * Set LISTEN timeout. (ip_vs_conn_put will setup timer) */ -void ip_vs_tcp_conn_listen (struct net *net,struct ip_vs_conn *cp) +void ip_vs_tcp_conn_listen (struct ip_vs_conn *cp) { -struct ip_vs_proto_data *pd =ip_vs_proto_data_get (net_ipvs (net),IPPROTO_TCP ); +struct ip_vs_proto_data *pd =ip_vs_proto_data_get (cp->ipvs,IPPROTO_TCP );spin_lock_bh (&cp->lock); cp->state =IP_VS_TCP_S_LISTEN ;
Signature · 1 line
2.2.1
PATCH 81/84 ipvs: Pass ipvs not net to ip_vs_protocol_net_(init|cleanup)
In reply to Eric W. Biederman--- include/net/ip_vs.h | 4 ++-- net/netfilter/ipvs/ip_vs_core.c | 6 +++--- net/netfilter/ipvs/ip_vs_proto.c | 8 +++----- 3 files changed, 8 insertions(+), 10 deletions(-)
include/net/ip_vs.h +2 -2
@@ -1340,13 +1340,13 @@ ip_vs_control_add(struct ip_vs_conn *cp, struct ip_vs_conn *ctl_cp)/* IPVS netns init & cleanup functions */ int ip_vs_estimator_net_init (struct netns_ipvs *ipvs);int ip_vs_control_net_init (struct netns_ipvs *ipvs); -int ip_vs_protocol_net_init (struct net *net); +int ip_vs_protocol_net_init (struct netns_ipvs *ipvs);int ip_vs_app_net_init (struct netns_ipvs *ipvs);int ip_vs_conn_net_init (struct netns_ipvs *ipvs);int ip_vs_sync_net_init (struct netns_ipvs *ipvs);void ip_vs_conn_net_cleanup (struct netns_ipvs *ipvs);void ip_vs_app_net_cleanup (struct netns_ipvs *ipvs); -void ip_vs_protocol_net_cleanup (struct net *net); +void ip_vs_protocol_net_cleanup (struct netns_ipvs *ipvs);void ip_vs_control_net_cleanup (struct netns_ipvs *ipvs);void ip_vs_estimator_net_cleanup (struct netns_ipvs *ipvs);void ip_vs_sync_net_cleanup (struct netns_ipvs *ipvs);
net/netfilter/ipvs/ip_vs_core.c +3 -3
@@ -2052,7 +2052,7 @@ static int __net_init __ip_vs_init(struct net *net)if (ip_vs_control_net_init (ipvs) <0 ) goto control_fail; -if (ip_vs_protocol_net_init (net) <0 ) +if (ip_vs_protocol_net_init (ipvs) <0 ) goto protocol_fail;if (ip_vs_app_net_init (ipvs) <0 )
@@ -2076,7 +2076,7 @@ sync_fail: conn_fail:ip_vs_app_net_cleanup (ipvs); app_fail: -ip_vs_protocol_net_cleanup (net); +ip_vs_protocol_net_cleanup (ipvs); protocol_fail:ip_vs_control_net_cleanup (ipvs); control_fail:
@@ -2093,7 +2093,7 @@ static void __net_exit __ip_vs_cleanup(struct net *net)ip_vs_service_net_cleanup (ipvs);/* ip_vs_flush() with locks */ ip_vs_conn_net_cleanup (ipvs);ip_vs_app_net_cleanup (ipvs); -ip_vs_protocol_net_cleanup (net); +ip_vs_protocol_net_cleanup (ipvs);ip_vs_control_net_cleanup (ipvs);ip_vs_estimator_net_cleanup (ipvs);IP_VS_DBG (2 ,"ipvs netns %d released\n" , ipvs->gen);
net/netfilter/ipvs/ip_vs_proto.c +3 -5
@@ -307,7 +307,7 @@ ip_vs_tcpudp_debug_packet(int af, struct ip_vs_protocol *pp,/* * per network name-space init */ -int __net_init ip_vs_protocol_net_init (struct net *net) +int __net_init ip_vs_protocol_net_init (struct netns_ipvs *ipvs) {int i, ret;static struct ip_vs_protocol *protos[] = {
@@ -327,7 +327,6 @@ int __net_init ip_vs_protocol_net_init(struct net *net) &ip_vs_protocol_esp,#endif }; -struct netns_ipvs *ipvs =net_ipvs (net);for (i =0 ; i <ARRAY_SIZE (protos); i++) { ret =register_ip_vs_proto_netns (ipvs, protos[i]);
@@ -337,13 +336,12 @@ int __net_init ip_vs_protocol_net_init(struct net *net)return 0 ; cleanup: -ip_vs_protocol_net_cleanup (net); +ip_vs_protocol_net_cleanup (ipvs);return ret; } -void __net_exit ip_vs_protocol_net_cleanup(struct net *net) +void __net_exit ip_vs_protocol_net_cleanup(struct netns_ipvs *ipvs) { -struct netns_ipvs *ipvs =net_ipvs (net);struct ip_vs_proto_data *pd;int i;
Signature · 1 line
2.2.1
PATCH 82/84 ipvs: Remove skb_net
In reply to Eric W. BiedermanThis hack has no more users so remove it.
--- include/net/ip_vs.h | 31 ------------------------------- 1 file changed, 31 deletions(-)
include/net/ip_vs.h +0 -30
@@ -38,37 +38,6 @@ static inline struct netns_ipvs *net_ipvs(struct net* net)return net->ipvs; } -/* Get net ptr from skb in traffic cases -* use skb_sknet when call is from userland (ioctl or netlink) -*/ -static inline struct net *skb_net (const struct sk_buff *skb) -{ -#ifdef CONFIG_NET_NS -#ifdef CONFIG_IP_VS_DEBUG -/* -* This is used for debug only. -* Start with the most likely hit -* End with BUG -*/ -if (likely (skb->dev &&dev_net (skb->dev))) -return dev_net (skb->dev); -if (skb_dst (skb) &&skb_dst (skb)->dev) -return dev_net (skb_dst (skb)->dev); -WARN (skb->sk,"Maybe skb_sknet should be used in %s() at line:%d\n" , - __func__, __LINE__); -if (likely (skb->sk &&sock_net (skb->sk))) -return sock_net (skb->sk); -pr_err ("There is no net ptr to find in the skb in %s() line:%d\n" , - __func__, __LINE__); -BUG (); -#else -return dev_net (skb->dev ? :skb_dst (skb)->dev); -#endif -#else -return &init_net; -#endif -}
PATCH 83/84 ipvs: Remove skb_sknet
In reply to Eric W. BiedermanThis function adds no real value and it obscures what the code is doing.
--- include/net/ip_vs.h | 22 ---------------------- net/netfilter/ipvs/ip_vs_ctl.c | 25 ++++++++++--------------- 2 files changed, 10 insertions(+), 37 deletions(-)
include/net/ip_vs.h +0 -22
@@ -38,28 +38,6 @@ static inline struct netns_ipvs *net_ipvs(struct net* net)return net->ipvs; } -static inline struct net *skb_sknet (const struct sk_buff *skb) -{ -#ifdef CONFIG_NET_NS -#ifdef CONFIG_IP_VS_DEBUG -/* Start with the most likely hit */ -if (likely (skb->sk &&sock_net (skb->sk))) -return sock_net (skb->sk); -WARN (skb->dev,"Maybe skb_net should be used instead in %s() line:%d\n" , - __func__, __LINE__); -if (likely (skb->dev &&dev_net (skb->dev))) -return dev_net (skb->dev); -pr_err ("There is no net ptr to find in the skb in %s() line:%d\n" , - __func__, __LINE__); -BUG (); -#else -return sock_net (skb->sk); -#endif -#else -return &init_net; -#endif -} -/* This one needed for single_open_net since net is stored directly in * private not as a struct i.e. seq_file_net can't be used. */
net/netfilter/ipvs/ip_vs_ctl.c +10 -15
@@ -3002,7 +3002,8 @@ static int ip_vs_genl_dump_services(struct sk_buff *skb,int idx =0 , i;int start = cb->args[0 ];struct ip_vs_service *svc; -struct netns_ipvs *ipvs =net_ipvs (skb_sknet (skb)); +struct net *net =sock_net (skb->sk); +struct netns_ipvs *ipvs =net_ipvs (net);mutex_lock (&__ip_vs_mutex);for (i =0 ; i <IP_VS_SVC_TAB_SIZE ; i++) {
@@ -3201,7 +3202,7 @@ static int ip_vs_genl_dump_dests(struct sk_buff *skb,struct ip_vs_service *svc;struct ip_vs_dest *dest;struct nlattr *attrs[IPVS_CMD_ATTR_MAX +1 ]; -struct net *net =skb_sknet (skb); +struct net *net =sock_net (skb->sk);struct netns_ipvs *ipvs =net_ipvs (net);mutex_lock (&__ip_vs_mutex);
@@ -3348,7 +3349,7 @@ nla_put_failure:static int ip_vs_genl_dump_daemons (struct sk_buff *skb,struct netlink_callback *cb) { -struct net *net =skb_sknet (skb); +struct net *net =sock_net (skb->sk);struct netns_ipvs *ipvs =net_ipvs (net);mutex_lock (&ipvs->sync_mutex);
@@ -3475,11 +3476,9 @@ static int ip_vs_genl_set_config(struct netns_ipvs *ipvs, struct nlattr **attrs)static int ip_vs_genl_set_daemon (struct sk_buff *skb,struct genl_info *info) {int ret = -EINVAL , cmd; -struct net *net; -struct netns_ipvs *ipvs; +struct net *net =sock_net (skb->sk); +struct netns_ipvs *ipvs =net_ipvs (net); - net =skb_sknet (skb); - ipvs =net_ipvs (net); cmd = info->genlhdr->cmd;if (cmd ==IPVS_CMD_NEW_DAEMON || cmd ==IPVS_CMD_DEL_DAEMON ) {
@@ -3508,11 +3507,9 @@ static int ip_vs_genl_set_cmd(struct sk_buff *skb, struct genl_info *info)struct ip_vs_dest_user_kern udest;int ret =0 , cmd;int need_full_svc =0 , need_full_dest =0 ; -struct net *net; -struct netns_ipvs *ipvs; +struct net *net =sock_net (skb->sk); +struct netns_ipvs *ipvs =net_ipvs (net); - net =skb_sknet (skb); - ipvs =net_ipvs (net); cmd = info->genlhdr->cmd;mutex_lock (&__ip_vs_mutex);
@@ -3632,11 +3629,9 @@ static int ip_vs_genl_get_cmd(struct sk_buff *skb, struct genl_info *info)struct sk_buff *msg;void *reply;int ret, cmd, reply_cmd; -struct net *net; -struct netns_ipvs *ipvs; +struct net *net =sock_net (skb->sk); +struct netns_ipvs *ipvs =net_ipvs (net); - net =skb_sknet (skb); - ipvs =net_ipvs (net); cmd = info->genlhdr->cmd;if (cmd ==IPVS_CMD_GET_SERVICE )
Signature · 1 line
2.2.1
PATCH 84/84 ipvs: Pass ipvs into ip_vs_gather_frags
In reply to Eric W. BiedermanThis will be needed later when the network namespace guessing is removed from ip_defrag.
--- net/netfilter/ipvs/ip_vs_core.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
net/netfilter/ipvs/ip_vs_core.c +5 -4
@@ -688,7 +688,8 @@ static inline enum ip_defrag_users ip_vs_defrag_user(unsigned int hooknum)return IP_DEFRAG_VS_OUT ; } -static inline int ip_vs_gather_frags (struct sk_buff *skb,u_int32_t user) +static inline int ip_vs_gather_frags (struct netns_ipvs *ipvs, +struct sk_buff *skb,u_int32_t user) {int err;
@@ -912,7 +913,7 @@ static int ip_vs_out_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb,/* reassemble IP fragments */ if (ip_is_fragment (ip_hdr (skb))) { -if (ip_vs_gather_frags (skb,ip_vs_defrag_user (hooknum))) +if (ip_vs_gather_frags (ipvs, skb,ip_vs_defrag_user (hooknum)))return NF_STOLEN ; }
@@ -1232,7 +1233,7 @@ ip_vs_out(struct netns_ipvs *ipvs, unsigned int hooknum, struct sk_buff *skb, in if (af == AF_INET)#endif if (unlikely (ip_is_fragment (ip_hdr (skb)) && !pp->dont_defrag)) { -if (ip_vs_gather_frags (skb, +if (ip_vs_gather_frags (ipvs, skb,ip_vs_defrag_user (hooknum)))return NF_STOLEN ;
@@ -1403,7 +1404,7 @@ ip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related,/* reassemble IP fragments */ if (ip_is_fragment (ip_hdr (skb))) { -if (ip_vs_gather_frags (skb,ip_vs_defrag_user (hooknum))) +if (ip_vs_gather_frags (ipvs, skb,ip_vs_defrag_user (hooknum)))return NF_STOLEN ; }
Signature · 1 line
2.2.1
Re: [PATCH next 00/84] ipvs: Stop guessing the network namespace (take 2)
In reply to Eric W. BiedermanHello,
Quoted 45 lines · Eric W. Biederman
I am gradually working my way through the netfilter stack passing struct down into the netfilter hooks and from the netfilter hooks and from there down into the functions that actually care. This removes the need for netfilter functions to guess how to figure out how to compute which network namespace they are in and instead provides a simple and reliable method to do so.
The cleanups stand on their own but this is part of a larger effort to have routes with an output device that is not in the current network namespace.
The IPVS code has been a bit more of a challenge than most. Just passing struct net through to where it is needed did not feel clean to me. The practical issue is that the ipvs code in most places actually wants struct
netns_ipvsand not struct net.So as part of this process I have turned the relationship between struct net and the structs
netns_ipvs,ip_vs_conn_param,ip_vs_conn, andip_vs_serviceinside out. I have modified the ipvs functions to take a structnetns_ipvsnot a struct net. The net is code with fewer conversions from one type of structure to another. I did wind up adding a structnetns_ipvsparameter to quite a few functions that did not have it before so I could pass the structure down from the netfilter hooks to where it is actually needed to avoid guessing.I have broken up the work in a bunch of small patches so there is at least a chance and reviewing that each step I took is correct. The series compiles at each step so bisecting it should not be a problem if something weird comes up.
The first two changes in this series are actually bug fixes. The first is a compile fix for a bug in sctp that came in, in the last round of ipvs changes merged into nf-next. The second fixes an older bug where in pathological circumstances the wrong network namespace could be used when a proc file is written to.
The rest of the patchset is a bunch of boring changes getting pushing struct
netns_ipvs(and by extensionipvs->net) where it needs to be. Either by replacing struct net pointers or adding new structnetns_ipvspointers. With a handful of other minor cleanups (like removingskb_net).I have incorporated Julian Anastasov's feedback, which critically involves fixing a wrong piece of code.
Quoted 7 lines
The changes are also available against nf-next at:
git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/net-next.gitmasterMy entire pending set of changes for those who want to look ahead is at:
git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/net-next.gitfor-testingEric
v2 looks good to me,
Regards
--
Julian Anastasov <[email protected]>
Pablo Neira Ayuso
maintainerRe: [PATCH next 00/84] ipvs: Stop guessing the network namespace (take 2)
On Tue, Sep 22, 2015 at 10:22:13AM +0300, Julian Anastasov wrote:
[...]
Quoted 4 lines
v2 looks good to me,
Acked-by Julian Anastasov <[email protected]>
Thanks a lot for reviewing Julian.
Simon, please let me know how you want to handle this. Thanks.
Simon Horman
maintainerRe: [PATCH next 00/84] ipvs: Stop guessing the network namespace (take 2)
Quoted 10 lines · Pablo Neira Ayuso
On Tue, Sep 22, 2015 at 10:22:13AM +0300, Julian Anastasov wrote:
[...]Quoted 4 lines
v2 looks good to me,
Acked-by Julian Anastasov <[email protected]>Thanks a lot for reviewing Julian.
Simon, please let me know how you want to handle this. Thanks.
I will see about taking it through my tree (as usual).
Pablo Neira Ayuso
maintainerRe: [PATCH next 00/84] ipvs: Stop guessing the network namespace (take 2)
Quoted 6 lines · Simon Horman
Quoted 5 lines · Pablo Neira Ayuso
On Tue, Sep 22, 2015 at 10:22:13AM +0300, Julian Anastasov wrote:
[...]Quoted 3 lines
v2 looks good to me,
Quoted 7 lines
Quoted 5 lines
Quoted 1 line
Acked-by Julian Anastasov <[email protected]>Thanks a lot for reviewing Julian.
Simon, please let me know how you want to handle this. Thanks.
I will see about taking it through my tree (as usual).
Thanks Simon!
cover netfilter: Pass net into ip_route_me_harder
In reply to Eric W. BiedermanThis is the next installment of my work to pass struct net through the output path so the code does not need to guess how to figure out which network namespace it is in, and ultimately routes can have output devices in another network namespace.
This round the focus is our getting struct net passed in, instead of guess in the netfilter functions that reroute packets (ip_route_me_harder, and ip6_route_me_harder). There is a bit more work on the ipv4 side as the ipv6 code on several of these code paths already passes in the struct net.
The changes are also available against nf-next at:git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/net-next.git master
My entire pending set of changes for those who want to look ahead is at:git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/net-next.git for-testing
Eric
Eric W. Biederman (5):
ipv4: Push struct net down into nf_send_reset
netfilter: Push struct net down into nf_afinfo.reroute
netfilter: ipt_SYNPROXY: Pass snet into synproxy_send_tcp
ipv4: Pass struct net into ip_route_me_harder
ipv6: Pass struct net into ip6_route_me_harder
include/linux/netfilter.h | 2 +- include/linux/netfilter_ipv4.h | 2 +- include/linux/netfilter_ipv6.h | 2 +- include/net/netfilter/ipv4/nf_reject.h | 2 +- net/ipv4/netfilter.c | 7 +++---- net/ipv4/netfilter/ipt_REJECT.c | 2 +- net/ipv4/netfilter/ipt_SYNPROXY.c | 20 ++++++++++++-------- net/ipv4/netfilter/iptable_mangle.c | 2 +- net/ipv4/netfilter/nf_nat_l3proto_ipv4.c | 2 +- net/ipv4/netfilter/nf_reject_ipv4.c | 4 ++-- net/ipv4/netfilter/nft_chain_route_ipv4.c | 2 +- net/ipv4/netfilter/nft_reject_ipv4.c | 2 +- net/ipv6/netfilter.c | 7 +++---- net/ipv6/netfilter/ip6table_mangle.c | 2 +- net/ipv6/netfilter/nf_nat_l3proto_ipv6.c | 2 +- net/ipv6/netfilter/nft_chain_route_ipv6.c | 2 +- net/netfilter/ipvs/ip_vs_core.c | 4 ++-- net/netfilter/nf_queue.c | 2 +- net/netfilter/nft_reject_inet.c | 2 +- 19 files changed, 36 insertions(+), 34 deletions(-)
PATCH 1/5 ipv4: Push struct net down into nf_send_reset
This is needed so struct net can be pushed down into ip_route_me_harder.
--- include/net/netfilter/ipv4/nf_reject.h | 2 +- net/ipv4/netfilter/ipt_REJECT.c | 2 +- net/ipv4/netfilter/nf_reject_ipv4.c | 2 +- net/ipv4/netfilter/nft_reject_ipv4.c | 2 +- net/netfilter/nft_reject_inet.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-)
include/net/netfilter/ipv4/nf_reject.h +1 -1
@@ -6,7 +6,7 @@#include <net/icmp.h> void nf_send_unreach (struct sk_buff *skb_in,int code,int hook); -void nf_send_reset (struct sk_buff *oldskb,int hook); +void nf_send_reset (struct net *net,struct sk_buff *oldskb,int hook);const struct tcphdr *nf_reject_ip_tcphdr_get (struct sk_buff *oldskb,struct tcphdr *_oth,int hook);
net/ipv4/netfilter/ipt_REJECT.c +1 -1
@@ -59,7 +59,7 @@ reject_tg(struct sk_buff *skb, const struct xt_action_param *par)nf_send_unreach (skb,ICMP_PKT_FILTERED , hook);break ;case IPT_TCP_RESET : -nf_send_reset (skb, hook); +nf_send_reset (par->net, skb, hook);case IPT_ICMP_ECHOREPLY :/* Doesn't happen. */ break ;
net/ipv4/netfilter/nf_reject_ipv4.c +1 -1
@@ -99,7 +99,7 @@ void nf_reject_ip_tcphdr_put(struct sk_buff *nskb, const struct sk_buff *oldskb,EXPORT_SYMBOL_GPL (nf_reject_ip_tcphdr_put);/* Send RST reply */ -void nf_send_reset (struct sk_buff *oldskb,int hook) +void nf_send_reset (struct net *net,struct sk_buff *oldskb,int hook) {struct sk_buff *nskb;const struct iphdr *oiph;
net/ipv4/netfilter/nft_reject_ipv4.c +1 -1
@@ -30,7 +30,7 @@ static void nft_reject_ipv4_eval(const struct nft_expr *expr,nf_send_unreach (pkt->skb, priv->icmp_code, pkt->hook);break ;case NFT_REJECT_TCP_RST : -nf_send_reset (pkt->skb, pkt->hook); +nf_send_reset (pkt->net, pkt->skb, pkt->hook);break ;default :break ;
net/netfilter/nft_reject_inet.c +1 -1
@@ -31,7 +31,7 @@ static void nft_reject_inet_eval(const struct nft_expr *expr, pkt->hook);break ;case NFT_REJECT_TCP_RST : -nf_send_reset (pkt->skb, pkt->hook); +nf_send_reset (pkt->net, pkt->skb, pkt->hook);break ;case NFT_REJECT_ICMPX_UNREACH : nf_send_unreach(pkt->skb,
Signature · 1 line
2.2.1
PATCH 2/5 netfilter: Push struct net down into nf_afinfo.reroute
In reply to Eric W. BiedermanThe network namespace is needed when routing a packet. Stop making nf_afinfo.reroute guess which network namespace is the proper namespace to route the packet in.
--- include/linux/netfilter.h | 2 +- net/ipv4/netfilter.c | 2 +- net/ipv6/netfilter.c | 2 +- net/netfilter/nf_queue.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-)
include/linux/netfilter.h +1 -1
@@ -283,7 +283,7 @@ struct nf_afinfo { struct flowi *fl, bool strict);void (*saveroute)(const struct sk_buff *skb,struct nf_queue_entry *entry); -int (*reroute)(struct sk_buff *skb, +int (*reroute)(struct net *net,struct sk_buff *skb,const struct nf_queue_entry *entry);int route_key_size; };
net/ipv4/netfilter.c +1 -1
@@ -104,7 +104,7 @@ static void nf_ip_saveroute(const struct sk_buff *skb, } } -static int nf_ip_reroute (struct sk_buff *skb, +static int nf_ip_reroute (struct net *net,struct sk_buff *skb,const struct nf_queue_entry *entry) {const struct ip_rt_info *rt_info =nf_queue_entry_reroute (entry);
net/ipv6/netfilter.c +1 -1
@@ -93,7 +93,7 @@ static void nf_ip6_saveroute(const struct sk_buff *skb, } } -static int nf_ip6_reroute (struct sk_buff *skb, +static int nf_ip6_reroute (struct net *net,struct sk_buff *skb,const struct nf_queue_entry *entry) {struct ip6_rt_info *rt_info =nf_queue_entry_reroute (entry);
net/netfilter/nf_queue.c +1 -1
@@ -199,7 +199,7 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)if (verdict ==NF_ACCEPT ) { afinfo =nf_get_afinfo (entry->state.pf); -if (!afinfo || afinfo->reroute (skb, entry) <0 ) +if (!afinfo || afinfo->reroute (entry->state.net, skb, entry) <0 ) verdict =NF_DROP ; }
Signature · 1 line
2.2.1
PATCH 3/5 netfilter: ipt_SYNPROXY: Pass snet into synproxy_send_tcp
In reply to Eric W. Biedermanip6t_SYNPROXY already does this and this is needed so that we have a struct net that can be passed down into ip_route_me_harder, so that ip_route_me_harder can stop guessing it's context.
Along the way pass snet into synproxy_send_client_synack as this is the only caller of synprox_send_tcp that is not passed snet already.
--- net/ipv4/netfilter/ipt_SYNPROXY.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
net/ipv4/netfilter/ipt_SYNPROXY.c +9 -7
@@ -39,7 +39,8 @@ synproxy_build_ip(struct sk_buff *skb, __be32 saddr, __be32 daddr) }static void -synproxy_send_tcp (const struct sk_buff *skb,struct sk_buff *nskb, +synproxy_send_tcp (const struct synproxy_net *snet, +const struct sk_buff *skb,struct sk_buff *nskb,struct nf_conntrack *nfct,enum ip_conntrack_info ctinfo,struct iphdr *niph,struct tcphdr *nth,unsigned int tcp_hdr_size)
@@ -68,7 +69,8 @@ free_nskb: }static void -synproxy_send_client_synack (const struct sk_buff *skb,const struct tcphdr *th, +synproxy_send_client_synack (const struct synproxy_net *snet, +const struct sk_buff *skb,const struct tcphdr *th,const struct synproxy_options *opts) {struct sk_buff *nskb;
@@ -104,7 +106,7 @@ synproxy_send_client_synack(const struct sk_buff *skb, const struct tcphdr *th,synproxy_build_options (nth, opts); -synproxy_send_tcp (skb, nskb, skb->nfct,IP_CT_ESTABLISHED_REPLY , +synproxy_send_tcp (snet, skb, nskb, skb->nfct,IP_CT_ESTABLISHED_REPLY , niph, nth, tcp_hdr_size); }
@@ -148,7 +150,7 @@ synproxy_send_server_syn(const struct synproxy_net *snet,synproxy_build_options (nth, opts); -synproxy_send_tcp (skb, nskb, &snet->tmpl->ct_general,IP_CT_NEW , +synproxy_send_tcp (snet, skb, nskb, &snet->tmpl->ct_general,IP_CT_NEW , niph, nth, tcp_hdr_size); }
@@ -188,7 +190,7 @@ synproxy_send_server_ack(const struct synproxy_net *snet,synproxy_build_options (nth, opts); -synproxy_send_tcp (skb, nskb,NULL ,0 , niph, nth, tcp_hdr_size); +synproxy_send_tcp (snet, skb, nskb,NULL ,0 , niph, nth, tcp_hdr_size); } static void
@@ -226,7 +228,7 @@ synproxy_send_client_ack(const struct synproxy_net *snet,synproxy_build_options (nth, opts); -synproxy_send_tcp (skb, nskb, skb->nfct,IP_CT_ESTABLISHED_REPLY , +synproxy_send_tcp (snet, skb, nskb, skb->nfct,IP_CT_ESTABLISHED_REPLY , niph, nth, tcp_hdr_size); }
@@ -287,7 +289,7 @@ synproxy_tg4(struct sk_buff *skb, const struct xt_action_param *par)XT_SYNPROXY_OPT_SACK_PERM | XT_SYNPROXY_OPT_ECN); -synproxy_send_client_synack (skb, th, &opts); +synproxy_send_client_synack (snet, skb, th, &opts);return NF_DROP ; }else if (th->ack && !(th->fin || th->rst || th->syn)) {
Signature · 1 line
2.2.1
PATCH 4/5 ipv4: Pass struct net into ip_route_me_harder
In reply to Eric W. BiedermanDon't make ip_route_me_harder guess which network namespace it is routing in, pass the network namespace in.
--- include/linux/netfilter_ipv4.h | 2 +- net/ipv4/netfilter.c | 5 ++--- net/ipv4/netfilter/ipt_SYNPROXY.c | 4 +++- net/ipv4/netfilter/iptable_mangle.c | 2 +- net/ipv4/netfilter/nf_nat_l3proto_ipv4.c | 2 +- net/ipv4/netfilter/nf_reject_ipv4.c | 2 +- net/ipv4/netfilter/nft_chain_route_ipv4.c | 2 +- net/netfilter/ipvs/ip_vs_core.c | 2 +- 8 files changed, 11 insertions(+), 10 deletions(-)
include/linux/netfilter_ipv4.h +1 -1
@@ -6,7 +6,7 @@#include <uapi/linux/netfilter_ipv4.h> -int ip_route_me_harder (struct sk_buff *skb,unsigned addr_type); +int ip_route_me_harder (struct net *net,struct sk_buff *skb,unsigned addr_type);__sum16 nf_ip_checksum (struct sk_buff *skb,unsigned int hook,unsigned int dataoff,u_int8_t protocol);#endif /*__LINUX_IP_NETFILTER_H*/
net/ipv4/netfilter.c +2 -3
@@ -17,9 +17,8 @@#include <net/netfilter/nf_queue.h> /* route_me_harder function, used by iptable_nat, iptable_mangle + ip_queue */ -int ip_route_me_harder (struct sk_buff *skb,unsigned int addr_type) +int ip_route_me_harder (struct net *net,struct sk_buff *skb,unsigned int addr_type) { -struct net *net =dev_net (skb_dst (skb)->dev);const struct iphdr *iph =ip_hdr (skb);struct rtable *rt;struct flowi4 fl4 = {};
@@ -116,7 +115,7 @@ static int nf_ip_reroute(struct net *net, struct sk_buff *skb, skb->mark == rt_info->mark && iph->daddr == rt_info->daddr && iph->saddr == rt_info->saddr)) -return ip_route_me_harder (skb,RTN_UNSPEC ); +return ip_route_me_harder (net, skb,RTN_UNSPEC ); }return 0 ; }
net/ipv4/netfilter/ipt_SYNPROXY.c +3 -1
@@ -45,6 +45,8 @@ synproxy_send_tcp(const struct synproxy_net *snet, struct iphdr *niph, struct tcphdr *nth, unsigned int tcp_hdr_size) { + struct net *net = nf_ct_net(snet->tmpl); + nth->check = ~tcp_v4_check (tcp_hdr_size, niph->saddr, niph->daddr,0 ); nskb->ip_summed =CHECKSUM_PARTIAL ; nskb->csum_start = (unsigned char *)nth - nskb->head;
@@ -52,7 +54,7 @@ synproxy_send_tcp(const struct synproxy_net *snet,skb_dst_set_noref (nskb,skb_dst (skb)); nskb->protocol =htons (ETH_P_IP ); -if (ip_route_me_harder (nskb,RTN_UNSPEC )) +if (ip_route_me_harder (net, nskb,RTN_UNSPEC )) goto free_nskb;if (nfct) {
net/ipv4/netfilter/iptable_mangle.c +1 -1
@@ -67,7 +67,7 @@ ipt_mangle_out(struct sk_buff *skb, const struct nf_hook_state *state) iph->daddr != daddr || skb->mark != mark || iph->tos != tos) { - err =ip_route_me_harder (skb,RTN_UNSPEC ); + err =ip_route_me_harder (state->net, skb,RTN_UNSPEC );if (err <0 ) ret =NF_DROP_ERR (err); }
net/ipv4/netfilter/nf_nat_l3proto_ipv4.c +1 -1
@@ -431,7 +431,7 @@ nf_nat_ipv4_local_fn(void *priv, struct sk_buff *skb,if (ct->tuplehash[dir].tuple.dst.u3.ip != ct->tuplehash[!dir].tuple.src.u3.ip) { - err =ip_route_me_harder (skb,RTN_UNSPEC ); + err =ip_route_me_harder (state->net, skb,RTN_UNSPEC );if (err <0 ) ret =NF_DROP_ERR (err); }
net/ipv4/netfilter/nf_reject_ipv4.c +1 -1
@@ -129,7 +129,7 @@ void nf_send_reset(struct net *net, struct sk_buff *oldskb, int hook) ip4_dst_hoplimit(skb_dst(nskb)));nf_reject_ip_tcphdr_put (nskb, oldskb, oth); -if (ip_route_me_harder (nskb,RTN_UNSPEC )) +if (ip_route_me_harder (net, nskb,RTN_UNSPEC )) goto free_nskb;/* "Never happens" */
net/ipv4/netfilter/nft_chain_route_ipv4.c +1 -1
@@ -53,7 +53,7 @@ static unsigned int nf_route_table_hook(void *priv, iph->daddr != daddr || skb->mark != mark || iph->tos != tos) -if (ip_route_me_harder (skb,RTN_UNSPEC )) + if (ip_route_me_harder(state->net, skb, RTN_UNSPEC)) ret = NF_DROP; }return ret;
net/netfilter/ipvs/ip_vs_core.c +1 -1
@@ -720,7 +720,7 @@ static int ip_vs_route_me_harder(struct netns_ipvs *ipvs, int af, } else#endif if (!(skb_rtable (skb)->rt_flags &RTCF_LOCAL ) && -ip_route_me_harder (skb,RTN_LOCAL ) !=0 ) +ip_route_me_harder (ipvs->net, skb,RTN_LOCAL ) !=0 )return 1 ;return 0 ;
Signature · 1 line
2.2.1
PATCH 5/5 ipv6: Pass struct net into ip6_route_me_harder
In reply to Eric W. BiedermanDon't make ip6_route_me_harder guess which network namespace it is routing in, pass the network namespace in.
--- include/linux/netfilter_ipv6.h | 2 +- net/ipv6/netfilter.c | 5 ++--- net/ipv6/netfilter/ip6table_mangle.c | 2 +- net/ipv6/netfilter/nf_nat_l3proto_ipv6.c | 2 +- net/ipv6/netfilter/nft_chain_route_ipv6.c | 2 +- net/netfilter/ipvs/ip_vs_core.c | 2 +- 6 files changed, 7 insertions(+), 8 deletions(-)
include/linux/netfilter_ipv6.h +1 -1
@@ -22,7 +22,7 @@ struct nf_ipv6_ops { };#ifdef CONFIG_NETFILTER -int ip6_route_me_harder (struct sk_buff *skb); +int ip6_route_me_harder (struct net *net,struct sk_buff *skb);__sum16 nf_ip6_checksum (struct sk_buff *skb,unsigned int hook,unsigned int dataoff,u_int8_t protocol);
net/ipv6/netfilter.c +2 -3
@@ -18,9 +18,8 @@#include <net/ip6_checksum.h> #include <net/netfilter/nf_queue.h> -int ip6_route_me_harder (struct sk_buff *skb) +int ip6_route_me_harder (struct net *net,struct sk_buff *skb) { -struct net *net =dev_net (skb_dst (skb)->dev);const struct ipv6hdr *iph =ipv6_hdr (skb);unsigned int hh_len;struct dst_entry *dst;
@@ -103,7 +102,7 @@ static int nf_ip6_reroute(struct net *net, struct sk_buff *skb,if (!ipv6_addr_equal (&iph->daddr, &rt_info->daddr) || !ipv6_addr_equal (&iph->saddr, &rt_info->saddr) || skb->mark != rt_info->mark) -return ip6_route_me_harder (skb); +return ip6_route_me_harder (net, skb); }return 0 ; }
net/ipv6/netfilter/ip6table_mangle.c +1 -1
@@ -65,7 +65,7 @@ ip6t_mangle_out(struct sk_buff *skb, const struct nf_hook_state *state) skb->mark != mark || ipv6_hdr(skb)->hop_limit != hop_limit || flowlabel != *((u_int32_t *)ipv6_hdr(skb)))) { - err =ip6_route_me_harder (skb); + err =ip6_route_me_harder (state->net, skb);if (err <0 ) ret =NF_DROP_ERR (err); }
net/ipv6/netfilter/nf_nat_l3proto_ipv6.c +1 -1
@@ -437,7 +437,7 @@ nf_nat_ipv6_local_fn(void *priv, struct sk_buff *skb,if (!nf_inet_addr_cmp (&ct->tuplehash[dir].tuple.dst.u3, &ct->tuplehash[!dir].tuple.src.u3)) { - err =ip6_route_me_harder (skb); + err =ip6_route_me_harder (state->net, skb);if (err <0 ) ret =NF_DROP_ERR (err); }
net/ipv6/netfilter/nft_chain_route_ipv6.c +1 -1
@@ -52,7 +52,7 @@ static unsigned int nf_route_table_hook(void *priv, skb->mark != mark || ipv6_hdr(skb)->hop_limit != hop_limit || flowlabel != *((u_int32_t *)ipv6_hdr(skb)))) -return ip6_route_me_harder (skb) ==0 ? ret :NF_DROP ; +return ip6_route_me_harder (state->net, skb) ==0 ? ret :NF_DROP ;return ret; }
net/netfilter/ipvs/ip_vs_core.c +1 -1
@@ -715,7 +715,7 @@ static int ip_vs_route_me_harder(struct netns_ipvs *ipvs, int af,struct dst_entry *dst =skb_dst (skb);if (dst->dev && !(dst->dev->flags &IFF_LOOPBACK ) && -ip6_route_me_harder (skb) !=0 ) +ip6_route_me_harder (ipvs->net, skb) !=0 )return 1 ; } else#endif
Signature · 1 line
2.2.1
Re: [PATCH next 0/5] netfilter: Pass net into ip_route_me_harder
In reply to Eric W. BiedermanQuoted 11 lines · Eric W. Biederman
This is the next installment of my work to pass struct net through the output path so the code does not need to guess how to figure out which network namespace it is in, and ultimately routes can have output devices in another network namespace.
This round the focus is our getting struct net passed in, instead of guess in the netfilter functions that reroute packets (
ip_route_me_harder, andip6_route_me_harder). There is a bit more work on the ipv4 side as the ipv6 code on several of these code paths already passes in the struct net.
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Pablo Neira Ayuso
maintainerRe: [PATCH next 0/5] netfilter: Pass net into ip_route_me_harder
In reply to Eric W. BiedermanQuoted 11 lines · Eric W. Biederman
This is the next installment of my work to pass struct net through the output path so the code does not need to guess how to figure out which network namespace it is in, and ultimately routes can have output devices in another network namespace.
This round the focus is our getting struct net passed in, instead of guess in the netfilter functions that reroute packets (
ip_route_me_harder, andip6_route_me_harder). There is a bit more work on the ipv4 side as the ipv6 code on several of these code paths already passes in the struct net.
Series applied, thanks.
cover net: Pass net through ip fragmention
In reply to Eric W. BiedermanThis is the next installment of my work to pass struct net through the output path so the code does not need to guess how to figure out which network namespace it is in, and ultimately routes can have output devices in another network namespace.
This round focuses on passing net through ip fragmentation which we seem to call from about everywhere. That is the main ip output paths, the bridge netfilter code, and openvswitch. This has to happend at once accross the tree as function pointers are involved.
First some prep work is done, then ipv4 and ipv6 are converted and then temporary helper functions are removed.
The changes are also available against nf-next at:git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/net-next.git master
Eric
Eric W. Biederman (6):
openvswitch: Pass net into ovs_vport_output
openvswitch: Pass net into ovs_fragment
ipv4: Pass struct net through ip_fragment
ipv6: Pass struct net through ip6_fragment
bridge: Remove br_nf_push_frag_xmit_sk
openvswitch: Remove ovs_vport_output_sk
include/linux/netfilter_ipv6.h | 4 ++-- include/net/ip.h | 4 ++-- include/net/ip6_route.h | 4 ++-- net/bridge/br_netfilter_hooks.c | 13 ++++-------- net/ipv4/ip_output.c | 44 +++++++++++++++++++---------------------- net/ipv6/ip6_output.c | 16 +++++++-------- net/ipv6/xfrm6_output.c | 10 ++++++++-- net/openvswitch/actions.c | 13 ++++++------ 8 files changed, 52 insertions(+), 56 deletions(-)
PATCH 1/6 openvswitch: Pass net into ovs_vport_output
When struct net starts being passed through the ipv4 and ipv6 fragment routines ovs_vport_output will need to take a net parameter. Prepare ovs_vport_output before that is needed and introduce ovs_vport_output_skk for the call sites that still need the old calling conventions.
--- net/openvswitch/actions.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
net/openvswitch/actions.c +8 -3
@@ -620,7 +620,7 @@ static int set_sctp(struct sk_buff *skb, struct sw_flow_key *flow_key,return 0 ; } -static int ovs_vport_output (struct sock *sock,struct sk_buff *skb) +static int ovs_vport_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct ovs_frag_data *data =this_cpu_ptr (&ovs_frag_data_storage);struct vport *vport = data->vport;
@@ -645,6 +645,11 @@ static int ovs_vport_output(struct sock *sock, struct sk_buff *skb)ovs_vport_send (vport, skb);return 0 ; } +static int ovs_vport_output_sk (struct sock *sk,struct sk_buff *skb) +{ +struct net *net =dev_net (skb_dst (skb)->dev); +return ovs_vport_output (net, sk, skb); +}static unsigned int ovs_dst_get_mtu (const struct dst_entry *dst)
@@ -700,7 +705,7 @@ static void ovs_fragment(struct vport *vport, struct sk_buff *skb, u16 mru,skb_dst_set_noref (skb, &ovs_dst);IPCB (skb)->frag_max_size = mru; -ip_do_fragment (skb->sk, skb, ovs_vport_output); +ip_do_fragment (skb->sk, skb, ovs_vport_output_sk);refdst_drop (orig_dst); }else if (ethertype ==htons (ETH_P_IPV6 )) {const struct nf_ipv6_ops *v6ops =nf_get_ipv6_ops ();
@@ -722,7 +727,7 @@ static void ovs_fragment(struct vport *vport, struct sk_buff *skb, u16 mru,skb_dst_set_noref (skb, &ovs_rt.dst);IP6CB (skb)->frag_max_size = mru; - v6ops->fragment (skb->sk, skb, ovs_vport_output); + v6ops->fragment (skb->sk, skb, ovs_vport_output_sk);refdst_drop (orig_dst); }else { WARN_ONCE(1, "Failed fragment ->%s: eth=%04x, MRU=%d, MTU=%d.",
Signature · 1 line
2.2.1
Re: [PATCH net-next 1/6] openvswitch: Pass net into ovs_vport_output
Quoted 4 lines · Eric W. Biederman
When struct net starts being passed through the ipv4 and ipv6 fragment routines
ovs_vport_outputwill need to take a net parameter. Prepareovs_vport_outputbefore that is needed and introduceovs_vport_output_skkfor the call sites that still need the old
nit: _skk instead of _sk
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 2/6 openvswitch: Pass net into ovs_fragment
In reply to Eric W. BiedermanIn preparation for the ipv4 and ipv6 fragmentation code taking a net parameter pass a struct net into ovs_fragment where the v4 and v6 fragmentation code is called.
--- net/openvswitch/actions.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/openvswitch/actions.c +4 -3
@@ -684,8 +684,8 @@ static void prepare_frag(struct vport *vport, struct sk_buff *skb)skb_pull (skb, hlen); } -static void ovs_fragment (struct vport *vport,struct sk_buff *skb,u16 mru, -__be16 ethertype) +static void ovs_fragment (struct net *net,struct vport *vport, +struct sk_buff *skb,u16 mru,__be16 ethertype) {if (skb_network_offset (skb) >MAX_L2_LEN ) {OVS_NLERR (1 ,"L2 header too long to fragment" );
@@ -748,6 +748,7 @@ static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port,if (likely (!mru || (skb->len <= mru +ETH_HLEN ))) {ovs_vport_send (vport, skb); }else if (mru <= vport->dev->mtu) { +struct net *net =read_pnet (&dp->net);__be16 ethertype = key->eth.type;if (!is_flow_key_valid (key)) {
@@ -757,7 +758,7 @@ static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port, ethertype =vlan_get_protocol (skb); } -ovs_fragment (vport, skb, mru, ethertype); +ovs_fragment (net, vport, skb, mru, ethertype); }else {kfree_skb (skb); }
Signature · 1 line
2.2.1
Re: [PATCH net-next 2/6] openvswitch: Pass net into ovs_fragment
Quoted 6 lines · Eric W. Biederman
In preparation for the ipv4 and ipv6 fragmentation code taking a net parameter pass a struct net into
ovs_fragmentwhere the v4 and v6 fragmentation code is called.Signed-off-by "Eric W. Biederman" <[email protected]>---
[snip]
net/openvswitch/actions.c static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port, · line 751
Quoted 5 lines
net/openvswitch/actions.c +1
-0@@ -748,6 +748,7 @@ static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port,if (likely (!mru || (skb->len <= mru +ETH_HLEN ))) {ovs_vport_send (vport, skb); }else if (mru <= vport->dev->mtu) { +struct net *net =read_pnet (&dp->net);
nit: add an empty line after variables declaration.
Quoted 3 lines
net/openvswitch/actions.c +0
-0__be16 ethertype = key->eth.type;if (!is_flow_key_valid (key)) {
[snip]
Re: [PATCH net-next 2/6] openvswitch: Pass net into ovs_fragment
Quoted 7 lines · Nicolas Dichtel
Quoted 6 lines · Eric W. Biederman
In preparation for the ipv4 and ipv6 fragmentation code taking a net parameter pass a struct net into
ovs_fragmentwhere the v4 and v6 fragmentation code is called.Signed-off-by "Eric W. Biederman" <[email protected]>---
Quoted 10 lines
[snip]
net/openvswitch/actions.c static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port, · line 751
Quoted 5 lines
net/openvswitch/actions.c +1
-0@@ -748,6 +748,7 @@ static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port,if (likely (!mru || (skb->len <= mru +ETH_HLEN ))) {ovs_vport_send (vport, skb); }else if (mru <= vport->dev->mtu) { +struct net *net =read_pnet (&dp->net);nit: add an empty line after variables declaration.
Quoted 2 lines
net/openvswitch/actions.c +0
-0__be16 ethertype = key->eth.type;
^^^^^^^^^^^ The empty line is right here, after the second variable
declaration.
Quoted 2 lines
Quoted 1 line
net/openvswitch/actions.c +0
-0if (!is_flow_key_valid (key)) {[snip]
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH net-next 2/6] openvswitch: Pass net into ovs_fragment
Quoted 3 lines · Eric W. Biederman
Quoted 1 line · Nicolas Dichtel
Le 30/09/2015 23:25, Eric W. Biederman a écrit :
[snip]
Quoted 7 lines
Quoted 5 lines
net/openvswitch/actions.c static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port, · line 751
Quoted 1 line
net/openvswitch/actions.c +1
-0+struct net *net =read_pnet (&dp->net);nit: add an empty line after variables declaration.
Quoted 2 lines
__be16 ethertype = key->eth.type;^^^^^^^^^^^ The empty line is right here, after the second variable
declaration.
Rooh ... I need glasses ;-)
Sorry for the noise.
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 3/6 ipv4: Pass struct net through ip_fragment
In reply to Eric W. Biederman--- include/net/ip.h | 4 ++-- net/bridge/br_netfilter_hooks.c | 6 +++--- net/ipv4/ip_output.c | 44 +++++++++++++++++++---------------------- net/openvswitch/actions.c | 2 +- 4 files changed, 26 insertions(+), 30 deletions(-)
include/net/ip.h +2 -2
@@ -109,8 +109,8 @@ int ip_local_deliver(struct sk_buff *skb);int ip_mr_input (struct sk_buff *skb);int ip_output (struct sock *sk,struct sk_buff *skb);int ip_mc_output (struct sock *sk,struct sk_buff *skb); -int ip_do_fragment (struct sock *sk,struct sk_buff *skb, -int (*output)(struct sock *,struct sk_buff *)); +int ip_do_fragment (struct net *net,struct sock *sk,struct sk_buff *skb, +int (*output)(struct net *,struct sock *,struct sk_buff *));void ip_send_check (struct iphdr *ip);int __ip_local_out (struct sk_buff *skb);int ip_local_out_sk (struct sock *sk,struct sk_buff *skb);
net/bridge/br_netfilter_hooks.c +3 -3
@@ -701,7 +701,7 @@ static int br_nf_push_frag_xmit_sk(struct sock *sk, struct sk_buff *skb)#if IS_ENABLED (CONFIG_NF_DEFRAG_IPV4 )static int br_nf_ip_fragment (struct net *net,struct sock *sk,struct sk_buff *skb, -int (*output)(struct sock *,struct sk_buff *)) +int (*output)(struct net *,struct sock *,struct sk_buff *)) {unsigned int mtu =ip_skb_dst_mtu (skb);struct iphdr *iph =ip_hdr (skb);
@@ -714,7 +714,7 @@ br_nf_ip_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, return -EMSGSIZE; } -return ip_do_fragment (sk, skb, output); +return ip_do_fragment (net, sk, skb, output); }#endif
@@ -763,7 +763,7 @@ static int br_nf_dev_queue_xmit(struct net *net, struct sock *sk, struct sk_buffskb_copy_from_linear_data_offset (skb, -data->size, data->mac, data->size); - return br_nf_ip_fragment(net, sk, skb, br_nf_push_frag_xmit_sk); + return br_nf_ip_fragment(net, sk, skb, br_nf_push_frag_xmit); }#endif #if IS_ENABLED (CONFIG_NF_DEFRAG_IPV6 )
net/ipv4/ip_output.c +20 -24
135 lines not on this page · raw message
net/openvswitch/actions.c +1 -1
@@ -705,7 +705,7 @@ static void ovs_fragment(struct net *net, struct vport *vport,skb_dst_set_noref (skb, &ovs_dst);IPCB (skb)->frag_max_size = mru; -ip_do_fragment (skb->sk, skb, ovs_vport_output_sk); +ip_do_fragment (net, skb->sk, skb, ovs_vport_output);refdst_drop (orig_dst); }else if (ethertype ==htons (ETH_P_IPV6 )) {const struct nf_ipv6_ops *v6ops =nf_get_ipv6_ops ();
Signature · 1 line
2.2.1
PATCH 4/6 ipv6: Pass struct net through ip6_fragment
In reply to Eric W. Biederman--- include/linux/netfilter_ipv6.h | 4 ++-- include/net/ip6_route.h | 4 ++-- net/bridge/br_netfilter_hooks.c | 2 +- net/ipv6/ip6_output.c | 16 +++++++--------- net/ipv6/xfrm6_output.c | 10 ++++++++-- net/openvswitch/actions.c | 2 +- 6 files changed, 21 insertions(+), 17 deletions(-)
include/linux/netfilter_ipv6.h +2 -2
@@ -17,8 +17,8 @@ struct nf_ipv6_ops {int (*chk_addr)(struct net *net,const struct in6_addr *addr,const struct net_device *dev,int strict);void (*route_input)(struct sk_buff *skb); -int (*fragment)(struct sock *sk,struct sk_buff *skb, -int (*output)(struct sock *,struct sk_buff *)); +int (*fragment)(struct net *net,struct sock *sk,struct sk_buff *skb, +int (*output)(struct net *,struct sock *,struct sk_buff *)); };#ifdef CONFIG_NETFILTER
include/net/ip6_route.h +2 -2
@@ -173,8 +173,8 @@ static inline bool ipv6_anycast_destination(const struct dst_entry *dst, ipv6_addr_equal(&rt->rt6i_dst.addr, daddr)); } -int ip6_fragment (struct sock *sk,struct sk_buff *skb, -int (*output)(struct sock *,struct sk_buff *)); +int ip6_fragment (struct net *net,struct sock *sk,struct sk_buff *skb, +int (*output)(struct net *,struct sock *,struct sk_buff *));static inline int ip6_skb_dst_mtu (struct sk_buff *skb) {
net/bridge/br_netfilter_hooks.c +1 -1
@@ -786,7 +786,7 @@ static int br_nf_dev_queue_xmit(struct net *net, struct sock *sk, struct sk_buff data->size);if (v6ops) -return v6ops->fragment (sk, skb, br_nf_push_frag_xmit_sk); +return v6ops->fragment (net, sk, skb, br_nf_push_frag_xmit);kfree_skb (skb);return -EMSGSIZE ;
net/ipv6/ip6_output.c +7 -9
@@ -56,11 +56,10 @@#include <net/checksum.h> #include <linux/mroute6.h> -static int ip6_finish_output2 (struct sock *sk,struct sk_buff *skb) +static int ip6_finish_output2 (struct net *net,struct sock *sk,struct sk_buff *skb) {struct dst_entry *dst =skb_dst (skb);struct net_device *dev = dst->dev; -struct net *net =dev_net (dev);struct neighbour *neigh;struct in6_addr *nexthop;int ret;
@@ -126,9 +125,9 @@ static int ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *sif ((skb->len >ip6_skb_dst_mtu (skb) && !skb_is_gso (skb)) ||dst_allfrag (skb_dst (skb)) || (IP6CB (skb)->frag_max_size && skb->len >IP6CB (skb)->frag_max_size)) -return ip6_fragment (sk, skb, ip6_finish_output2); +return ip6_fragment (net, sk, skb, ip6_finish_output2);else -return ip6_finish_output2 (sk, skb); +return ip6_finish_output2 (net, sk, skb); }int ip6_output (struct sock *sk,struct sk_buff *skb)
@@ -554,8 +553,8 @@ static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from)skb_copy_secmark (to, from); } -int ip6_fragment (struct sock *sk,struct sk_buff *skb, -int (*output)(struct sock *,struct sk_buff *)) +int ip6_fragment (struct net *net,struct sock *sk,struct sk_buff *skb, +int (*output)(struct net *,struct sock *,struct sk_buff *)) {struct sk_buff *frag;struct rt6_info *rt = (struct rt6_info *)skb_dst (skb);
@@ -568,7 +567,6 @@ int ip6_fragment(struct sock *sk, struct sk_buff *skb,__be32 frag_id;int ptr, offset =0 , err =0 ;u8 *prevhdr, nexthdr =0 ; -struct net *net =dev_net (skb_dst (skb)->dev); hlen =ip6_find_1stfragopt (skb, &prevhdr); nexthdr = *prevhdr;
@@ -688,7 +686,7 @@ int ip6_fragment(struct sock *sk, struct sk_buff *skb,ip6_copy_metadata (frag, skb); } - err =output (sk, skb); + err =output (net, sk, skb);if (!err)IP6_INC_STATS (net,ip6_dst_idev (&rt->dst),IPSTATS_MIB_FRAGCREATES );
@@ -816,7 +814,7 @@ slow_path:/* * Put this fragment into the sending queue. */ - err =output (sk, frag); + err =output (net, sk, frag);if (err) goto fail;
net/ipv6/xfrm6_output.c +8 -2
@@ -131,6 +131,12 @@ int xfrm6_output_finish(struct sock *sk, struct sk_buff *skb)return xfrm_output (sk, skb); } +static int __xfrm6_output_finish (struct net *net,struct sock *sk,struct sk_buff *skb) +{ +struct xfrm_state *x =skb_dst (skb)->xfrm; +return x->outer_mode->afinfo->output_finish (sk, skb); +} +static int __xfrm6_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct dst_entry *dst =skb_dst (skb);
@@ -160,8 +166,8 @@ static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)if (x->props.mode ==XFRM_MODE_TUNNEL && ((skb->len > mtu && !skb_is_gso (skb)) ||dst_allfrag (skb_dst (skb)))) { -return ip6_fragment (sk, skb, - x->outer_mode->afinfo->output_finish); +return ip6_fragment (net, sk, skb, + __xfrm6_output_finish); }return x->outer_mode->afinfo->output_finish (sk, skb); }
net/openvswitch/actions.c +1 -1
@@ -727,7 +727,7 @@ static void ovs_fragment(struct net *net, struct vport *vport,skb_dst_set_noref (skb, &ovs_rt.dst);IP6CB (skb)->frag_max_size = mru; - v6ops->fragment (skb->sk, skb, ovs_vport_output_sk); + v6ops->fragment (net, skb->sk, skb, ovs_vport_output);refdst_drop (orig_dst); }else { WARN_ONCE(1, "Failed fragment ->%s: eth=%04x, MRU=%d, MTU=%d.",
Signature · 1 line
2.2.1
Re: [PATCH net-next 4/6] ipv6: Pass struct net through ip6_fragment
Quoted 2 lines · Eric W. Biederman
Signed-off-by Eric W. Biederman <[email protected]>---
[snip]
net/ipv6/xfrm6_output.c int xfrm6_output_finish(struct sock *sk, struct sk_buff *skb) · line 136
Quoted 11 lines
net/ipv6/xfrm6_output.c +3
-0@@ -131,6 +131,12 @@ int xfrm6_output_finish(struct sock *sk, struct sk_buff *skb)return xfrm_output (sk, skb); } +static int __xfrm6_output_finish (struct net *net,struct sock *sk,struct sk_buff *skb) +{ +struct xfrm_state *x =skb_dst (skb)->xfrm;
nit: add an empty line after variables declaration.
Quoted 3 lines
net/ipv6/xfrm6_output.c +3
-0+return x->outer_mode->afinfo->output_finish (sk, skb); +} +
[snip]
[PATCH net-next 7/6] ipv6: Add missing newline to __xfrm6_output_finish
Add a newline between variable declarations and the code.
--- net/ipv6/xfrm6_output.c | 1 + 1 file changed, 1 insertion(+)
net/ipv6/xfrm6_output.c +1 -0
@@ -134,6 +134,7 @@ int xfrm6_output_finish(struct sock *sk, struct sk_buff *skb)static int __xfrm6_output_finish (struct net *net,struct sock *sk,struct sk_buff *skb) {struct xfrm_state *x =skb_dst (skb)->xfrm; +return x->outer_mode->afinfo->output_finish (sk, skb); }
Signature · 1 line
2.2.1
PATCH 5/6 bridge: Remove br_nf_push_frag_xmit_sk
In reply to Eric W. BiedermanNow that this compatability function no longer has any callers remove it.
--- net/bridge/br_netfilter_hooks.c | 5 ----- 1 file changed, 5 deletions(-)
net/bridge/br_netfilter_hooks.c +0 -5
@@ -691,11 +691,6 @@ static int br_nf_push_frag_xmit(struct net *net, struct sock *sk, struct sk_buffnf_bridge_info_free (skb); return br_dev_queue_push_xmit(net, sk, skb); } -static int br_nf_push_frag_xmit_sk (struct sock *sk,struct sk_buff *skb) -{ -struct net *net =dev_net (skb_dst (skb)->dev); -return br_nf_push_frag_xmit (net, sk, skb); -}#endif #if IS_ENABLED (CONFIG_NF_DEFRAG_IPV4 )
Signature · 1 line
2.2.1
PATCH 6/6 openvswitch: Remove ovs_vport_output_sk
In reply to Eric W. BiedermanThis was a compatibility function needed while the ipv4 and ipv6 fragmentation code was being modified to pass a struct net through them. Now that is complete this function has no more users so remove it.
--- net/openvswitch/actions.c | 5 ----- 1 file changed, 5 deletions(-)
net/openvswitch/actions.c +0 -5
@@ -645,11 +645,6 @@ static int ovs_vport_output(struct net *net, struct sock *sk, struct sk_buff *skovs_vport_send (vport, skb);return 0 ; } -static int ovs_vport_output_sk (struct sock *sk,struct sk_buff *skb) -{ -struct net *net =dev_net (skb_dst (skb)->dev); -return ovs_vport_output (net, sk, skb); -}static unsigned int ovs_dst_get_mtu (const struct dst_entry *dst)
Signature · 1 line
2.2.1
Re: [PATCH net-next 0/6] net: Pass net through ip fragmention
In reply to Eric W. BiedermanQuoted 6 lines · Eric W. Biederman
This is the next installment of my work to pass struct net through the output path so the code does not need to guess how to figure out which network namespace it is in, and ultimately routes can have output devices in another network namespace.
Quoted 7 lines
This round focuses on passing net through ip fragmentation which we seem to call from about everywhere. That is the main ip output paths, the bridge netfilter code, and openvswitch. This has to happend at once accross the tree as function pointers are involved.
First some prep work is done, then ipv4 and ipv6 are converted and then temporary helper functions are removed.
Some minors comments (see other emails).
David Miller
maintainerRe: [PATCH net-next 0/6] net: Pass net through ip fragmention
In reply to Eric W. BiedermanFrom: [email protected] (Eric W. Biederman)
Date: Wed, 30 Sep 2015 16:24:40 -0500
Quoted 11 lines
This is the next installment of my work to pass struct net through the output path so the code does not need to guess how to figure out which network namespace it is in, and ultimately routes can have output devices in another network namespace.
This round focuses on passing net through ip fragmentation which we seem to call from about everywhere. That is the main ip output paths, the bridge netfilter code, and openvswitch. This has to happend at once accross the tree as function pointers are involved.
Quoted 5 lines
First some prep work is done, then ipv4 and ipv6 are converted and then temporary helper functions are removed.
The changes are also available against nf-next at:
git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/net-next.gitmaster
Pulled, thanks Eric.
cover net: Pass net through the output path
In reply to Eric W. BiedermanThis is the next installment of my work to pass struct net through the output path so the code does not need to guess how to figure out which network namespace it is in, and ultimately routes can have output devices in another network namespace.
The first patch in this series is a fix for a bug that came in when sk was passed through the functions in the output path, and as such is probably a candidate for net. At the same time my later patches depend on it so sending the fix separately would be confusing.
The rest of the patchset focuses on the path from xxx_local_out to dst_output and in the end succeeds in passing sock_net(sk) from the socket a packet locally originates on to the dst->output function.
Given the size reduction in the code I think this counts as a cleanup as much as feature work.
There remain a number of helper functions (like ip option processing) to take care of before the network stack can support destination devices in other network namespaces but with this set of changes the backbone of the work is done.
The changes are also available against net-next at:git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/net-next.git master
Eric
Eric W. Biederman (15):
ipv4: Fix ip_local_out_sk by passing the sk into __ip_local_out_sk
xfrm: Only compute net once in xfrm_policy_queue_process
net: Pass net into dst_output and remove dst_output_okfn
dst: Pass a sk into .local_out
ipv4: Merge __ip_local_out and __ip_local_out_sk
ipv4: Merge ip_local_out and ip_local_out_sk
ipv6: Merge __ip6_local_out and __ip6_local_out_sk
ipv6: Merge ip6_local_out and ip6_local_out_sk
ipv4: Cache net in iptunnel_xmit
ipv4: Cache net in ip_build_and_send_pkt and ip_queue_xmit
ppp: Cache net in pptp_xmit
ipvlan: Cache net in ipvlan_process_v4_outbound and ipvlan_process_v6_outbound ipv4,ipv6: Pass net into __ip_local_out and __ip6_local_out ipv4,ipv6: Pass net into ip_local_out and ip6_local_out
dst: Pass net into dst->output
drivers/net/ipvlan/ipvlan_core.c | 10 +++++---- drivers/net/ppp/pptp.c | 7 ++++--- drivers/net/vrf.c | 9 ++++---- include/net/dst.h | 14 +++++-------- include/net/dst_ops.h | 3 ++- include/net/ip.h | 12 ++++------- include/net/ip6_tunnel.h | 2 +- include/net/ipv6.h | 7 +++---- include/net/lwtunnel.h | 8 +++---- include/net/xfrm.h | 6 +++--- net/core/dst.c | 14 ++++++------- net/core/lwtunnel.c | 4 ++-- net/decnet/dn_nsp_out.c | 4 ++-- net/decnet/dn_route.c | 6 +++--- net/ipv4/igmp.c | 4 ++-- net/ipv4/ip_forward.c | 2 +- net/ipv4/ip_output.c | 42 ++++++++++++++++--------------------- net/ipv4/ip_tunnel_core.c | 6 +++--- net/ipv4/ip_vti.c | 2 +- net/ipv4/ipmr.c | 2 +- net/ipv4/netfilter/ipt_SYNPROXY.c | 2 +- net/ipv4/netfilter/nf_dup_ipv4.c | 2 +- net/ipv4/netfilter/nf_reject_ipv4.c | 2 +- net/ipv4/raw.c | 2 +- net/ipv4/route.c | 4 ++-- net/ipv4/xfrm4_output.c | 6 ++---- net/ipv6/ila.c | 4 ++-- net/ipv6/ip6_output.c | 9 ++++---- net/ipv6/ip6_vti.c | 2 +- net/ipv6/ip6mr.c | 2 +- net/ipv6/mcast.c | 4 ++-- net/ipv6/ndisc.c | 2 +- net/ipv6/netfilter/ip6t_SYNPROXY.c | 2 +- net/ipv6/netfilter/nf_dup_ipv6.c | 2 +- net/ipv6/netfilter/nf_reject_ipv6.c | 2 +- net/ipv6/output_core.c | 22 +++++-------------- net/ipv6/raw.c | 2 +- net/ipv6/route.c | 14 ++++++------- net/ipv6/xfrm6_output.c | 6 ++---- net/mpls/mpls_iptunnel.c | 2 +- net/netfilter/ipvs/ip_vs_xmit.c | 8 +++---- net/xfrm/xfrm_output.c | 4 ++-- net/xfrm/xfrm_policy.c | 11 +++++----- 43 files changed, 125 insertions(+), 155 deletions(-)
PATCH 1/15 ipv4: Fix ip_local_out_sk by passing the sk into __ip_local_out_sk
In the rare case where sk != skb->sk ip_local_out_sk arranges to call dst->output differently if the skb is queued or not. This is a bug.
Fix this bug by passing the sk parameter of ip_local_out_sk through from ip_local_out_sk to __ip_local_out_sk (skipping __ip_local_out).
--- net/ipv4/ip_output.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/ip_output.c +1 -1
@@ -117,7 +117,7 @@ int ip_local_out_sk(struct sock *sk, struct sk_buff *skb) {int err; - err =__ip_local_out (skb); + err =__ip_local_out_sk (sk, skb);if (likely (err ==1 )) err =dst_output (sk, skb);
Signature · 1 line
2.2.1
Re: [PATCH net-next 01/15] ipv4: Fix ip_local_out_sk by passing the sk into __ip_local_out_sk
Hello.
Quoted 8 lines · Eric W. Biederman
In the rare case where sk !=
skb->skip_local_out_skarranges to calldst->outputdifferently if the skb is queued or not. This is a bug.Fix this bug by passing the sk parameter of
ip_local_out_skthrough fromip_local_out_skto__ip_local_out_sk(skipping__ip_local_out).Fixes 7026b1ddb6b8d4e6ee33dc2bd06c0ca8746fa7ab
Please see Documentation/SubmittingPatches on how the Fixes tag should
look like.
Quoted 1 line
Signed-off-by "Eric W. Biederman" <[email protected]>
MBR, Sergei
Re: [PATCH net-next 01/15] ipv4: Fix ip_local_out_sk by passing the sk into __ip_local_out_sk
In reply to Eric W. BiedermanLe 06/10/2015 20:53, Eric W. Biederman a écrit :
Quoted 8 lines
In the rare case where sk !=
skb->skip_local_out_skarranges to calldst->outputdifferently if the skb is queued or not. This is a bug.Fix this bug by passing the sk parameter of
ip_local_out_skthrough fromip_local_out_skto__ip_local_out_sk(skipping__ip_local_out).Fixes 7026b1ddb6b8d4e6ee33dc2bd06c0ca8746fa7ab
It's in 4.1, so I assume this patch is for net also?
PATCH 2/15 xfrm: Only compute net once in xfrm_policy_queue_process
In reply to Eric W. Biederman--- net/xfrm/xfrm_policy.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
net/xfrm/xfrm_policy.c +3 -4
@@ -1887,6 +1887,7 @@ static void xfrm_policy_queue_process(unsigned long arg)struct sock *sk;struct dst_entry *dst;struct xfrm_policy *pol = (struct xfrm_policy *)arg; +struct net *net =xp_net (pol);struct xfrm_policy_queue *pq = &pol->polq;struct flowi fl;struct sk_buff_head list;
@@ -1903,8 +1904,7 @@ static void xfrm_policy_queue_process(unsigned long arg)spin_unlock (&pq->hold_queue.lock);dst_hold (dst->path); - dst =xfrm_lookup (xp_net (pol), dst->path, &fl, - sk,0 ); + dst =xfrm_lookup (net, dst->path, &fl, sk,0 );if (IS_ERR (dst)) goto purge_queue;
@@ -1934,8 +1934,7 @@ static void xfrm_policy_queue_process(unsigned long arg)xfrm_decode_session (skb, &fl,skb_dst (skb)->ops->family);dst_hold (skb_dst (skb)->path); - dst =xfrm_lookup (xp_net (pol),skb_dst (skb)->path, - &fl, skb->sk,0 ); + dst =xfrm_lookup (net,skb_dst (skb)->path, &fl, skb->sk,0 );if (IS_ERR (dst)) {kfree_skb (skb);continue ;
Signature · 1 line
2.2.1
PATCH 3/15 net: Pass net into dst_output and remove dst_output_okfn
In reply to Eric W. BiedermanReplace dst_output_okfn with dst_output
--- include/net/dst.h | 6 +----- net/decnet/dn_nsp_out.c | 4 ++-- net/ipv4/ip_forward.c | 2 +- net/ipv4/ip_output.c | 7 ++++--- net/ipv4/ip_vti.c | 2 +- net/ipv4/ipmr.c | 2 +- net/ipv4/raw.c | 2 +- net/ipv4/xfrm4_output.c | 2 +- net/ipv6/ip6_output.c | 4 ++-- net/ipv6/ip6_vti.c | 2 +- net/ipv6/ip6mr.c | 2 +- net/ipv6/mcast.c | 4 ++-- net/ipv6/ndisc.c | 2 +- net/ipv6/output_core.c | 5 +++-- net/ipv6/raw.c | 2 +- net/ipv6/xfrm6_output.c | 2 +- net/netfilter/ipvs/ip_vs_xmit.c | 4 ++-- net/xfrm/xfrm_output.c | 2 +- net/xfrm/xfrm_policy.c | 2 +- 19 files changed, 28 insertions(+), 30 deletions(-)
include/net/dst.h +1 -5
@@ -454,14 +454,10 @@ static inline void dst_set_expires(struct dst_entry *dst, int timeout) }/* Output packet to network from transport. */ -static inline int dst_output (struct sock *sk,struct sk_buff *skb) +static inline int dst_output (struct net *net,struct sock *sk,struct sk_buff *skb) {return skb_dst (skb)->output (sk, skb); } -static inline int dst_output_okfn (struct net *net,struct sock *sk,struct sk_buff *skb) -{ -return dst_output (sk, skb); -}/* Input packet from network to transport. */ static inline int dst_input (struct sk_buff *skb)
net/decnet/dn_nsp_out.c +2 -2
@@ -85,7 +85,7 @@ static void dn_nsp_send(struct sk_buff *skb)if (dst) { try_again:skb_dst_set (skb, dst); -dst_output (skb->sk, skb); +dst_output (&init_net, skb->sk, skb);return ; }
@@ -582,7 +582,7 @@ static __inline__ void dn_nsp_do_disc(struct sock *sk, unsigned char msgflg,* associations. */ skb_dst_set (skb,dst_clone (dst)); -dst_output (skb->sk, skb); +dst_output (&init_net, skb->sk, skb); }
net/ipv4/ip_forward.c +1 -1
@@ -72,7 +72,7 @@ static int ip_forward_finish(struct net *net, struct sock *sk, struct sk_buff *sip_forward_options (skb);skb_sender_cpu_clear (skb); -return dst_output (sk, skb); +return dst_output (net, sk, skb); }int ip_forward (struct sk_buff *skb)
net/ipv4/ip_output.c +4 -3
@@ -105,7 +105,7 @@ static int __ip_local_out_sk(struct sock *sk, struct sk_buff *skb)ip_send_check (iph);return nf_hook (NFPROTO_IPV4 ,NF_INET_LOCAL_OUT , net, sk, skb,NULL ,skb_dst (skb)->dev, - dst_output_okfn); + dst_output); }int __ip_local_out (struct sk_buff *skb)
@@ -115,11 +115,12 @@ int __ip_local_out(struct sk_buff *skb)int ip_local_out_sk (struct sock *sk,struct sk_buff *skb) { +struct net *net =dev_net (skb_dst (skb)->dev);int err; err =__ip_local_out_sk (sk, skb);if (likely (err ==1 )) - err =dst_output (sk, skb); + err =dst_output (net, sk, skb);return err; }
@@ -276,7 +277,7 @@ static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *sk/* Policy lookup after SNAT yielded a new policy */ if (skb_dst (skb)->xfrm) {IPCB (skb)->flags |=IPSKB_REROUTED ; -return dst_output (sk, skb); +return dst_output (net, sk, skb); }#endif mtu =ip_skb_dst_mtu (skb);
net/ipv4/ip_vti.c +1 -1
@@ -197,7 +197,7 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev,skb_dst_set (skb, dst); skb->dev =skb_dst (skb)->dev; - err =dst_output (skb->sk, skb); + err =dst_output (tunnel->net, skb->sk, skb);if (net_xmit_eval (err) ==0 ) err = skb->len;iptunnel_xmit_stats (err, &dev->stats, dev->tstats);
net/ipv4/ipmr.c +1 -1
@@ -1689,7 +1689,7 @@ static inline int ipmr_forward_finish(struct net *net, struct sock *sk,if (unlikely (opt->optlen))ip_forward_options (skb); -return dst_output (sk, skb); +return dst_output (net, sk, skb); }/*
net/ipv4/raw.c +1 -1
@@ -413,7 +413,7 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4, err =NF_HOOK (NFPROTO_IPV4 ,NF_INET_LOCAL_OUT , net, sk, skb,NULL , rt->dst.dev, - dst_output_okfn); + dst_output);if (err >0 ) err =net_xmit_errno (err);if (err)
net/ipv4/xfrm4_output.c +1 -1
@@ -87,7 +87,7 @@ static int __xfrm4_output(struct net *net, struct sock *sk, struct sk_buff *skb)#ifdef CONFIG_NETFILTER if (!x) {IPCB (skb)->flags |=IPSKB_REROUTED ; -return dst_output (sk, skb); +return dst_output (net, sk, skb); }#endif
net/ipv6/ip6_output.c +2 -2
@@ -233,7 +233,7 @@ int ip6_xmit(const struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,*/ return NF_HOOK (NFPROTO_IPV6 ,NF_INET_LOCAL_OUT , net, (struct sock *)sk, skb,NULL , dst->dev, - dst_output_okfn); + dst_output); } skb->dev = dst->dev;
@@ -333,7 +333,7 @@ static inline int ip6_forward_finish(struct net *net, struct sock *sk, struct sk_buff *skb) {skb_sender_cpu_clear (skb); -return dst_output (sk, skb); +return dst_output (net, sk, skb); }static unsigned int ip6_dst_mtu_forward (const struct dst_entry *dst)
net/ipv6/ip6_vti.c +1 -1
@@ -482,7 +482,7 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)return -EMSGSIZE ; } - err =dst_output (skb->sk, skb); + err =dst_output (t->net, skb->sk, skb);if (net_xmit_eval (err) ==0 ) {struct pcpu_sw_netstats *tstats =this_cpu_ptr (dev->tstats);
net/ipv6/ip6mr.c +1 -1
@@ -1991,7 +1991,7 @@ static inline int ip6mr_forward2_finish(struct net *net, struct sock *sk, struct IPSTATS_MIB_OUTFORWDATAGRAMS);IP6_ADD_STATS_BH (net,ip6_dst_idev (skb_dst (skb)),IPSTATS_MIB_OUTOCTETS , skb->len); -return dst_output (sk, skb); +return dst_output (net, sk, skb); }/*
net/ipv6/mcast.c +2 -2
@@ -1646,7 +1646,7 @@ static void mld_sendpack(struct sk_buff *skb) err =NF_HOOK (NFPROTO_IPV6 ,NF_INET_LOCAL_OUT , net, net->ipv6.igmp_sk, skb,NULL , skb->dev, - dst_output_okfn); + dst_output); out:if (!err) {ICMP6MSGOUT_INC_STATS (net, idev,ICMPV6_MLD2_REPORT );
@@ -2010,7 +2010,7 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)skb_dst_set (skb, dst); err =NF_HOOK (NFPROTO_IPV6 ,NF_INET_LOCAL_OUT , net, sk, skb,NULL , skb->dev, - dst_output_okfn); + dst_output); out:if (!err) {ICMP6MSGOUT_INC_STATS (net, idev, type);
net/ipv6/ndisc.c +1 -1
@@ -465,7 +465,7 @@ static void ndisc_send_skb(struct sk_buff *skb, err =NF_HOOK (NFPROTO_IPV6 ,NF_INET_LOCAL_OUT , net, sk, skb,NULL , dst->dev, - dst_output_okfn); + dst_output);if (!err) {ICMP6MSGOUT_INC_STATS (net, idev, type);ICMP6_INC_STATS (net, idev,ICMP6_MIB_OUTMSGS );
net/ipv6/output_core.c +3 -2
@@ -151,7 +151,7 @@ static int __ip6_local_out_sk(struct sock *sk, struct sk_buff *skb)return nf_hook (NFPROTO_IPV6 ,NF_INET_LOCAL_OUT , net, sk, skb,NULL ,skb_dst (skb)->dev, - dst_output_okfn); + dst_output); }int __ip6_local_out (struct sk_buff *skb)
@@ -162,11 +162,12 @@ EXPORT_SYMBOL_GPL(__ip6_local_out);int ip6_local_out_sk (struct sock *sk,struct sk_buff *skb) { +struct net *net =dev_net (skb_dst (skb)->dev);int err; err =__ip6_local_out_sk (sk, skb);if (likely (err ==1 )) - err =dst_output (sk, skb); + err =dst_output (net, sk, skb);return err; }
net/ipv6/raw.c +1 -1
@@ -655,7 +655,7 @@ static int rawv6_send_hdrinc(struct sock *sk, struct msghdr *msg, int length,IP6_UPD_PO_STATS (net, rt->rt6i_idev,IPSTATS_MIB_OUT , skb->len); err =NF_HOOK (NFPROTO_IPV6 ,NF_INET_LOCAL_OUT , net, sk, skb, -NULL , rt->dst.dev, dst_output_okfn); +NULL , rt->dst.dev, dst_output);if (err >0 ) err =net_xmit_errno (err);if (err)
net/ipv6/xfrm6_output.c +1 -1
@@ -147,7 +147,7 @@ static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)#ifdef CONFIG_NETFILTER if (!x) {IP6CB (skb)->flags |=IP6SKB_REROUTED ; -return dst_output (sk, skb); +return dst_output (net, sk, skb); }#endif
net/netfilter/ipvs/ip_vs_xmit.c +2 -2
@@ -576,7 +576,7 @@ static inline int ip_vs_nat_send_or_cont(int pf, struct sk_buff *skb,if (!skb->sk)skb_sender_cpu_clear (skb);NF_HOOK (pf,NF_INET_LOCAL_OUT , cp->ipvs->net,NULL , skb, -NULL ,skb_dst (skb)->dev, dst_output_okfn); +NULL ,skb_dst (skb)->dev, dst_output); }else ret =NF_ACCEPT ;
@@ -598,7 +598,7 @@ static inline int ip_vs_send_or_cont(int pf, struct sk_buff *skb,if (!skb->sk)skb_sender_cpu_clear (skb);NF_HOOK (pf,NF_INET_LOCAL_OUT , cp->ipvs->net,NULL , skb, -NULL ,skb_dst (skb)->dev, dst_output_okfn); +NULL ,skb_dst (skb)->dev, dst_output); }else ret =NF_ACCEPT ;return ret;
net/xfrm/xfrm_output.c +1 -1
@@ -141,7 +141,7 @@ int xfrm_output_resume(struct sk_buff *skb, int err) goto out;if (!skb_dst (skb)->xfrm) -return dst_output (skb->sk, skb); +return dst_output (net, skb->sk, skb); err = nf_hook(skb_dst(skb)->ops->family, NF_INET_POST_ROUTING, net, skb->sk, skb,
net/xfrm/xfrm_policy.c +1 -1
@@ -1944,7 +1944,7 @@ static void xfrm_policy_queue_process(unsigned long arg)skb_dst_drop (skb);skb_dst_set (skb, dst); -dst_output (skb->sk, skb); +dst_output (net, skb->sk, skb); } out:
Signature · 1 line
2.2.1
PATCH 4/15 dst: Pass a sk into .local_out
In reply to Eric W. BiedermanFor consistency with the other similar methods in the kernel pass a struct sock into the dst_ops .local_out method.
Simplifying the socket passing case is needed a prequel to passing a struct net reference into .local_out.
--- drivers/net/vrf.c | 4 ++-- include/net/dst_ops.h | 2 +- include/net/ip.h | 1 + include/net/ipv6.h | 1 + net/ipv4/ip_output.c | 2 +- net/ipv4/route.c | 2 +- net/ipv4/xfrm4_policy.c | 2 +- net/ipv6/output_core.c | 2 +- net/ipv6/route.c | 2 +- net/ipv6/xfrm6_policy.c | 2 +- net/xfrm/xfrm_output.c | 2 +- 11 files changed, 12 insertions(+), 10 deletions(-)
drivers/net/vrf.c +2 -2
@@ -73,9 +73,9 @@ static struct dst_entry *vrf_ip_check(struct dst_entry *dst, u32 cookie)return dst; } -static int vrf_ip_local_out (struct sk_buff *skb) +static int vrf_ip_local_out (struct sock *sk,struct sk_buff *skb) { -return ip_local_out (skb); +return ip_local_out_sk (sk, skb); }static unsigned int vrf_v4_mtu (const struct dst_entry *dst)
include/net/dst_ops.h +1 -1
@@ -28,7 +28,7 @@ struct dst_ops { struct sk_buff *skb, u32 mtu);void (*redirect)(struct dst_entry *dst,struct sock *sk,struct sk_buff *skb); -int (*local_out)(struct sk_buff *skb); +int (*local_out)(struct sock *sk,struct sk_buff *skb);struct neighbour * (*neigh_lookup)(const struct dst_entry *dst,struct sk_buff *skb,const void *daddr);
include/net/ip.h +1 -0
@@ -112,6 +112,7 @@ int ip_mc_output(struct sock *sk, struct sk_buff *skb);int ip_do_fragment (struct net *net,struct sock *sk,struct sk_buff *skb,int (*output)(struct net *,struct sock *,struct sk_buff *));void ip_send_check (struct iphdr *ip); +int __ip_local_out_sk (struct sock *sk,struct sk_buff *skb);int __ip_local_out (struct sk_buff *skb);int ip_local_out_sk (struct sock *sk,struct sk_buff *skb);static inline int ip_local_out (struct sk_buff *skb)
include/net/ipv6.h +1 -0
@@ -865,6 +865,7 @@ int ip6_forward(struct sk_buff *skb);int ip6_input (struct sk_buff *skb);int ip6_mc_input (struct sk_buff *skb); +int __ip6_local_out_sk (struct sock *sk,struct sk_buff *skb);int __ip6_local_out (struct sk_buff *skb);int ip6_local_out_sk (struct sock *sk,struct sk_buff *skb);int ip6_local_out (struct sk_buff *skb);
net/ipv4/ip_output.c +1 -1
@@ -96,7 +96,7 @@ void ip_send_check(struct iphdr *iph) }EXPORT_SYMBOL (ip_send_check); -static int __ip_local_out_sk (struct sock *sk,struct sk_buff *skb) +int __ip_local_out_sk (struct sock *sk,struct sk_buff *skb) {struct net *net =dev_net (skb_dst (skb)->dev);struct iphdr *iph =ip_hdr (skb);
net/ipv4/route.c +1 -1
@@ -165,7 +165,7 @@ static struct dst_ops ipv4_dst_ops = { .link_failure = ipv4_link_failure, .update_pmtu = ip_rt_update_pmtu, .redirect = ip_do_redirect, - .local_out = __ip_local_out, + .local_out = __ip_local_out_sk, .neigh_lookup = ipv4_neigh_lookup, };
net/ipv4/xfrm4_policy.c +1 -1
@@ -243,7 +243,7 @@ static struct dst_ops xfrm4_dst_ops = { .cow_metrics = dst_cow_metrics_generic, .destroy = xfrm4_dst_destroy, .ifdown = xfrm4_dst_ifdown, - .local_out = __ip_local_out, + .local_out = __ip_local_out_sk, .gc_thresh = 32768, };
net/ipv6/output_core.c +1 -1
@@ -138,7 +138,7 @@ int ip6_dst_hoplimit(struct dst_entry *dst)EXPORT_SYMBOL (ip6_dst_hoplimit);#endif -static int __ip6_local_out_sk (struct sock *sk,struct sk_buff *skb) +int __ip6_local_out_sk (struct sock *sk,struct sk_buff *skb) {struct net *net =dev_net (skb_dst (skb)->dev);int len;
net/ipv6/route.c +1 -1
@@ -226,7 +226,7 @@ static struct dst_ops ip6_dst_ops_template = { .link_failure = ip6_link_failure, .update_pmtu = ip6_rt_update_pmtu, .redirect = rt6_do_redirect, - .local_out = __ip6_local_out, + .local_out = __ip6_local_out_sk, .neigh_lookup = ip6_neigh_lookup, };
net/ipv6/xfrm6_policy.c +1 -1
@@ -284,7 +284,7 @@ static struct dst_ops xfrm6_dst_ops = { .cow_metrics = dst_cow_metrics_generic, .destroy = xfrm6_dst_destroy, .ifdown = xfrm6_dst_ifdown, - .local_out = __ip6_local_out, + .local_out = __ip6_local_out_sk, .gc_thresh = 32768, };
net/xfrm/xfrm_output.c +1 -1
@@ -136,7 +136,7 @@ int xfrm_output_resume(struct sk_buff *skb, int err)while (likely ((err =xfrm_output_one (skb, err)) ==0 )) {nf_reset (skb); - err =skb_dst (skb)->ops->local_out (skb); + err =skb_dst (skb)->ops->local_out (skb->sk, skb);if (unlikely (err !=1 )) goto out;
Signature · 1 line
2.2.1
PATCH 5/15 ipv4: Merge __ip_local_out and __ip_local_out_sk
In reply to Eric W. Biederman--- include/net/ip.h | 3 +-- net/ipv4/ip_output.c | 9 ++------- net/ipv4/route.c | 2 +- net/ipv4/xfrm4_policy.c | 2 +- 4 files changed, 5 insertions(+), 11 deletions(-)
include/net/ip.h +1 -2
@@ -112,8 +112,7 @@ int ip_mc_output(struct sock *sk, struct sk_buff *skb);int ip_do_fragment (struct net *net,struct sock *sk,struct sk_buff *skb,int (*output)(struct net *,struct sock *,struct sk_buff *));void ip_send_check (struct iphdr *ip); -int __ip_local_out_sk (struct sock *sk,struct sk_buff *skb); -int __ip_local_out (struct sk_buff *skb); +int __ip_local_out (struct sock *sk,struct sk_buff *skb);int ip_local_out_sk (struct sock *sk,struct sk_buff *skb);static inline int ip_local_out (struct sk_buff *skb) {
net/ipv4/ip_output.c +2 -7
@@ -96,7 +96,7 @@ void ip_send_check(struct iphdr *iph) }EXPORT_SYMBOL (ip_send_check); -int __ip_local_out_sk (struct sock *sk,struct sk_buff *skb) +int __ip_local_out (struct sock *sk,struct sk_buff *skb) {struct net *net =dev_net (skb_dst (skb)->dev);struct iphdr *iph =ip_hdr (skb);
@@ -108,17 +108,12 @@ int __ip_local_out_sk(struct sock *sk, struct sk_buff *skb) dst_output); } -int __ip_local_out (struct sk_buff *skb) -{ -return __ip_local_out_sk (skb->sk, skb); -} -int ip_local_out_sk (struct sock *sk,struct sk_buff *skb) {struct net *net =dev_net (skb_dst (skb)->dev);int err; - err =__ip_local_out_sk (sk, skb); + err =__ip_local_out (sk, skb);if (likely (err ==1 )) err =dst_output (net, sk, skb);
net/ipv4/route.c +1 -1
@@ -165,7 +165,7 @@ static struct dst_ops ipv4_dst_ops = { .link_failure = ipv4_link_failure, .update_pmtu = ip_rt_update_pmtu, .redirect = ip_do_redirect, - .local_out = __ip_local_out_sk, + .local_out = __ip_local_out, .neigh_lookup = ipv4_neigh_lookup, };
net/ipv4/xfrm4_policy.c +1 -1
@@ -243,7 +243,7 @@ static struct dst_ops xfrm4_dst_ops = { .cow_metrics = dst_cow_metrics_generic, .destroy = xfrm4_dst_destroy, .ifdown = xfrm4_dst_ifdown, - .local_out = __ip_local_out_sk, + .local_out = __ip_local_out, .gc_thresh = 32768, };
Signature · 1 line
2.2.1
PATCH 6/15 ipv4: Merge ip_local_out and ip_local_out_sk
In reply to Eric W. BiedermanIt is confusing and silly hiding a paramater so modify all of the callers to pass in the appropriate socket or skb->sk if no socket is known.
--- drivers/net/ipvlan/ipvlan_core.c | 2 +- drivers/net/ppp/pptp.c | 2 +- drivers/net/vrf.c | 4 ++-- include/net/ip.h | 6 +----- net/ipv4/igmp.c | 4 ++-- net/ipv4/ip_output.c | 10 +++++----- net/ipv4/ip_tunnel_core.c | 2 +- net/ipv4/netfilter/ipt_SYNPROXY.c | 2 +- net/ipv4/netfilter/nf_dup_ipv4.c | 2 +- net/ipv4/netfilter/nf_reject_ipv4.c | 2 +- net/netfilter/ipvs/ip_vs_xmit.c | 2 +- 11 files changed, 17 insertions(+), 21 deletions(-)
drivers/net/ipvlan/ipvlan_core.c +1 -1
@@ -364,7 +364,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb) }skb_dst_drop (skb);skb_dst_set (skb, &rt->dst); - err =ip_local_out (skb); + err =ip_local_out (skb->sk, skb);if (unlikely (net_xmit_eval (err))) dev->stats.tx_errors++;else
drivers/net/ppp/pptp.c +1 -1
@@ -282,7 +282,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)ip_select_ident (sock_net (sk), skb,NULL );ip_send_check (iph); -ip_local_out (skb); +ip_local_out (skb->sk, skb);return 1 ; tx_error:
drivers/net/vrf.c +2 -2
@@ -75,7 +75,7 @@ static struct dst_entry *vrf_ip_check(struct dst_entry *dst, u32 cookie)static int vrf_ip_local_out (struct sock *sk,struct sk_buff *skb) { -return ip_local_out_sk (sk, skb); +return ip_local_out (sk, skb); }static unsigned int vrf_v4_mtu (const struct dst_entry *dst)
@@ -221,7 +221,7 @@ static netdev_tx_t vrf_process_v4_outbound(struct sk_buff *skb, RT_SCOPE_LINK); } - ret =ip_local_out (skb); + ret =ip_local_out (skb->sk, skb);if (unlikely (net_xmit_eval (ret))) vrf_dev->stats.tx_errors++;else
include/net/ip.h +1 -5
@@ -113,11 +113,7 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, int (*output)(struct net *, struct sock *, struct sk_buff *));void ip_send_check (struct iphdr *ip);int __ip_local_out (struct sock *sk,struct sk_buff *skb); -int ip_local_out_sk (struct sock *sk,struct sk_buff *skb); -static inline int ip_local_out (struct sk_buff *skb) -{ -return ip_local_out_sk (skb->sk, skb); -} +int ip_local_out (struct sock *sk,struct sk_buff *skb);int ip_queue_xmit (struct sock *sk,struct sk_buff *skb,struct flowi *fl);void ip_init (void );
net/ipv4/igmp.c +2 -2
@@ -397,7 +397,7 @@ static int igmpv3_sendpack(struct sk_buff *skb) pig->csum =ip_compute_csum (igmp_hdr (skb), igmplen); -return ip_local_out (skb); +return ip_local_out (skb->sk, skb); }static int grec_size (struct ip_mc_list *pmc,int type,int gdel,int sdel)
@@ -739,7 +739,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc, ih->group = group; ih->csum =ip_compute_csum ((void *)ih,sizeof (struct igmphdr )); -return ip_local_out (skb); +return ip_local_out (skb->sk, skb); }static void igmp_gq_timer_expire (unsigned long data)
net/ipv4/ip_output.c +5 -5
@@ -108,7 +108,7 @@ int __ip_local_out(struct sock *sk, struct sk_buff *skb) dst_output); } -int ip_local_out_sk (struct sock *sk,struct sk_buff *skb) +int ip_local_out (struct sock *sk,struct sk_buff *skb) {struct net *net =dev_net (skb_dst (skb)->dev);int err;
@@ -119,7 +119,7 @@ int ip_local_out_sk(struct sock *sk, struct sk_buff *skb)return err; } -EXPORT_SYMBOL_GPL (ip_local_out_sk); +EXPORT_SYMBOL_GPL (ip_local_out);static inline int ip_select_ttl (struct inet_sock *inet,struct dst_entry *dst) {
@@ -169,7 +169,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, skb->mark = sk->sk_mark;/* Send it out. */ -return ip_local_out (skb); +return ip_local_out (skb->sk, skb); }EXPORT_SYMBOL_GPL (ip_build_and_send_pkt);
@@ -456,7 +456,7 @@ packet_routed: skb->priority = sk->sk_priority; skb->mark = sk->sk_mark; - res =ip_local_out (skb); + res =ip_local_out (sk, skb);rcu_read_unlock ();return res;
@@ -1436,7 +1436,7 @@ int ip_send_skb(struct net *net, struct sk_buff *skb) {int err; - err =ip_local_out (skb); + err =ip_local_out (skb->sk, skb);if (err) {if (err >0 ) err =net_xmit_errno (err);
net/ipv4/ip_tunnel_core.c +1 -1
@@ -79,7 +79,7 @@ int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,__ip_select_ident (dev_net (rt->dst.dev), iph,skb_shinfo (skb)->gso_segs ?:1 ); - err =ip_local_out_sk (sk, skb); + err =ip_local_out (sk, skb);if (unlikely (net_xmit_eval (err))) pkt_len =0 ;return pkt_len;
net/ipv4/netfilter/ipt_SYNPROXY.c +1 -1
@@ -63,7 +63,7 @@ synproxy_send_tcp(const struct synproxy_net *snet,nf_conntrack_get (nfct); } -ip_local_out (nskb); +ip_local_out (nskb->sk, nskb);return ; free_nskb:
net/ipv4/netfilter/nf_dup_ipv4.c +1 -1
@@ -92,7 +92,7 @@ void nf_dup_ipv4(struct net *net, struct sk_buff *skb, unsigned int hooknum,if (nf_dup_ipv4_route (net, skb, gw, oif)) {__this_cpu_write (nf_skb_duplicated, true); -ip_local_out (skb); +ip_local_out (skb->sk, skb);__this_cpu_write (nf_skb_duplicated, false); }else {kfree_skb (skb);
net/ipv4/netfilter/nf_reject_ipv4.c +1 -1
@@ -157,7 +157,7 @@ void nf_send_reset(struct net *net, struct sk_buff *oldskb, int hook)dev_queue_xmit (nskb); } else#endif -ip_local_out (nskb); +ip_local_out (nskb->sk, nskb);return ;
net/netfilter/ipvs/ip_vs_xmit.c +1 -1
@@ -1049,7 +1049,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, ret =ip_vs_tunnel_xmit_prepare (skb, cp);if (ret ==NF_ACCEPT ) -ip_local_out (skb); +ip_local_out (skb->sk, skb);else if (ret ==NF_DROP )kfree_skb (skb);rcu_read_unlock ();
Signature · 1 line
2.2.1
Re: [PATCH net-next 06/15] ipv4: Merge ip_local_out and ip_local_out_sk
Le 06/10/2015 20:53, Eric W. Biederman a écrit :
Quoted 6 lines
It is confusing and silly hiding a paramater so modify all of the callers to pass in the appropriate socket or
skb->skif no socket is known.Signed-off-by "Eric W. Biederman" <[email protected]>---
[snip]
net/ipv4/ip_output.c packet_routed: · line 459
Quoted 6 lines
net/ipv4/ip_output.c +1
-1@@ -456,7 +456,7 @@ packet_routed: skb->priority = sk->sk_priority; skb->mark = sk->sk_mark; - res =ip_local_out (skb); + res =ip_local_out (sk, skb);
As stated in the comment at the top of this function (ip_queue_xmit()), skb->sk can be different from sk. See also commit b0270e91014d ("ipv4: add a sock pointer to ip_queue_xmit()").
Not sure if this change is right.
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH net-next 06/15] ipv4: Merge ip_local_out and ip_local_out_sk
Quoted 12 lines · Nicolas Dichtel
Le 06/10/2015 20:53, Eric W. Biederman a écrit :
Quoted 6 lines
It is confusing and silly hiding a paramater so modify all of the callers to pass in the appropriate socket or
skb->skif no socket is known.Signed-off-by "Eric W. Biederman" <[email protected]>---
[snip]
Quoted 4 lines
net/ipv4/ip_output.c +0
-0@@ -456,7 +456,7 @@ packet_routed: skb->priority = sk->sk_priority; skb->mark = sk->sk_mark;
Quoted 6 lines
net/ipv4/ip_output.c packet_routed: · line 459
Quoted 2 lines
net/ipv4/ip_output.c +1
-1- res =ip_local_out (skb); + res =ip_local_out (sk, skb);As stated in the comment at the top of this function (
ip_queue_xmit()),skb->skcan be different from sk. See also commitb0270e91014d("ipv4: add a sock pointer toip_queue_xmit()").
Not sure if this change is right.
Good catch. This change should not have been buried in this patch. It needs to be it's own separate bug fix.
As I read the code we actually do want to pass sk not skb->sk into ip_local_out. For all of the reasons that sk is potentially different from skb->sk already.
The way I understand this is we have pushed an sk parameter through the output path so that sk_mc_loop(sk) can be called with the tunnel's socket not whatever is on skb->sk. This allows for looking to see if local multicast loopback is configured on the tunnels socket not on the originating socket of the packet.
I am going to respin my series with that change made into a separate bug fix, that can potentially be backported.
Eric
Re: [PATCH net-next 06/15] ipv4: Merge ip_local_out and ip_local_out_sk
Quoted 28 lines · Eric W. Biederman
Quoted 12 lines · Nicolas Dichtel
Quoted 6 lines · Eric W. Biederman
It is confusing and silly hiding a paramater so modify all of the callers to pass in the appropriate socket or
skb->skif no socket is known.Signed-off-by "Eric W. Biederman" <[email protected]>---
[snip]
Quoted 4 lines
net/ipv4/ip_output.c +0
-0@@ -456,7 +456,7 @@ packet_routed: skb->priority = sk->sk_priority; skb->mark = sk->sk_mark;Quoted 6 lines
net/ipv4/ip_output.c packet_routed: · line 459
Quoted 2 lines
net/ipv4/ip_output.c +1
-1- res =ip_local_out (skb); + res =ip_local_out (sk, skb);As stated in the comment at the top of this function (
ip_queue_xmit()),skb->skcan be different from sk. See also commitb0270e91014d("ipv4: add a sock pointer toip_queue_xmit()").
Not sure if this change is right.Good catch. This change should not have been buried in this patch. It needs to be it's own separate bug fix.
As I read the code we actually do want to pass sk not
skb->skintoip_local_out. For all of the reasons that sk is potentially different fromskb->skalready.
Quoted 5 lines
The way I understand this is we have pushed an sk parameter through the output path so that
sk_mc_loop(sk)can be called with the tunnel's socket not whatever is onskb->sk. This allows for looking to see if local multicast loopback is configured on the tunnels socket not on the originating socket of the packet.
Ok, thank you for the explanation.
PATCH 7/15 ipv6: Merge __ip6_local_out and __ip6_local_out_sk
In reply to Eric W. BiedermanOnly __ip6_local_out_sk has callers so rename __ip6_local_out_sk __ip6_local_out and remove the previous __ip6_local_out.
--- include/net/ipv6.h | 3 +-- net/ipv6/output_core.c | 9 ++------- net/ipv6/route.c | 2 +- net/ipv6/xfrm6_policy.c | 2 +- 4 files changed, 5 insertions(+), 11 deletions(-)
include/net/ipv6.h +1 -2
@@ -865,8 +865,7 @@ int ip6_forward(struct sk_buff *skb);int ip6_input (struct sk_buff *skb);int ip6_mc_input (struct sk_buff *skb); -int __ip6_local_out_sk (struct sock *sk,struct sk_buff *skb); -int __ip6_local_out (struct sk_buff *skb); +int __ip6_local_out (struct sock *sk,struct sk_buff *skb);int ip6_local_out_sk (struct sock *sk,struct sk_buff *skb);int ip6_local_out (struct sk_buff *skb);
net/ipv6/output_core.c +2 -7
@@ -138,7 +138,7 @@ int ip6_dst_hoplimit(struct dst_entry *dst)EXPORT_SYMBOL (ip6_dst_hoplimit);#endif -int __ip6_local_out_sk (struct sock *sk,struct sk_buff *skb) +int __ip6_local_out (struct sock *sk,struct sk_buff *skb) {struct net *net =dev_net (skb_dst (skb)->dev);int len;
@@ -153,11 +153,6 @@ int __ip6_local_out_sk(struct sock *sk, struct sk_buff *skb) net, sk, skb,NULL ,skb_dst (skb)->dev, dst_output); } - -int __ip6_local_out (struct sk_buff *skb) -{ -return __ip6_local_out_sk (skb->sk, skb); -}EXPORT_SYMBOL_GPL (__ip6_local_out);int ip6_local_out_sk (struct sock *sk,struct sk_buff *skb)
@@ -165,7 +160,7 @@ int ip6_local_out_sk(struct sock *sk, struct sk_buff *skb)struct net *net =dev_net (skb_dst (skb)->dev);int err; - err =__ip6_local_out_sk (sk, skb); + err =__ip6_local_out (sk, skb);if (likely (err ==1 )) err =dst_output (net, sk, skb);
net/ipv6/route.c +1 -1
@@ -226,7 +226,7 @@ static struct dst_ops ip6_dst_ops_template = { .link_failure = ip6_link_failure, .update_pmtu = ip6_rt_update_pmtu, .redirect = rt6_do_redirect, - .local_out = __ip6_local_out_sk, + .local_out = __ip6_local_out, .neigh_lookup = ip6_neigh_lookup, };
net/ipv6/xfrm6_policy.c +1 -1
@@ -284,7 +284,7 @@ static struct dst_ops xfrm6_dst_ops = { .cow_metrics = dst_cow_metrics_generic, .destroy = xfrm6_dst_destroy, .ifdown = xfrm6_dst_ifdown, - .local_out = __ip6_local_out_sk, + .local_out = __ip6_local_out, .gc_thresh = 32768, };
Signature · 1 line
2.2.1
PATCH 8/15 ipv6: Merge ip6_local_out and ip6_local_out_sk
In reply to Eric W. BiedermanStop hidding the sk paramater with an inline helper function and make all of the callers pass it, so that it is clear what the function is doing.
--- drivers/net/ipvlan/ipvlan_core.c | 2 +- include/net/ip6_tunnel.h | 2 +- include/net/ipv6.h | 3 +-- net/ipv6/ip6_output.c | 2 +- net/ipv6/netfilter/ip6t_SYNPROXY.c | 2 +- net/ipv6/netfilter/nf_dup_ipv6.c | 2 +- net/ipv6/netfilter/nf_reject_ipv6.c | 2 +- net/ipv6/output_core.c | 8 +------- net/netfilter/ipvs/ip_vs_xmit.c | 2 +- 9 files changed, 9 insertions(+), 16 deletions(-)
drivers/net/ipvlan/ipvlan_core.c +1 -1
@@ -401,7 +401,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) }skb_dst_drop (skb);skb_dst_set (skb, dst); - err =ip6_local_out (skb); + err =ip6_local_out (skb->sk, skb);if (unlikely (net_xmit_eval (err))) dev->stats.tx_errors++;else
include/net/ip6_tunnel.h +1 -1
@@ -87,7 +87,7 @@ static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb,int pkt_len, err; pkt_len = skb->len -skb_inner_network_offset (skb); - err =ip6_local_out_sk (sk, skb); + err =ip6_local_out (sk, skb);if (net_xmit_eval (err) ==0 ) {struct pcpu_sw_netstats *tstats =this_cpu_ptr (dev->tstats);
include/net/ipv6.h +1 -2
@@ -866,8 +866,7 @@ int ip6_input(struct sk_buff *skb);int ip6_mc_input (struct sk_buff *skb);int __ip6_local_out (struct sock *sk,struct sk_buff *skb); -int ip6_local_out_sk (struct sock *sk,struct sk_buff *skb); -int ip6_local_out (struct sk_buff *skb); +int ip6_local_out (struct sock *sk,struct sk_buff *skb);/* * Extension header (options) processing
net/ipv6/ip6_output.c +1 -1
@@ -1692,7 +1692,7 @@ int ip6_send_skb(struct sk_buff *skb)struct rt6_info *rt = (struct rt6_info *)skb_dst (skb);int err; - err =ip6_local_out (skb); + err =ip6_local_out (skb->sk, skb);if (err) {if (err >0 ) err =net_xmit_errno (err);
net/ipv6/netfilter/ip6t_SYNPROXY.c +1 -1
@@ -76,7 +76,7 @@ synproxy_send_tcp(const struct synproxy_net *snet,nf_conntrack_get (nfct); } -ip6_local_out (nskb); +ip6_local_out (nskb->sk, nskb);return ; free_nskb:
net/ipv6/netfilter/nf_dup_ipv6.c +1 -1
@@ -68,7 +68,7 @@ void nf_dup_ipv6(struct net *net, struct sk_buff *skb, unsigned int hooknum, }if (nf_dup_ipv6_route (net, skb, gw, oif)) {__this_cpu_write (nf_skb_duplicated, true); -ip6_local_out (skb); +ip6_local_out (skb->sk, skb);__this_cpu_write (nf_skb_duplicated, false); }else {kfree_skb (skb);
net/ipv6/netfilter/nf_reject_ipv6.c +1 -1
@@ -206,7 +206,7 @@ void nf_send_reset6(struct net *net, struct sk_buff *oldskb, int hook) dev_queue_xmit(nskb); } else#endif -ip6_local_out (nskb); +ip6_local_out (nskb->sk, nskb); }EXPORT_SYMBOL_GPL (nf_send_reset6);
net/ipv6/output_core.c +1 -7
@@ -155,7 +155,7 @@ int __ip6_local_out(struct sock *sk, struct sk_buff *skb) }EXPORT_SYMBOL_GPL (__ip6_local_out); -int ip6_local_out_sk (struct sock *sk,struct sk_buff *skb) +int ip6_local_out (struct sock *sk,struct sk_buff *skb) {struct net *net =dev_net (skb_dst (skb)->dev);int err;
@@ -166,10 +166,4 @@ int ip6_local_out_sk(struct sock *sk, struct sk_buff *skb)return err; } -EXPORT_SYMBOL_GPL (ip6_local_out_sk); - -int ip6_local_out (struct sk_buff *skb) -{ -return ip6_local_out_sk (skb->sk, skb); -}EXPORT_SYMBOL_GPL (ip6_local_out);
net/netfilter/ipvs/ip_vs_xmit.c +1 -1
@@ -1141,7 +1141,7 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, ret =ip_vs_tunnel_xmit_prepare (skb, cp);if (ret ==NF_ACCEPT ) -ip6_local_out (skb); +ip6_local_out (skb->sk, skb);else if (ret ==NF_DROP )kfree_skb (skb);rcu_read_unlock ();
Signature · 1 line
2.2.1
PATCH 9/15 ipv4: Cache net in iptunnel_xmit
In reply to Eric W. BiedermanStore net in a variable in ip_tunnel_xmit so it does not need to be recomputed when it is used again.
--- net/ipv4/ip_tunnel_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv4/ip_tunnel_core.c +2 -2
@@ -53,6 +53,7 @@ int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, __u8 tos, __u8 ttl, __be16 df, bool xnet) { int pkt_len = skb->len - skb_inner_network_offset(skb); +struct net *net =dev_net (rt->dst.dev);struct iphdr *iph;int err;
@@ -76,8 +77,7 @@ int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, iph->daddr = dst; iph->saddr = src; iph->ttl = ttl; -__ip_select_ident (dev_net (rt->dst.dev), iph, -skb_shinfo (skb)->gso_segs ?:1 ); +__ip_select_ident (net, iph,skb_shinfo (skb)->gso_segs ?:1 ); err =ip_local_out (sk, skb);if (unlikely (net_xmit_eval (err)))
Signature · 1 line
2.2.1
PATCH 10/15 ipv4: Cache net in ip_build_and_send_pkt and ip_queue_xmit
In reply to Eric W. BiedermanCompute net and store it in a variable in the functions ip_build_and_send_pkt and ip_queue_xmit so that it does not need to be recomputed next time it is needed.
--- net/ipv4/ip_output.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
net/ipv4/ip_output.c +6 -4
@@ -139,6 +139,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, {struct inet_sock *inet =inet_sk (sk);struct rtable *rt =skb_rtable (skb); +struct net *net =sock_net (sk);struct iphdr *iph;/* Build the IP header. */
@@ -157,7 +158,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, iph->id =0 ; }else { iph->frag_off =0 ; -__ip_select_ident (sock_net (sk), iph,1 ); +__ip_select_ident (net, iph,1 ); }if (opt && opt->opt.optlen) {
@@ -382,6 +383,7 @@ static void ip_copy_addrs(struct iphdr *iph, const struct flowi4 *fl4)int ip_queue_xmit (struct sock *sk,struct sk_buff *skb,struct flowi *fl) {struct inet_sock *inet =inet_sk (sk); +struct net *net =sock_net (sk);struct ip_options_rcu *inet_opt;struct flowi4 *fl4;struct rtable *rt;
@@ -412,7 +414,7 @@ int ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl)* keep trying until route appears or the connection times * itself out. */ - rt = ip_route_output_ports(sock_net(sk), fl4, sk, + rt = ip_route_output_ports(net, fl4, sk, daddr, inet->inet_saddr, inet->inet_dport, inet->inet_sport,
@@ -449,7 +451,7 @@ packet_routed:ip_options_build (skb, &inet_opt->opt, inet->inet_daddr, rt,0 ); } -ip_select_ident_segs (sock_net (sk), skb, sk, +ip_select_ident_segs (net, skb, sk,skb_shinfo (skb)->gso_segs ?:1 );/* TODO : should we use skb->sk here instead of sk ? */
@@ -462,7 +464,7 @@ packet_routed: no_route:rcu_read_unlock (); -IP_INC_STATS (sock_net (sk),IPSTATS_MIB_OUTNOROUTES ); +IP_INC_STATS (net,IPSTATS_MIB_OUTNOROUTES );kfree_skb (skb);return -EHOSTUNREACH ; }
Signature · 1 line
2.2.1
Re: [PATCH net-next 10/15] ipv4: Cache net in ip_build_and_send_pkt and ip_queue_xmit
Quoted 22 lines · Eric W. Biederman
Compute net and store it in a variable in the functions
ip_build_and_send_pktandip_queue_xmitso that it does not need to be recomputed next time it is needed.Signed-off-by "Eric W. Biederman" <[email protected]>--- net/ipv4/ip_output.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)net/ipv4/ip_output.c +1
-0@@ -139,6 +139,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, {struct inet_sock *inet =inet_sk (sk);struct rtable *rt =skb_rtable (skb); +struct net *net =sock_net (sk);struct iphdr *iph;/* Build the IP header. */
net/ipv4/ip_output.c int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, · line 163
Quoted 7 lines
net/ipv4/ip_output.c +1
-1@@ -157,7 +158,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, iph->id =0 ; }else { iph->frag_off =0 ; -__ip_select_ident (sock_net (sk), iph,1 ); +__ip_select_ident (net, iph,1 ); }
Note that under normal SYNACK processing, we do not read sock_net(sk) here.
This patch would slow down the SYNACK path under stress, unless compiler is smart enough to not care of what you wrote.
Generally speaking, I do not see why storing 'struct net' pointer into a variable in the stack is very different from sk->sk_net access (sk being a register in most cases)
Note that I am about to submit following patch, so that you understand the context : the listener socket is cold in cpu cache at the time we transmit a SYNACK. It is better to get net from the request_sock which is very hot at this point.
net/ipv4/tcp_output.c +6 -4
@@ -3026,7 +3026,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst, th->window =htons (min (req->rcv_wnd,65535U ));tcp_options_write ((__be32 *)(th +1 ),NULL , &opts); th->doff = (tcp_header_size >>2 ); -TCP_INC_STATS_BH (sock_net (sk),TCP_MIB_OUTSEGS ); +TCP_INC_STATS_BH (sock_net (req_to_sk (req)),TCP_MIB_OUTSEGS );#ifdef CONFIG_TCP_MD5SIG /* Okay, we have all we need - do the md5 hash if needed */
@@ -3519,9 +3519,11 @@ int tcp_rtx_synack(const struct sock *sk, struct request_sock *req)tcp_rsk (req)->txhash =net_tx_rndhash (); res = af_ops->send_synack (sk,NULL , &fl, req,0 ,NULL , true); -if (!res) { -TCP_INC_STATS_BH (sock_net (sk),TCP_MIB_RETRANSSEGS ); -NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_TCPSYNRETRANS ); +if (likely (!res)) { +struct net *net =sock_net (req_to_sk (req)); + +TCP_INC_STATS_BH (net,TCP_MIB_RETRANSSEGS ); +NET_INC_STATS_BH (net,LINUX_MIB_TCPSYNRETRANS ); }return res; }
Re: [PATCH net-next 10/15] ipv4: Cache net in ip_build_and_send_pkt and ip_queue_xmit
Quoted 37 lines · Eric Dumazet
Quoted 22 lines · Eric W. Biederman
Compute net and store it in a variable in the functions
ip_build_and_send_pktandip_queue_xmitso that it does not need to be recomputed next time it is needed.Signed-off-by "Eric W. Biederman" <[email protected]>--- net/ipv4/ip_output.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)net/ipv4/ip_output.c +1
-0@@ -139,6 +139,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, {struct inet_sock *inet =inet_sk (sk);struct rtable *rt =skb_rtable (skb); +struct net *net =sock_net (sk);struct iphdr *iph;/* Build the IP header. */ net/ipv4/ip_output.c int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, · line 163
Quoted 7 lines
net/ipv4/ip_output.c +1
-1@@ -157,7 +158,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, iph->id =0 ; }else { iph->frag_off =0 ; -__ip_select_ident (sock_net (sk), iph,1 ); +__ip_select_ident (net, iph,1 ); }Note that under normal SYNACK processing, we do not read
sock_net(sk)here.This patch would slow down the SYNACK path under stress, unless compiler is smart enough to not care of what you wrote.
Quoted 8 lines
Generally speaking, I do not see why storing 'struct net' pointer into a variable in the stack is very different from
sk->sk_netaccess (sk being a register in most cases)Note that I am about to submit following patch, so that you understand the context : the listener socket is cold in cpu cache at the time we transmit a SYNACK. It is better to get net from the
request_sockwhich is very hot at this point.
So what I am really reading it for is ip_local_out which I change to take a struct net a few patches later in the series. The patches that changes everything is noticably cleaner and easier to review with these couple of patches pulling struct net into it's own variable ahead of time, and ip_build_and_send_pkt does call ip_local_out unconditionally.
I am in the process of figuring out how to compute net once in the output path and just passing it through so I don't need to compute net from dst->dev. As when the dust settles I hope to allow for a dst->dev in another network namespace. So that routes with a destination device in another network namespace will allow for something simpler and faster than ipvlan that achieves a very similar effect.
In this case to achieve what you are looking for, for cache line friendliness I believe we would need to pass net in from tcp_v4_send_synack, and it's cousins in dccp.
skc_net does seem firmly in the first cache line of sockets so it does look like any of the the reads to inet_sock that we do perform would hit the same cache line.
To recap. I store net in a variable because I start using it unconditionally a few patches later. The only way I can see to avoid hitting the cold cache line is to pass net into ip_build_and_send_pkt.
Do you think passing net into ip_build_and_send_pkt is the sensible way to address your performance concern? Or do you have issues with my passing of net through the output path?
Quoted 28 lines
net/ipv4/tcp_output.c +6
-4@@ -3026,7 +3026,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst, th->window =htons (min (req->rcv_wnd,65535U ));tcp_options_write ((__be32 *)(th +1 ),NULL , &opts); th->doff = (tcp_header_size >>2 ); -TCP_INC_STATS_BH (sock_net (sk),TCP_MIB_OUTSEGS ); +TCP_INC_STATS_BH (sock_net (req_to_sk (req)),TCP_MIB_OUTSEGS );#ifdef CONFIG_TCP_MD5SIG /* Okay, we have all we need - do the md5 hash if needed */ @@ -3519,9 +3519,11 @@ int tcp_rtx_synack(const struct sock *sk, struct request_sock *req)tcp_rsk (req)->txhash =net_tx_rndhash (); res = af_ops->send_synack (sk,NULL , &fl, req,0 ,NULL , true); -if (!res) { -TCP_INC_STATS_BH (sock_net (sk),TCP_MIB_RETRANSSEGS ); -NET_INC_STATS_BH (sock_net (sk),LINUX_MIB_TCPSYNRETRANS ); +if (likely (!res)) { +struct net *net =sock_net (req_to_sk (req)); + +TCP_INC_STATS_BH (net,TCP_MIB_RETRANSSEGS ); +NET_INC_STATS_BH (net,LINUX_MIB_TCPSYNRETRANS ); }return res; }
Re: [PATCH net-next 10/15] ipv4: Cache net in ip_build_and_send_pkt and ip_queue_xmit
Quoted 13 lines · Eric W. Biederman
So what I am really reading it for is
ip_local_outwhich I change to take a struct net a few patches later in the series. The patches that changes everything is noticably cleaner and easier to review with these couple of patches pulling struct net into it's own variable ahead of time, andip_build_and_send_pktdoes callip_local_outunconditionally.I am in the process of figuring out how to compute net once in the output path and just passing it through so I don't need to compute net from
dst->dev. As when the dust settles I hope to allow for adst->devin another network namespace. So that routes with a destination device in another network namespace will allow for something simpler and faster than ipvlan that achieves a very similar effect.
Quoted 3 lines
In this case to achieve what you are looking for, for cache line friendliness I believe we would need to pass net in from
tcp_v4_send_synack, and it's cousins in dccp.
Yes, something that can be done later.
Quoted 5 lines
skc_netdoes seem firmly in the first cache line of sockets so it does look like any of the the reads toinet_sockthat we do perform would hit the same cache line.
Quoted 7 lines
To recap. I store net in a variable because I start using it unconditionally a few patches later. The only way I can see to avoid hitting the cold cache line is to pass net into
ip_build_and_send_pkt.Do you think passing net into
ip_build_and_send_pktis the sensible way to address your performance concern? Or do you have issues with my passing of net through the output path?
I have no issues, but was pointing out this particular path, that might be optimized later, no worries.
Thanks.
PATCH 11/15 ppp: Cache net in pptp_xmit
In reply to Eric W. BiedermanCompute net and store it in a variable in pptp_xmit, so that the value can be reused the next time it is needed.
--- drivers/net/ppp/pptp.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ppp/pptp.c +3 -2
@@ -169,6 +169,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb) {struct sock *sk = (struct sock *) chan->private;struct pppox_sock *po =pppox_sk (sk); +struct net *net =sock_net (sk);struct pptp_opt *opt = &po->proto.pptp;struct pptp_gre_header *hdr;unsigned int header_len =sizeof (*hdr);
@@ -187,7 +188,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)if (sk_pppox (po)->sk_state &PPPOX_DEAD ) goto tx_error; - rt = ip_route_output_ports(sock_net(sk), &fl4, NULL, + rt = ip_route_output_ports(net, &fl4, NULL, opt->dst_addr.sin_addr.s_addr, opt->src_addr.sin_addr.s_addr, 0, 0, IPPROTO_GRE,
@@ -279,7 +280,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)nf_reset (skb); skb->ip_summed =CHECKSUM_NONE ; -ip_select_ident (sock_net (sk), skb,NULL ); +ip_select_ident (net, skb,NULL );ip_send_check (iph);ip_local_out (skb->sk, skb);
Signature · 1 line
2.2.1
PATCH 12/15 ipvlan: Cache net in ipvlan_process_v4_outbound and ipvlan_process_v6_outbound
In reply to Eric W. BiedermanCompute net once in ipvlan_process_v4_outbound and ipvlan_process_v6_outbound and store it in a variable so that net does not need to be recomputed next time it is used.
--- drivers/net/ipvlan/ipvlan_core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/ipvlan/ipvlan_core.c +4 -2
@@ -344,6 +344,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb) {const struct iphdr *ip4h =ip_hdr (skb);struct net_device *dev = skb->dev; +struct net *net =dev_net (dev);struct rtable *rt;int err, ret =NET_XMIT_DROP ;struct flowi4 fl4 = {
@@ -354,7 +355,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb) .saddr = ip4h->saddr, }; - rt =ip_route_output_flow (dev_net (dev), &fl4,NULL ); + rt =ip_route_output_flow (net, &fl4,NULL );if (IS_ERR (rt)) goto err;
@@ -381,6 +382,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) {const struct ipv6hdr *ip6h =ipv6_hdr (skb);struct net_device *dev = skb->dev; +struct net *net =dev_net (dev);struct dst_entry *dst;int err, ret =NET_XMIT_DROP ;struct flowi6 fl6 = {
@@ -393,7 +395,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) .flowi6_proto = ip6h->nexthdr, }; - dst =ip6_route_output (dev_net (dev),NULL , &fl6); + dst =ip6_route_output (net,NULL , &fl6);if (dst->error) { ret = dst->error;dst_release (dst);
Signature · 1 line
2.2.1
Re: [PATCH net-next 12/15] ipvlan: Cache net in ipvlan_process_v4_outbound and ipvlan_process_v6_outbound
Quoted 4 lines · Eric W. Biederman
Compute net once in
ipvlan_process_v4_outboundandipvlan_process_v6_outboundand store it in a variable so that net does not need to be recomputed next time it is used.
It's used exactly once at this moment so don't know what "next time" is. Do you have any additional patch(es) planned?
Quoted 50 lines
Signed-off-by "Eric W. Biederman" <[email protected]>--- drivers/net/ipvlan/ipvlan_core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)drivers/net/ipvlan/ipvlan_core.c +4
-3@@ -344,6 +344,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb) {const struct iphdr *ip4h =ip_hdr (skb);struct net_device *dev = skb->dev; +struct net *net =dev_net (dev);struct rtable *rt;int err, ret =NET_XMIT_DROP ;struct flowi4 fl4 = {@@ -354,7 +355,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb) .saddr = ip4h->saddr, }; - rt =ip_route_output_flow (dev_net (dev), &fl4,NULL ); + rt =ip_route_output_flow (net, &fl4,NULL );if (IS_ERR (rt)) goto err;@@ -381,6 +382,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) {const struct ipv6hdr *ip6h =ipv6_hdr (skb);struct net_device *dev = skb->dev; +struct net *net =dev_net (dev);struct dst_entry *dst;int err, ret =NET_XMIT_DROP ;struct flowi6 fl6 = {@@ -393,7 +395,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) .flowi6_proto = ip6h->nexthdr, }; - dst =ip6_route_output (dev_net (dev),NULL , &fl6); + dst =ip6_route_output (net,NULL , &fl6);if (dst->error) { ret = dst->error;dst_release (dst); --2.2.1
--
To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH net-next 12/15] ipvlan: Cache net in ipvlan_process_v4_outbound and ipvlan_process_v6_outbound
Quoted 9 lines · Mahesh Bandewar
Quoted 4 lines · Eric W. Biederman
Compute net once in
ipvlan_process_v4_outboundandipvlan_process_v6_outboundand store it in a variable so that net does not need to be recomputed next time it is used.It's used exactly once at this moment so don't know what "next time" is. Do you have any additional patch(es) planned?
OK. Got it! I was little early in sending that and did not look at the entire patch-series.
Quoted 50 lines
Quoted 50 lines
Signed-off-by "Eric W. Biederman" <[email protected]>--- drivers/net/ipvlan/ipvlan_core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)drivers/net/ipvlan/ipvlan_core.c +4
-3@@ -344,6 +344,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb) {const struct iphdr *ip4h =ip_hdr (skb);struct net_device *dev = skb->dev; +struct net *net =dev_net (dev);struct rtable *rt;int err, ret =NET_XMIT_DROP ;struct flowi4 fl4 = {@@ -354,7 +355,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb) .saddr = ip4h->saddr, }; - rt =ip_route_output_flow (dev_net (dev), &fl4,NULL ); + rt =ip_route_output_flow (net, &fl4,NULL );if (IS_ERR (rt)) goto err;@@ -381,6 +382,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) {const struct ipv6hdr *ip6h =ipv6_hdr (skb);struct net_device *dev = skb->dev; +struct net *net =dev_net (dev);struct dst_entry *dst;int err, ret =NET_XMIT_DROP ;struct flowi6 fl6 = {@@ -393,7 +395,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) .flowi6_proto = ip6h->nexthdr, }; - dst =ip6_route_output (dev_net (dev),NULL , &fl6); + dst =ip6_route_output (net,NULL , &fl6);if (dst->error) { ret = dst->error;dst_release (dst); --2.2.1
--
To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 13/15 ipv4,ipv6: Pass net into __ip_local_out and __ip6_local_out
In reply to Eric W. Biederman--- drivers/net/vrf.c | 2 +- include/net/dst_ops.h | 3 ++- include/net/ip.h | 2 +- include/net/ipv6.h | 2 +- net/ipv4/ip_output.c | 5 ++--- net/ipv6/output_core.c | 5 ++--- net/xfrm/xfrm_output.c | 2 +- 7 files changed, 10 insertions(+), 11 deletions(-)
drivers/net/vrf.c +1 -1
@@ -73,7 +73,7 @@ static struct dst_entry *vrf_ip_check(struct dst_entry *dst, u32 cookie)return dst; } -static int vrf_ip_local_out (struct sock *sk,struct sk_buff *skb) +static int vrf_ip_local_out (struct net *net,struct sock *sk,struct sk_buff *skb) {return ip_local_out (sk, skb); }
include/net/dst_ops.h +2 -1
@@ -9,6 +9,7 @@ struct kmem_cachep;struct net_device ;struct sk_buff ;struct sock ; +struct net ;struct dst_ops {unsigned short family;
@@ -28,7 +29,7 @@ struct dst_ops { struct sk_buff *skb, u32 mtu);void (*redirect)(struct dst_entry *dst,struct sock *sk,struct sk_buff *skb); -int (*local_out)(struct sock *sk,struct sk_buff *skb); +int (*local_out)(struct net *net,struct sock *sk,struct sk_buff *skb);struct neighbour * (*neigh_lookup)(const struct dst_entry *dst,struct sk_buff *skb,const void *daddr);
include/net/ip.h +1 -1
@@ -112,7 +112,7 @@ int ip_mc_output(struct sock *sk, struct sk_buff *skb);int ip_do_fragment (struct net *net,struct sock *sk,struct sk_buff *skb,int (*output)(struct net *,struct sock *,struct sk_buff *));void ip_send_check (struct iphdr *ip); -int __ip_local_out (struct sock *sk,struct sk_buff *skb); +int __ip_local_out (struct net *net,struct sock *sk,struct sk_buff *skb);int ip_local_out (struct sock *sk,struct sk_buff *skb);int ip_queue_xmit (struct sock *sk,struct sk_buff *skb,struct flowi *fl);
include/net/ipv6.h +1 -1
@@ -865,7 +865,7 @@ int ip6_forward(struct sk_buff *skb);int ip6_input (struct sk_buff *skb);int ip6_mc_input (struct sk_buff *skb); -int __ip6_local_out (struct sock *sk,struct sk_buff *skb); +int __ip6_local_out (struct net *net,struct sock *sk,struct sk_buff *skb);int ip6_local_out (struct sock *sk,struct sk_buff *skb);/*
net/ipv4/ip_output.c +2 -3
@@ -96,9 +96,8 @@ void ip_send_check(struct iphdr *iph) }EXPORT_SYMBOL (ip_send_check); -int __ip_local_out (struct sock *sk,struct sk_buff *skb) +int __ip_local_out (struct net *net,struct sock *sk,struct sk_buff *skb) { -struct net *net =dev_net (skb_dst (skb)->dev);struct iphdr *iph =ip_hdr (skb); iph->tot_len =htons (skb->len);
@@ -113,7 +112,7 @@ int ip_local_out(struct sock *sk, struct sk_buff *skb)struct net *net =dev_net (skb_dst (skb)->dev);int err; - err =__ip_local_out (sk, skb); + err =__ip_local_out (net, sk, skb);if (likely (err ==1 )) err =dst_output (net, sk, skb);
net/ipv6/output_core.c +2 -3
@@ -138,9 +138,8 @@ int ip6_dst_hoplimit(struct dst_entry *dst)EXPORT_SYMBOL (ip6_dst_hoplimit);#endif -int __ip6_local_out (struct sock *sk,struct sk_buff *skb) +int __ip6_local_out (struct net *net,struct sock *sk,struct sk_buff *skb) { -struct net *net =dev_net (skb_dst (skb)->dev);int len; len = skb->len -sizeof (struct ipv6hdr );
@@ -160,7 +159,7 @@ int ip6_local_out(struct sock *sk, struct sk_buff *skb)struct net *net =dev_net (skb_dst (skb)->dev);int err; - err =__ip6_local_out (sk, skb); + err =__ip6_local_out (net, sk, skb);if (likely (err ==1 )) err =dst_output (net, sk, skb);
net/xfrm/xfrm_output.c +1 -1
@@ -136,7 +136,7 @@ int xfrm_output_resume(struct sk_buff *skb, int err)while (likely ((err =xfrm_output_one (skb, err)) ==0 )) {nf_reset (skb); - err =skb_dst (skb)->ops->local_out (skb->sk, skb); + err =skb_dst (skb)->ops->local_out (net, skb->sk, skb);if (unlikely (err !=1 )) goto out;
Signature · 1 line
2.2.1
PATCH 14/15 ipv4,ipv6: Pass net into ip_local_out and ip6_local_out
In reply to Eric W. Biederman--- drivers/net/ipvlan/ipvlan_core.c | 4 ++-- drivers/net/ppp/pptp.c | 2 +- drivers/net/vrf.c | 4 ++-- include/net/ip.h | 2 +- include/net/ip6_tunnel.h | 2 +- include/net/ipv6.h | 2 +- net/ipv4/igmp.c | 4 ++-- net/ipv4/ip_output.c | 9 ++++----- net/ipv4/ip_tunnel_core.c | 2 +- net/ipv4/netfilter/ipt_SYNPROXY.c | 2 +- net/ipv4/netfilter/nf_dup_ipv4.c | 2 +- net/ipv4/netfilter/nf_reject_ipv4.c | 2 +- net/ipv6/ip6_output.c | 2 +- net/ipv6/netfilter/ip6t_SYNPROXY.c | 2 +- net/ipv6/netfilter/nf_dup_ipv6.c | 2 +- net/ipv6/netfilter/nf_reject_ipv6.c | 2 +- net/ipv6/output_core.c | 3 +-- net/netfilter/ipvs/ip_vs_xmit.c | 4 ++-- 18 files changed, 25 insertions(+), 27 deletions(-)
drivers/net/ipvlan/ipvlan_core.c +2 -2
@@ -365,7 +365,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb) }skb_dst_drop (skb);skb_dst_set (skb, &rt->dst); - err =ip_local_out (skb->sk, skb); + err =ip_local_out (net, skb->sk, skb);if (unlikely (net_xmit_eval (err))) dev->stats.tx_errors++;else
@@ -403,7 +403,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) }skb_dst_drop (skb);skb_dst_set (skb, dst); - err =ip6_local_out (skb->sk, skb); + err =ip6_local_out (net, skb->sk, skb);if (unlikely (net_xmit_eval (err))) dev->stats.tx_errors++;else
drivers/net/ppp/pptp.c +1 -1
@@ -283,7 +283,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)ip_select_ident (net, skb,NULL );ip_send_check (iph); -ip_local_out (skb->sk, skb); +ip_local_out (net, skb->sk, skb);return 1 ; tx_error:
drivers/net/vrf.c +2 -2
@@ -75,7 +75,7 @@ static struct dst_entry *vrf_ip_check(struct dst_entry *dst, u32 cookie)static int vrf_ip_local_out (struct net *net,struct sock *sk,struct sk_buff *skb) { -return ip_local_out (sk, skb); +return ip_local_out (net, sk, skb); }static unsigned int vrf_v4_mtu (const struct dst_entry *dst)
@@ -221,7 +221,7 @@ static netdev_tx_t vrf_process_v4_outbound(struct sk_buff *skb, RT_SCOPE_LINK); } - ret =ip_local_out (skb->sk, skb); + ret =ip_local_out (dev_net (skb_dst (skb)->dev), skb->sk, skb);if (unlikely (net_xmit_eval (ret))) vrf_dev->stats.tx_errors++;else
include/net/ip.h +1 -1
@@ -113,7 +113,7 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, int (*output)(struct net *, struct sock *, struct sk_buff *));void ip_send_check (struct iphdr *ip);int __ip_local_out (struct net *net,struct sock *sk,struct sk_buff *skb); -int ip_local_out (struct sock *sk,struct sk_buff *skb); +int ip_local_out (struct net *net,struct sock *sk,struct sk_buff *skb);int ip_queue_xmit (struct sock *sk,struct sk_buff *skb,struct flowi *fl);void ip_init (void );
include/net/ip6_tunnel.h +1 -1
@@ -87,7 +87,7 @@ static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb,int pkt_len, err; pkt_len = skb->len -skb_inner_network_offset (skb); - err =ip6_local_out (sk, skb); + err =ip6_local_out (dev_net (skb_dst (skb)->dev), sk, skb);if (net_xmit_eval (err) ==0 ) {struct pcpu_sw_netstats *tstats =this_cpu_ptr (dev->tstats);
include/net/ipv6.h +1 -1
@@ -866,7 +866,7 @@ int ip6_input(struct sk_buff *skb);int ip6_mc_input (struct sk_buff *skb);int __ip6_local_out (struct net *net,struct sock *sk,struct sk_buff *skb); -int ip6_local_out (struct sock *sk,struct sk_buff *skb); +int ip6_local_out (struct net *net,struct sock *sk,struct sk_buff *skb);/* * Extension header (options) processing
net/ipv4/igmp.c +2 -2
@@ -397,7 +397,7 @@ static int igmpv3_sendpack(struct sk_buff *skb) pig->csum =ip_compute_csum (igmp_hdr (skb), igmplen); -return ip_local_out (skb->sk, skb); +return ip_local_out (dev_net (skb_dst (skb)->dev), skb->sk, skb); }static int grec_size (struct ip_mc_list *pmc,int type,int gdel,int sdel)
@@ -739,7 +739,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc, ih->group = group; ih->csum =ip_compute_csum ((void *)ih,sizeof (struct igmphdr )); -return ip_local_out (skb->sk, skb); +return ip_local_out (net, skb->sk, skb); }static void igmp_gq_timer_expire (unsigned long data)
net/ipv4/ip_output.c +4 -5
@@ -107,9 +107,8 @@ int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb) dst_output); } -int ip_local_out (struct sock *sk,struct sk_buff *skb) +int ip_local_out (struct net *net,struct sock *sk,struct sk_buff *skb) { -struct net *net =dev_net (skb_dst (skb)->dev);int err; err =__ip_local_out (net, sk, skb);
@@ -169,7 +168,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, skb->mark = sk->sk_mark;/* Send it out. */ -return ip_local_out (skb->sk, skb); +return ip_local_out (net, skb->sk, skb); }EXPORT_SYMBOL_GPL (ip_build_and_send_pkt);
@@ -457,7 +456,7 @@ packet_routed: skb->priority = sk->sk_priority; skb->mark = sk->sk_mark; - res =ip_local_out (sk, skb); + res =ip_local_out (net, sk, skb);rcu_read_unlock ();return res;
@@ -1437,7 +1436,7 @@ int ip_send_skb(struct net *net, struct sk_buff *skb) {int err; - err =ip_local_out (skb->sk, skb); + err =ip_local_out (net, skb->sk, skb);if (err) {if (err >0 ) err =net_xmit_errno (err);
net/ipv4/ip_tunnel_core.c +1 -1
@@ -79,7 +79,7 @@ int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, iph->ttl = ttl;__ip_select_ident (net, iph,skb_shinfo (skb)->gso_segs ?:1 ); - err =ip_local_out (sk, skb); + err =ip_local_out (net, sk, skb);if (unlikely (net_xmit_eval (err))) pkt_len =0 ;return pkt_len;
net/ipv4/netfilter/ipt_SYNPROXY.c +1 -1
@@ -63,7 +63,7 @@ synproxy_send_tcp(const struct synproxy_net *snet,nf_conntrack_get (nfct); } -ip_local_out (nskb->sk, nskb); +ip_local_out (net, nskb->sk, nskb);return ; free_nskb:
net/ipv4/netfilter/nf_dup_ipv4.c +1 -1
@@ -92,7 +92,7 @@ void nf_dup_ipv4(struct net *net, struct sk_buff *skb, unsigned int hooknum,if (nf_dup_ipv4_route (net, skb, gw, oif)) {__this_cpu_write (nf_skb_duplicated, true); -ip_local_out (skb->sk, skb); +ip_local_out (net, skb->sk, skb);__this_cpu_write (nf_skb_duplicated, false); }else {kfree_skb (skb);
net/ipv4/netfilter/nf_reject_ipv4.c +1 -1
@@ -157,7 +157,7 @@ void nf_send_reset(struct net *net, struct sk_buff *oldskb, int hook)dev_queue_xmit (nskb); } else#endif -ip_local_out (nskb->sk, nskb); +ip_local_out (net, nskb->sk, nskb);return ;
net/ipv6/ip6_output.c +1 -1
@@ -1692,7 +1692,7 @@ int ip6_send_skb(struct sk_buff *skb)struct rt6_info *rt = (struct rt6_info *)skb_dst (skb);int err; - err =ip6_local_out (skb->sk, skb); + err =ip6_local_out (net, skb->sk, skb);if (err) {if (err >0 ) err =net_xmit_errno (err);
net/ipv6/netfilter/ip6t_SYNPROXY.c +1 -1
@@ -76,7 +76,7 @@ synproxy_send_tcp(const struct synproxy_net *snet,nf_conntrack_get (nfct); } -ip6_local_out (nskb->sk, nskb); +ip6_local_out (net, nskb->sk, nskb);return ; free_nskb:
net/ipv6/netfilter/nf_dup_ipv6.c +1 -1
@@ -68,7 +68,7 @@ void nf_dup_ipv6(struct net *net, struct sk_buff *skb, unsigned int hooknum, }if (nf_dup_ipv6_route (net, skb, gw, oif)) {__this_cpu_write (nf_skb_duplicated, true); -ip6_local_out (skb->sk, skb); +ip6_local_out (net, skb->sk, skb);__this_cpu_write (nf_skb_duplicated, false); }else {kfree_skb (skb);
net/ipv6/netfilter/nf_reject_ipv6.c +1 -1
@@ -206,7 +206,7 @@ void nf_send_reset6(struct net *net, struct sk_buff *oldskb, int hook) dev_queue_xmit(nskb); } else#endif -ip6_local_out (nskb->sk, nskb); +ip6_local_out (net, nskb->sk, nskb); }EXPORT_SYMBOL_GPL (nf_send_reset6);
net/ipv6/output_core.c +1 -2
@@ -154,9 +154,8 @@ int __ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb) }EXPORT_SYMBOL_GPL (__ip6_local_out); -int ip6_local_out (struct sock *sk,struct sk_buff *skb) +int ip6_local_out (struct net *net,struct sock *sk,struct sk_buff *skb) { -struct net *net =dev_net (skb_dst (skb)->dev);int err; err =__ip6_local_out (net, sk, skb);
net/netfilter/ipvs/ip_vs_xmit.c +2 -2
@@ -1049,7 +1049,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, ret =ip_vs_tunnel_xmit_prepare (skb, cp);if (ret ==NF_ACCEPT ) -ip_local_out (skb->sk, skb); +ip_local_out (net, skb->sk, skb);else if (ret ==NF_DROP )kfree_skb (skb);rcu_read_unlock ();
@@ -1141,7 +1141,7 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, ret =ip_vs_tunnel_xmit_prepare (skb, cp);if (ret ==NF_ACCEPT ) -ip6_local_out (skb->sk, skb); +ip6_local_out (cp->ipvs->net, skb->sk, skb);else if (ret ==NF_DROP )kfree_skb (skb);rcu_read_unlock ();
Signature · 1 line
2.2.1
PATCH 15/15 dst: Pass net into dst->output
In reply to Eric W. BiedermanThe network namespace is already passed into dst_output pass it into dst->output lwt->output and friends.
--- drivers/net/vrf.c | 3 +-- include/net/dst.h | 8 ++++---- include/net/ip.h | 4 ++-- include/net/ipv6.h | 2 +- include/net/lwtunnel.h | 8 ++++---- include/net/xfrm.h | 6 +++--- net/core/dst.c | 14 +++++++------- net/core/lwtunnel.c | 4 ++-- net/decnet/dn_route.c | 6 +++--- net/ipv4/ip_output.c | 6 ++---- net/ipv4/route.c | 4 ++-- net/ipv4/xfrm4_output.c | 4 +--- net/ipv6/ila.c | 4 ++-- net/ipv6/ip6_output.c | 3 +-- net/ipv6/route.c | 14 +++++++------- net/ipv6/xfrm6_output.c | 4 +--- net/mpls/mpls_iptunnel.c | 2 +- net/xfrm/xfrm_policy.c | 2 +- 18 files changed, 45 insertions(+), 53 deletions(-)
drivers/net/vrf.c +1 -2
@@ -311,10 +311,9 @@ err:return ret; } -static int vrf_output (struct sock *sk,struct sk_buff *skb) +static int vrf_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct net_device *dev =skb_dst (skb)->dev; -struct net *net =dev_net (dev);IP_UPD_PO_STATS (net,IPSTATS_MIB_OUT , skb->len);
include/net/dst.h +4 -4
@@ -45,7 +45,7 @@ struct dst_entry {void *__pad1;#endif int (*input)(struct sk_buff *); -int (*output)(struct sock *sk,struct sk_buff *skb); +int (*output)(struct net *net,struct sock *sk,struct sk_buff *skb);unsigned short flags;#define DST_HOST 0x0001
@@ -365,10 +365,10 @@ static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev,__skb_tunnel_rx (skb, dev, net); } -int dst_discard_sk (struct sock *sk,struct sk_buff *skb); +int dst_discard_out (struct net *net,struct sock *sk,struct sk_buff *skb);static inline int dst_discard (struct sk_buff *skb) { -return dst_discard_sk (skb->sk, skb); +return dst_discard_out (&init_net, skb->sk, skb); }void *dst_alloc (struct dst_ops *ops,struct net_device *dev,int initial_ref,int initial_obsolete,unsigned short flags);
@@ -456,7 +456,7 @@ static inline void dst_set_expires(struct dst_entry *dst, int timeout)/* Output packet to network from transport. */ static inline int dst_output (struct net *net,struct sock *sk,struct sk_buff *skb) { -return skb_dst (skb)->output (sk, skb); +return skb_dst (skb)->output (net, sk, skb); }/* Input packet from network to transport. */
include/net/ip.h +2 -2
@@ -107,8 +107,8 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev);int ip_local_deliver (struct sk_buff *skb);int ip_mr_input (struct sk_buff *skb); -int ip_output (struct sock *sk,struct sk_buff *skb); -int ip_mc_output (struct sock *sk,struct sk_buff *skb); +int ip_output (struct net *net,struct sock *sk,struct sk_buff *skb); +int ip_mc_output (struct net *net,struct sock *sk,struct sk_buff *skb);int ip_do_fragment (struct net *net,struct sock *sk,struct sk_buff *skb,int (*output)(struct net *,struct sock *,struct sk_buff *));void ip_send_check (struct iphdr *ip);
include/net/ipv6.h +1 -1
@@ -860,7 +860,7 @@ struct dst_entry *ip6_blackhole_route(struct net *net,* skb processing functions */ -int ip6_output (struct sock *sk,struct sk_buff *skb); +int ip6_output (struct net *net,struct sock *sk,struct sk_buff *skb);int ip6_forward (struct sk_buff *skb);int ip6_input (struct sk_buff *skb);int ip6_mc_input (struct sk_buff *skb);
include/net/lwtunnel.h +4 -4
@@ -18,7 +18,7 @@ struct lwtunnel_state {__u16 type;__u16 flags;atomic_t refcnt; -int (*orig_output)(struct sock *sk,struct sk_buff *skb); +int (*orig_output)(struct net *net,struct sock *sk,struct sk_buff *skb);int (*orig_input)(struct sk_buff *);int len;__u8 data[0 ];
@@ -28,7 +28,7 @@ struct lwtunnel_encap_ops {int (*build_state)(struct net_device *dev,struct nlattr *encap,unsigned int family,const void *cfg,struct lwtunnel_state **ts); -int (*output)(struct sock *sk,struct sk_buff *skb); +int (*output)(struct net *net,struct sock *sk,struct sk_buff *skb);int (*input)(struct sk_buff *skb);int (*fill_encap)(struct sk_buff *skb,struct lwtunnel_state *lwtstate);
@@ -88,7 +88,7 @@ int lwtunnel_fill_encap(struct sk_buff *skb,int lwtunnel_get_encap_size (struct lwtunnel_state *lwtstate);struct lwtunnel_state *lwtunnel_state_alloc (int hdr_len);int lwtunnel_cmp_encap (struct lwtunnel_state *a,struct lwtunnel_state *b); -int lwtunnel_output (struct sock *sk,struct sk_buff *skb); +int lwtunnel_output (struct net *net,struct sock *sk,struct sk_buff *skb);int lwtunnel_input (struct sk_buff *skb);#else
@@ -160,7 +160,7 @@ static inline int lwtunnel_cmp_encap(struct lwtunnel_state *a,return 0 ; } -static inline int lwtunnel_output (struct sock *sk,struct sk_buff *skb) +static inline int lwtunnel_output (struct net *net,struct sock *sk,struct sk_buff *skb) {return -EOPNOTSUPP ; }
include/net/xfrm.h +3 -3
@@ -333,7 +333,7 @@ struct xfrm_state_afinfo { const xfrm_address_t *saddr);int (*tmpl_sort)(struct xfrm_tmpl **dst,struct xfrm_tmpl **src,int n);int (*state_sort)(struct xfrm_state **dst,struct xfrm_state **src,int n); -int (*output)(struct sock *sk,struct sk_buff *skb); +int (*output)(struct net *net,struct sock *sk,struct sk_buff *skb);int (*output_finish)(struct sock *sk,struct sk_buff *skb);int (*extract_input)(struct xfrm_state *x,struct sk_buff *skb);
@@ -1527,7 +1527,7 @@ static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi)int xfrm4_extract_output (struct xfrm_state *x,struct sk_buff *skb);int xfrm4_prepare_output (struct xfrm_state *x,struct sk_buff *skb); -int xfrm4_output (struct sock *sk,struct sk_buff *skb); +int xfrm4_output (struct net *net,struct sock *sk,struct sk_buff *skb);int xfrm4_output_finish (struct sock *sk,struct sk_buff *skb);int xfrm4_rcv_cb (struct sk_buff *skb,u8 protocol,int err);int xfrm4_protocol_register (struct xfrm4_protocol *handler,unsigned char protocol);
@@ -1552,7 +1552,7 @@ __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr);__be32 xfrm6_tunnel_spi_lookup (struct net *net,const xfrm_address_t *saddr);int xfrm6_extract_output (struct xfrm_state *x,struct sk_buff *skb);int xfrm6_prepare_output (struct xfrm_state *x,struct sk_buff *skb); -int xfrm6_output (struct sock *sk,struct sk_buff *skb); +int xfrm6_output (struct net *net,struct sock *sk,struct sk_buff *skb);int xfrm6_output_finish (struct sock *sk,struct sk_buff *skb);int xfrm6_find_1stfragopt (struct xfrm_state *x,struct sk_buff *skb,u8 **prevhdr);
net/core/dst.c +7 -7
@@ -144,12 +144,12 @@ loop:mutex_unlock (&dst_gc_mutex); } -int dst_discard_sk (struct sock *sk,struct sk_buff *skb) +int dst_discard_out (struct net *net,struct sock *sk,struct sk_buff *skb) {kfree_skb (skb);return 0 ; } -EXPORT_SYMBOL (dst_discard_sk); +EXPORT_SYMBOL (dst_discard_out);const u32 dst_default_metrics[RTAX_MAX +1 ] = {/* This initializer is needed to force linker to place this variable
@@ -177,7 +177,7 @@ void dst_init(struct dst_entry *dst, struct dst_ops *ops, dst->xfrm =NULL ;#endif dst->input = dst_discard; - dst->output = dst_discard_sk; + dst->output = dst_discard_out; dst->error =0 ; dst->obsolete = initial_obsolete; dst->header_len =0 ;
@@ -224,7 +224,7 @@ static void ___dst_free(struct dst_entry *dst)*/ if (dst->dev ==NULL || !(dst->dev->flags&IFF_UP )) { dst->input = dst_discard; - dst->output = dst_discard_sk; + dst->output = dst_discard_out; } dst->obsolete =DST_OBSOLETE_DEAD ; }
@@ -352,7 +352,7 @@ static struct dst_ops md_dst_ops = { .family = AF_UNSPEC, }; -static int dst_md_discard_sk (struct sock *sk,struct sk_buff *skb) +static int dst_md_discard_out (struct net *net,struct sock *sk,struct sk_buff *skb) {WARN_ONCE (1 ,"Attempting to call output on metadata dst\n" );kfree_skb (skb);
@@ -375,7 +375,7 @@ static void __metadata_dst_init(struct metadata_dst *md_dst, u8 optslen) DST_METADATA | DST_NOCACHE | DST_NOCOUNT); dst->input = dst_md_discard; - dst->output = dst_md_discard_sk; + dst->output = dst_md_discard_out;memset (dst +1 ,0 ,sizeof (*md_dst) + optslen -sizeof (*dst)); }
@@ -430,7 +430,7 @@ static void dst_ifdown(struct dst_entry *dst, struct net_device *dev,if (!unregister) { dst->input = dst_discard; - dst->output = dst_discard_sk; + dst->output = dst_discard_out; }else { dst->dev =dev_net (dst->dev)->loopback_dev;dev_hold (dst->dev);
net/core/lwtunnel.c +2 -2
@@ -180,7 +180,7 @@ int lwtunnel_cmp_encap(struct lwtunnel_state *a, struct lwtunnel_state *b) }EXPORT_SYMBOL (lwtunnel_cmp_encap); -int lwtunnel_output (struct sock *sk,struct sk_buff *skb) +int lwtunnel_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct dst_entry *dst =skb_dst (skb);const struct lwtunnel_encap_ops *ops;
@@ -199,7 +199,7 @@ int lwtunnel_output(struct sock *sk, struct sk_buff *skb)rcu_read_lock (); ops =rcu_dereference (lwtun_encaps[lwtstate->type]);if (likely (ops && ops->output)) - ret = ops->output (sk, skb); + ret = ops->output (net, sk, skb);rcu_read_unlock ();if (ret == -EOPNOTSUPP )
net/decnet/dn_route.c +3 -3
@@ -744,7 +744,7 @@ out:return NET_RX_DROP ; } -static int dn_output (struct sock *sk,struct sk_buff *skb) +static int dn_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct dst_entry *dst =skb_dst (skb);struct dn_route *rt = (struct dn_route *)dst;
@@ -832,7 +832,7 @@ drop:* Used to catch bugs. This should never normally get * called. */ -static int dn_rt_bug_sk (struct sock *sk,struct sk_buff *skb) +static int dn_rt_bug_out (struct net *net,struct sock *sk,struct sk_buff *skb) {struct dn_skb_cb *cb =DN_SKB_CB (skb);
@@ -1469,7 +1469,7 @@ make_route: rt->n = neigh; rt->dst.lastuse = jiffies; - rt->dst.output = dn_rt_bug_sk; + rt->dst.output = dn_rt_bug_out;switch (res.type) {case RTN_UNICAST : rt->dst.input = dn_forward;
net/ipv4/ip_output.c +2 -4
@@ -284,11 +284,10 @@ static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *skreturn ip_finish_output2 (net, sk, skb); } -int ip_mc_output (struct sock *sk,struct sk_buff *skb) +int ip_mc_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct rtable *rt =skb_rtable (skb);struct net_device *dev = rt->dst.dev; -struct net *net =dev_net (dev);/* * If the indicated interface is up and running, send the packet.
@@ -347,10 +346,9 @@ int ip_mc_output(struct sock *sk, struct sk_buff *skb) !(IPCB(skb)->flags & IPSKB_REROUTED)); } -int ip_output (struct sock *sk,struct sk_buff *skb) +int ip_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct net_device *dev =skb_dst (skb)->dev; -struct net *net =dev_net (dev);IP_UPD_PO_STATS (net,IPSTATS_MIB_OUT , skb->len);
net/ipv4/route.c +2 -2
@@ -1152,7 +1152,7 @@ static void ipv4_link_failure(struct sk_buff *skb)dst_set_expires (&rt->dst,0 ); } -static int ip_rt_bug (struct sock *sk,struct sk_buff *skb) +static int ip_rt_bug (struct net *net,struct sock *sk,struct sk_buff *skb) { pr_debug("%s: %pI4 -> %pI4, %s\n", __func__, &ip_hdr(skb)->saddr, &ip_hdr(skb)->daddr,
@@ -2317,7 +2317,7 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or new->__use =1 ; new->input = dst_discard; - new->output = dst_discard_sk; + new->output = dst_discard_out; new->dev = ort->dst.dev;if (new->dev)
net/ipv4/xfrm4_output.c +1 -3
@@ -94,10 +94,8 @@ static int __xfrm4_output(struct net *net, struct sock *sk, struct sk_buff *skb)return x->outer_mode->afinfo->output_finish (sk, skb); } -int xfrm4_output (struct sock *sk,struct sk_buff *skb) +int xfrm4_output (struct net *net,struct sock *sk,struct sk_buff *skb) { -struct net *net =dev_net (skb_dst (skb)->dev); - return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, net, sk, skb, NULL, skb_dst(skb)->dev, __xfrm4_output,
net/ipv6/ila.c +2 -2
@@ -91,7 +91,7 @@ static void update_ipv6_locator(struct sk_buff *skb, struct ila_params *p) *(__be64 *)&ip6h->daddr = p->locator; } -static int ila_output (struct sock *sk,struct sk_buff *skb) +static int ila_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct dst_entry *dst =skb_dst (skb);
@@ -100,7 +100,7 @@ static int ila_output(struct sock *sk, struct sk_buff *skb)update_ipv6_locator (skb,ila_params_lwtunnel (dst->lwtstate)); -return dst->lwtstate->orig_output (sk, skb); +return dst->lwtstate->orig_output (net, sk, skb); drop:kfree_skb (skb);
net/ipv6/ip6_output.c +1 -2
@@ -130,11 +130,10 @@ static int ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *sreturn ip6_finish_output2 (net, sk, skb); } -int ip6_output (struct sock *sk,struct sk_buff *skb) +int ip6_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct net_device *dev =skb_dst (skb)->dev;struct inet6_dev *idev =ip6_dst_idev (skb_dst (skb)); -struct net *net =dev_net (dev);if (unlikely (idev->cnf.disable_ipv6)) {IP6_INC_STATS (net, idev,IPSTATS_MIB_OUTDISCARDS );
net/ipv6/route.c +7 -7
@@ -86,9 +86,9 @@ static void ip6_dst_ifdown(struct dst_entry *,static int ip6_dst_gc (struct dst_ops *ops);static int ip6_pkt_discard (struct sk_buff *skb); -static int ip6_pkt_discard_out (struct sock *sk,struct sk_buff *skb); +static int ip6_pkt_discard_out (struct net *net,struct sock *sk,struct sk_buff *skb);static int ip6_pkt_prohibit (struct sk_buff *skb); -static int ip6_pkt_prohibit_out (struct sock *sk,struct sk_buff *skb); +static int ip6_pkt_prohibit_out (struct net *net,struct sock *sk,struct sk_buff *skb);static void ip6_link_failure (struct sk_buff *skb);static void ip6_rt_update_pmtu (struct dst_entry *dst,struct sock *sk,struct sk_buff *skb,u32 mtu);
@@ -308,7 +308,7 @@ static const struct rt6_info ip6_blk_hole_entry_template = { .obsolete = DST_OBSOLETE_FORCE_CHK, .error = -EINVAL, .input = dst_discard, - .output = dst_discard_sk, + .output = dst_discard_out, }, .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), .rt6i_protocol = RTPROT_KERNEL,
@@ -1195,7 +1195,7 @@ struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_ori new->__use =1 ; new->input = dst_discard; - new->output = dst_discard_sk; + new->output = dst_discard_out;if (dst_metrics_read_only (&ort->dst)) new->_metrics = ort->dst._metrics;
@@ -1853,7 +1853,7 @@ int ip6_route_info_create(struct fib6_config *cfg, struct rt6_info **rt_ret)switch (cfg->fc_type) {case RTN_BLACKHOLE : rt->dst.error = -EINVAL ; - rt->dst.output = dst_discard_sk; + rt->dst.output = dst_discard_out; rt->dst.input = dst_discard;break ;case RTN_PROHIBIT :
@@ -2446,7 +2446,7 @@ static int ip6_pkt_discard(struct sk_buff *skb)return ip6_pkt_drop (skb,ICMPV6_NOROUTE ,IPSTATS_MIB_INNOROUTES ); } -static int ip6_pkt_discard_out (struct sock *sk,struct sk_buff *skb) +static int ip6_pkt_discard_out (struct net *net,struct sock *sk,struct sk_buff *skb) { skb->dev =skb_dst (skb)->dev;return ip6_pkt_drop (skb,ICMPV6_NOROUTE ,IPSTATS_MIB_OUTNOROUTES );
@@ -2457,7 +2457,7 @@ static int ip6_pkt_prohibit(struct sk_buff *skb)return ip6_pkt_drop (skb,ICMPV6_ADM_PROHIBITED ,IPSTATS_MIB_INNOROUTES ); } -static int ip6_pkt_prohibit_out (struct sock *sk,struct sk_buff *skb) +static int ip6_pkt_prohibit_out (struct net *net,struct sock *sk,struct sk_buff *skb) { skb->dev =skb_dst (skb)->dev;return ip6_pkt_drop (skb,ICMPV6_ADM_PROHIBITED ,IPSTATS_MIB_OUTNOROUTES );
net/ipv6/xfrm6_output.c +1 -3
@@ -173,10 +173,8 @@ static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)return x->outer_mode->afinfo->output_finish (sk, skb); } -int xfrm6_output (struct sock *sk,struct sk_buff *skb) +int xfrm6_output (struct net *net,struct sock *sk,struct sk_buff *skb) { -struct net *net =dev_net (skb_dst (skb)->dev); - return NF_HOOK_COND(NFPROTO_IPV6, NF_INET_POST_ROUTING, net, sk, skb, NULL, skb_dst(skb)->dev, __xfrm6_output,
net/mpls/mpls_iptunnel.c +1 -1
@@ -37,7 +37,7 @@ static unsigned int mpls_encap_size(struct mpls_iptunnel_encap *en)return en->labels *sizeof (struct mpls_shim_hdr ); } -int mpls_output (struct sock *sk,struct sk_buff *skb) +int mpls_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct mpls_iptunnel_encap *tun_encap_info;struct mpls_shim_hdr *hdr;
net/xfrm/xfrm_policy.c +1 -1
@@ -1957,7 +1957,7 @@ purge_queue:xfrm_pol_put (pol); } -static int xdst_queue_output (struct sock *sk,struct sk_buff *skb) +static int xdst_queue_output (struct net *net,struct sock *sk,struct sk_buff *skb) {unsigned long sched_next;struct dst_entry *dst =skb_dst (skb);
Signature · 1 line
2.2.1
cover net: Pass net through the output path v2
In reply to Eric W. BiedermanThis is the next installment of my work to pass struct net through the output path so the code does not need to guess how to figure out which network namespace it is in, and ultimately routes can have output devices in another network namespace.
The first patch in this series is a fix for a bug that came in when sk was passed through the functions in the output path, and as such is probably a candidate for net. At the same time my later patches depend on it so sending the fix separately would be confusing.
The second patch in this series is another fix that for an issue that came in when sk was passed through the output path. I don't think it needs a backport as I don't think anyone uses the path where the code was incorrect.
The rest of the patchset focuses on the path from xxx_local_out to dst_output and in the end succeeds in passing sock_net(sk) from the socket a packet locally originates on to the dst->output function.
Given the size reduction in the code I think this counts as a cleanup as much as feature work.
There remain a number of helper functions (like ip option processing) to take care of before the network stack can support destination devices in other network namespaces but with this set of changes the backbone of the work is done.
The changes are also available against net-next at:git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/net-next.git master
Eric
Eric W. Biederman (16):
ipv4: Fix ip_local_out_sk by passing the sk into __ip_local_out_sk
ipv4: Fix ip_queue_xmit to pass sk into ip_local_out_sk
xfrm: Only compute net once in xfrm_policy_queue_process
net: Pass net into dst_output and remove dst_output_okfn
dst: Pass a sk into .local_out
ipv4: Merge __ip_local_out and __ip_local_out_sk
ipv4: Merge ip_local_out and ip_local_out_sk
ipv6: Merge __ip6_local_out and __ip6_local_out_sk
ipv6: Merge ip6_local_out and ip6_local_out_sk
ipv4: Cache net in iptunnel_xmit
ipv4: Cache net in ip_build_and_send_pkt and ip_queue_xmit
ppp: Cache net in pptp_xmit
ipvlan: Cache net in ipvlan_process_v4_outbound and ipvlan_process_v6_outbound ipv4,ipv6: Pass net into __ip_local_out and __ip6_local_out ipv4,ipv6: Pass net into ip_local_out and ip6_local_out
dst: Pass net into dst->output
drivers/net/ipvlan/ipvlan_core.c | 10 +++++---- drivers/net/ppp/pptp.c | 7 ++++--- drivers/net/vrf.c | 9 ++++---- include/net/dst.h | 14 +++++-------- include/net/dst_ops.h | 3 ++- include/net/ip.h | 12 ++++------- include/net/ip6_tunnel.h | 2 +- include/net/ipv6.h | 7 +++---- include/net/lwtunnel.h | 8 +++---- include/net/xfrm.h | 6 +++--- net/core/dst.c | 14 ++++++------- net/core/lwtunnel.c | 4 ++-- net/decnet/dn_nsp_out.c | 4 ++-- net/decnet/dn_route.c | 6 +++--- net/ipv4/igmp.c | 4 ++-- net/ipv4/ip_forward.c | 2 +- net/ipv4/ip_output.c | 42 ++++++++++++++++--------------------- net/ipv4/ip_tunnel_core.c | 6 +++--- net/ipv4/ip_vti.c | 2 +- net/ipv4/ipmr.c | 2 +- net/ipv4/netfilter/ipt_SYNPROXY.c | 2 +- net/ipv4/netfilter/nf_dup_ipv4.c | 2 +- net/ipv4/netfilter/nf_reject_ipv4.c | 2 +- net/ipv4/raw.c | 2 +- net/ipv4/route.c | 4 ++-- net/ipv4/xfrm4_output.c | 6 ++---- net/ipv6/ila.c | 4 ++-- net/ipv6/ip6_output.c | 9 ++++---- net/ipv6/ip6_vti.c | 2 +- net/ipv6/ip6mr.c | 2 +- net/ipv6/mcast.c | 4 ++-- net/ipv6/ndisc.c | 2 +- net/ipv6/netfilter/ip6t_SYNPROXY.c | 2 +- net/ipv6/netfilter/nf_dup_ipv6.c | 2 +- net/ipv6/netfilter/nf_reject_ipv6.c | 2 +- net/ipv6/output_core.c | 22 +++++-------------- net/ipv6/raw.c | 2 +- net/ipv6/route.c | 14 ++++++------- net/ipv6/xfrm6_output.c | 6 ++---- net/mpls/mpls_iptunnel.c | 2 +- net/netfilter/ipvs/ip_vs_xmit.c | 8 +++---- net/xfrm/xfrm_output.c | 4 ++-- net/xfrm/xfrm_policy.c | 11 +++++----- 43 files changed, 125 insertions(+), 155 deletions(-)
PATCH 1/16 ipv4: Fix ip_local_out_sk by passing the sk into __ip_local_out_sk
In the rare case where sk != skb->sk ip_local_out_sk arranges to call dst->output differently if the skb is queued or not. This is a bug.
Fix this bug by passing the sk parameter of ip_local_out_sk through from ip_local_out_sk to __ip_local_out_sk (skipping __ip_local_out).
--- net/ipv4/ip_output.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/ip_output.c +1 -1
@@ -117,7 +117,7 @@ int ip_local_out_sk(struct sock *sk, struct sk_buff *skb) {int err; - err =__ip_local_out (skb); + err =__ip_local_out_sk (sk, skb);if (likely (err ==1 )) err =dst_output (sk, skb);
Signature · 1 line
2.2.1
PATCH 2/16 ipv4: Fix ip_queue_xmit to pass sk into ip_local_out_sk
In reply to Eric W. BiedermanAfter a packet has been encapsulated by a tunnel we should use the tunnel sockets local multicast loopback flag to control if the encapsulated packet should be locally loopback back.
Pass sk into ip_local_out_sk so that in the rare case we are dealing with a tunneled packet whose tunnel destination address is a multicast address the kernel properly decides to loopback this packet.
In practice I don't think this matters as ip_queue_xmit is used by tcp, l2tp and sctp none of which I am aware of uses ip level multicasting as they are all point to point communications protocols. Let's fix this before someone uses ip_queue_xmit for a tunnel protocol that does use multicast.
--- net/ipv4/ip_output.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/ip_output.c +1 -1
@@ -460,7 +460,7 @@ packet_routed: skb->priority = sk->sk_priority; skb->mark = sk->sk_mark; - res =ip_local_out (skb); + res =ip_local_out_sk (sk, skb);rcu_read_unlock ();return res;
Signature · 1 line
2.2.1
PATCH 3/16 xfrm: Only compute net once in xfrm_policy_queue_process
In reply to Eric W. Biederman--- net/xfrm/xfrm_policy.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
net/xfrm/xfrm_policy.c +3 -4
@@ -1887,6 +1887,7 @@ static void xfrm_policy_queue_process(unsigned long arg)struct sock *sk;struct dst_entry *dst;struct xfrm_policy *pol = (struct xfrm_policy *)arg; +struct net *net =xp_net (pol);struct xfrm_policy_queue *pq = &pol->polq;struct flowi fl;struct sk_buff_head list;
@@ -1903,8 +1904,7 @@ static void xfrm_policy_queue_process(unsigned long arg)spin_unlock (&pq->hold_queue.lock);dst_hold (dst->path); - dst =xfrm_lookup (xp_net (pol), dst->path, &fl, - sk,0 ); + dst =xfrm_lookup (net, dst->path, &fl, sk,0 );if (IS_ERR (dst)) goto purge_queue;
@@ -1934,8 +1934,7 @@ static void xfrm_policy_queue_process(unsigned long arg)xfrm_decode_session (skb, &fl,skb_dst (skb)->ops->family);dst_hold (skb_dst (skb)->path); - dst =xfrm_lookup (xp_net (pol),skb_dst (skb)->path, - &fl, skb->sk,0 ); + dst =xfrm_lookup (net,skb_dst (skb)->path, &fl, skb->sk,0 );if (IS_ERR (dst)) {kfree_skb (skb);continue ;
Signature · 1 line
2.2.1
PATCH 4/16 net: Pass net into dst_output and remove dst_output_okfn
In reply to Eric W. BiedermanReplace dst_output_okfn with dst_output
--- include/net/dst.h | 6 +----- net/decnet/dn_nsp_out.c | 4 ++-- net/ipv4/ip_forward.c | 2 +- net/ipv4/ip_output.c | 7 ++++--- net/ipv4/ip_vti.c | 2 +- net/ipv4/ipmr.c | 2 +- net/ipv4/raw.c | 2 +- net/ipv4/xfrm4_output.c | 2 +- net/ipv6/ip6_output.c | 4 ++-- net/ipv6/ip6_vti.c | 2 +- net/ipv6/ip6mr.c | 2 +- net/ipv6/mcast.c | 4 ++-- net/ipv6/ndisc.c | 2 +- net/ipv6/output_core.c | 5 +++-- net/ipv6/raw.c | 2 +- net/ipv6/xfrm6_output.c | 2 +- net/netfilter/ipvs/ip_vs_xmit.c | 4 ++-- net/xfrm/xfrm_output.c | 2 +- net/xfrm/xfrm_policy.c | 2 +- 19 files changed, 28 insertions(+), 30 deletions(-)
include/net/dst.h +1 -5
@@ -454,14 +454,10 @@ static inline void dst_set_expires(struct dst_entry *dst, int timeout) }/* Output packet to network from transport. */ -static inline int dst_output (struct sock *sk,struct sk_buff *skb) +static inline int dst_output (struct net *net,struct sock *sk,struct sk_buff *skb) {return skb_dst (skb)->output (sk, skb); } -static inline int dst_output_okfn (struct net *net,struct sock *sk,struct sk_buff *skb) -{ -return dst_output (sk, skb); -}/* Input packet from network to transport. */ static inline int dst_input (struct sk_buff *skb)
net/decnet/dn_nsp_out.c +2 -2
@@ -85,7 +85,7 @@ static void dn_nsp_send(struct sk_buff *skb)if (dst) { try_again:skb_dst_set (skb, dst); -dst_output (skb->sk, skb); +dst_output (&init_net, skb->sk, skb);return ; }
@@ -582,7 +582,7 @@ static __inline__ void dn_nsp_do_disc(struct sock *sk, unsigned char msgflg,* associations. */ skb_dst_set (skb,dst_clone (dst)); -dst_output (skb->sk, skb); +dst_output (&init_net, skb->sk, skb); }
net/ipv4/ip_forward.c +1 -1
@@ -72,7 +72,7 @@ static int ip_forward_finish(struct net *net, struct sock *sk, struct sk_buff *sip_forward_options (skb);skb_sender_cpu_clear (skb); -return dst_output (sk, skb); +return dst_output (net, sk, skb); }int ip_forward (struct sk_buff *skb)
net/ipv4/ip_output.c +4 -3
@@ -105,7 +105,7 @@ static int __ip_local_out_sk(struct sock *sk, struct sk_buff *skb)ip_send_check (iph);return nf_hook (NFPROTO_IPV4 ,NF_INET_LOCAL_OUT , net, sk, skb,NULL ,skb_dst (skb)->dev, - dst_output_okfn); + dst_output); }int __ip_local_out (struct sk_buff *skb)
@@ -115,11 +115,12 @@ int __ip_local_out(struct sk_buff *skb)int ip_local_out_sk (struct sock *sk,struct sk_buff *skb) { +struct net *net =dev_net (skb_dst (skb)->dev);int err; err =__ip_local_out_sk (sk, skb);if (likely (err ==1 )) - err =dst_output (sk, skb); + err =dst_output (net, sk, skb);return err; }
@@ -276,7 +277,7 @@ static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *sk/* Policy lookup after SNAT yielded a new policy */ if (skb_dst (skb)->xfrm) {IPCB (skb)->flags |=IPSKB_REROUTED ; -return dst_output (sk, skb); +return dst_output (net, sk, skb); }#endif mtu =ip_skb_dst_mtu (skb);
net/ipv4/ip_vti.c +1 -1
@@ -197,7 +197,7 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev,skb_dst_set (skb, dst); skb->dev =skb_dst (skb)->dev; - err =dst_output (skb->sk, skb); + err =dst_output (tunnel->net, skb->sk, skb);if (net_xmit_eval (err) ==0 ) err = skb->len;iptunnel_xmit_stats (err, &dev->stats, dev->tstats);
net/ipv4/ipmr.c +1 -1
@@ -1689,7 +1689,7 @@ static inline int ipmr_forward_finish(struct net *net, struct sock *sk,if (unlikely (opt->optlen))ip_forward_options (skb); -return dst_output (sk, skb); +return dst_output (net, sk, skb); }/*
net/ipv4/raw.c +1 -1
@@ -413,7 +413,7 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4, err =NF_HOOK (NFPROTO_IPV4 ,NF_INET_LOCAL_OUT , net, sk, skb,NULL , rt->dst.dev, - dst_output_okfn); + dst_output);if (err >0 ) err =net_xmit_errno (err);if (err)
net/ipv4/xfrm4_output.c +1 -1
@@ -87,7 +87,7 @@ static int __xfrm4_output(struct net *net, struct sock *sk, struct sk_buff *skb)#ifdef CONFIG_NETFILTER if (!x) {IPCB (skb)->flags |=IPSKB_REROUTED ; -return dst_output (sk, skb); +return dst_output (net, sk, skb); }#endif
net/ipv6/ip6_output.c +2 -2
@@ -233,7 +233,7 @@ int ip6_xmit(const struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,*/ return NF_HOOK (NFPROTO_IPV6 ,NF_INET_LOCAL_OUT , net, (struct sock *)sk, skb,NULL , dst->dev, - dst_output_okfn); + dst_output); } skb->dev = dst->dev;
@@ -333,7 +333,7 @@ static inline int ip6_forward_finish(struct net *net, struct sock *sk, struct sk_buff *skb) {skb_sender_cpu_clear (skb); -return dst_output (sk, skb); +return dst_output (net, sk, skb); }static unsigned int ip6_dst_mtu_forward (const struct dst_entry *dst)
net/ipv6/ip6_vti.c +1 -1
@@ -482,7 +482,7 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)return -EMSGSIZE ; } - err =dst_output (skb->sk, skb); + err =dst_output (t->net, skb->sk, skb);if (net_xmit_eval (err) ==0 ) {struct pcpu_sw_netstats *tstats =this_cpu_ptr (dev->tstats);
net/ipv6/ip6mr.c +1 -1
@@ -1991,7 +1991,7 @@ static inline int ip6mr_forward2_finish(struct net *net, struct sock *sk, struct IPSTATS_MIB_OUTFORWDATAGRAMS);IP6_ADD_STATS_BH (net,ip6_dst_idev (skb_dst (skb)),IPSTATS_MIB_OUTOCTETS , skb->len); -return dst_output (sk, skb); +return dst_output (net, sk, skb); }/*
net/ipv6/mcast.c +2 -2
@@ -1646,7 +1646,7 @@ static void mld_sendpack(struct sk_buff *skb) err =NF_HOOK (NFPROTO_IPV6 ,NF_INET_LOCAL_OUT , net, net->ipv6.igmp_sk, skb,NULL , skb->dev, - dst_output_okfn); + dst_output); out:if (!err) {ICMP6MSGOUT_INC_STATS (net, idev,ICMPV6_MLD2_REPORT );
@@ -2010,7 +2010,7 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)skb_dst_set (skb, dst); err =NF_HOOK (NFPROTO_IPV6 ,NF_INET_LOCAL_OUT , net, sk, skb,NULL , skb->dev, - dst_output_okfn); + dst_output); out:if (!err) {ICMP6MSGOUT_INC_STATS (net, idev, type);
net/ipv6/ndisc.c +1 -1
@@ -465,7 +465,7 @@ static void ndisc_send_skb(struct sk_buff *skb, err =NF_HOOK (NFPROTO_IPV6 ,NF_INET_LOCAL_OUT , net, sk, skb,NULL , dst->dev, - dst_output_okfn); + dst_output);if (!err) {ICMP6MSGOUT_INC_STATS (net, idev, type);ICMP6_INC_STATS (net, idev,ICMP6_MIB_OUTMSGS );
net/ipv6/output_core.c +3 -2
@@ -151,7 +151,7 @@ static int __ip6_local_out_sk(struct sock *sk, struct sk_buff *skb)return nf_hook (NFPROTO_IPV6 ,NF_INET_LOCAL_OUT , net, sk, skb,NULL ,skb_dst (skb)->dev, - dst_output_okfn); + dst_output); }int __ip6_local_out (struct sk_buff *skb)
@@ -162,11 +162,12 @@ EXPORT_SYMBOL_GPL(__ip6_local_out);int ip6_local_out_sk (struct sock *sk,struct sk_buff *skb) { +struct net *net =dev_net (skb_dst (skb)->dev);int err; err =__ip6_local_out_sk (sk, skb);if (likely (err ==1 )) - err =dst_output (sk, skb); + err =dst_output (net, sk, skb);return err; }
net/ipv6/raw.c +1 -1
@@ -655,7 +655,7 @@ static int rawv6_send_hdrinc(struct sock *sk, struct msghdr *msg, int length,IP6_UPD_PO_STATS (net, rt->rt6i_idev,IPSTATS_MIB_OUT , skb->len); err =NF_HOOK (NFPROTO_IPV6 ,NF_INET_LOCAL_OUT , net, sk, skb, -NULL , rt->dst.dev, dst_output_okfn); +NULL , rt->dst.dev, dst_output);if (err >0 ) err =net_xmit_errno (err);if (err)
net/ipv6/xfrm6_output.c +1 -1
@@ -147,7 +147,7 @@ static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)#ifdef CONFIG_NETFILTER if (!x) {IP6CB (skb)->flags |=IP6SKB_REROUTED ; -return dst_output (sk, skb); +return dst_output (net, sk, skb); }#endif
net/netfilter/ipvs/ip_vs_xmit.c +2 -2
@@ -576,7 +576,7 @@ static inline int ip_vs_nat_send_or_cont(int pf, struct sk_buff *skb,if (!skb->sk)skb_sender_cpu_clear (skb);NF_HOOK (pf,NF_INET_LOCAL_OUT , cp->ipvs->net,NULL , skb, -NULL ,skb_dst (skb)->dev, dst_output_okfn); +NULL ,skb_dst (skb)->dev, dst_output); }else ret =NF_ACCEPT ;
@@ -598,7 +598,7 @@ static inline int ip_vs_send_or_cont(int pf, struct sk_buff *skb,if (!skb->sk)skb_sender_cpu_clear (skb);NF_HOOK (pf,NF_INET_LOCAL_OUT , cp->ipvs->net,NULL , skb, -NULL ,skb_dst (skb)->dev, dst_output_okfn); +NULL ,skb_dst (skb)->dev, dst_output); }else ret =NF_ACCEPT ;return ret;
net/xfrm/xfrm_output.c +1 -1
@@ -141,7 +141,7 @@ int xfrm_output_resume(struct sk_buff *skb, int err) goto out;if (!skb_dst (skb)->xfrm) -return dst_output (skb->sk, skb); +return dst_output (net, skb->sk, skb); err = nf_hook(skb_dst(skb)->ops->family, NF_INET_POST_ROUTING, net, skb->sk, skb,
net/xfrm/xfrm_policy.c +1 -1
@@ -1944,7 +1944,7 @@ static void xfrm_policy_queue_process(unsigned long arg)skb_dst_drop (skb);skb_dst_set (skb, dst); -dst_output (skb->sk, skb); +dst_output (net, skb->sk, skb); } out:
Signature · 1 line
2.2.1
PATCH 5/16 dst: Pass a sk into .local_out
In reply to Eric W. BiedermanFor consistency with the other similar methods in the kernel pass a struct sock into the dst_ops .local_out method.
Simplifying the socket passing case is needed a prequel to passing a struct net reference into .local_out.
--- drivers/net/vrf.c | 4 ++-- include/net/dst_ops.h | 2 +- include/net/ip.h | 1 + include/net/ipv6.h | 1 + net/ipv4/ip_output.c | 2 +- net/ipv4/route.c | 2 +- net/ipv4/xfrm4_policy.c | 2 +- net/ipv6/output_core.c | 2 +- net/ipv6/route.c | 2 +- net/ipv6/xfrm6_policy.c | 2 +- net/xfrm/xfrm_output.c | 2 +- 11 files changed, 12 insertions(+), 10 deletions(-)
drivers/net/vrf.c +2 -2
@@ -74,9 +74,9 @@ static struct dst_entry *vrf_ip_check(struct dst_entry *dst, u32 cookie)return dst; } -static int vrf_ip_local_out (struct sk_buff *skb) +static int vrf_ip_local_out (struct sock *sk,struct sk_buff *skb) { -return ip_local_out (skb); +return ip_local_out_sk (sk, skb); }static unsigned int vrf_v4_mtu (const struct dst_entry *dst)
include/net/dst_ops.h +1 -1
@@ -28,7 +28,7 @@ struct dst_ops { struct sk_buff *skb, u32 mtu);void (*redirect)(struct dst_entry *dst,struct sock *sk,struct sk_buff *skb); -int (*local_out)(struct sk_buff *skb); +int (*local_out)(struct sock *sk,struct sk_buff *skb);struct neighbour * (*neigh_lookup)(const struct dst_entry *dst,struct sk_buff *skb,const void *daddr);
include/net/ip.h +1 -0
@@ -112,6 +112,7 @@ int ip_mc_output(struct sock *sk, struct sk_buff *skb);int ip_do_fragment (struct net *net,struct sock *sk,struct sk_buff *skb,int (*output)(struct net *,struct sock *,struct sk_buff *));void ip_send_check (struct iphdr *ip); +int __ip_local_out_sk (struct sock *sk,struct sk_buff *skb);int __ip_local_out (struct sk_buff *skb);int ip_local_out_sk (struct sock *sk,struct sk_buff *skb);static inline int ip_local_out (struct sk_buff *skb)
include/net/ipv6.h +1 -0
@@ -865,6 +865,7 @@ int ip6_forward(struct sk_buff *skb);int ip6_input (struct sk_buff *skb);int ip6_mc_input (struct sk_buff *skb); +int __ip6_local_out_sk (struct sock *sk,struct sk_buff *skb);int __ip6_local_out (struct sk_buff *skb);int ip6_local_out_sk (struct sock *sk,struct sk_buff *skb);int ip6_local_out (struct sk_buff *skb);
net/ipv4/ip_output.c +1 -1
@@ -96,7 +96,7 @@ void ip_send_check(struct iphdr *iph) }EXPORT_SYMBOL (ip_send_check); -static int __ip_local_out_sk (struct sock *sk,struct sk_buff *skb) +int __ip_local_out_sk (struct sock *sk,struct sk_buff *skb) {struct net *net =dev_net (skb_dst (skb)->dev);struct iphdr *iph =ip_hdr (skb);
net/ipv4/route.c +1 -1
@@ -165,7 +165,7 @@ static struct dst_ops ipv4_dst_ops = { .link_failure = ipv4_link_failure, .update_pmtu = ip_rt_update_pmtu, .redirect = ip_do_redirect, - .local_out = __ip_local_out, + .local_out = __ip_local_out_sk, .neigh_lookup = ipv4_neigh_lookup, };
net/ipv4/xfrm4_policy.c +1 -1
@@ -243,7 +243,7 @@ static struct dst_ops xfrm4_dst_ops = { .cow_metrics = dst_cow_metrics_generic, .destroy = xfrm4_dst_destroy, .ifdown = xfrm4_dst_ifdown, - .local_out = __ip_local_out, + .local_out = __ip_local_out_sk, .gc_thresh = 32768, };
net/ipv6/output_core.c +1 -1
@@ -138,7 +138,7 @@ int ip6_dst_hoplimit(struct dst_entry *dst)EXPORT_SYMBOL (ip6_dst_hoplimit);#endif -static int __ip6_local_out_sk (struct sock *sk,struct sk_buff *skb) +int __ip6_local_out_sk (struct sock *sk,struct sk_buff *skb) {struct net *net =dev_net (skb_dst (skb)->dev);int len;
net/ipv6/route.c +1 -1
@@ -226,7 +226,7 @@ static struct dst_ops ip6_dst_ops_template = { .link_failure = ip6_link_failure, .update_pmtu = ip6_rt_update_pmtu, .redirect = rt6_do_redirect, - .local_out = __ip6_local_out, + .local_out = __ip6_local_out_sk, .neigh_lookup = ip6_neigh_lookup, };
net/ipv6/xfrm6_policy.c +1 -1
@@ -285,7 +285,7 @@ static struct dst_ops xfrm6_dst_ops = { .cow_metrics = dst_cow_metrics_generic, .destroy = xfrm6_dst_destroy, .ifdown = xfrm6_dst_ifdown, - .local_out = __ip6_local_out, + .local_out = __ip6_local_out_sk, .gc_thresh = 32768, };
net/xfrm/xfrm_output.c +1 -1
@@ -136,7 +136,7 @@ int xfrm_output_resume(struct sk_buff *skb, int err)while (likely ((err =xfrm_output_one (skb, err)) ==0 )) {nf_reset (skb); - err =skb_dst (skb)->ops->local_out (skb); + err =skb_dst (skb)->ops->local_out (skb->sk, skb);if (unlikely (err !=1 )) goto out;
Signature · 1 line
2.2.1
PATCH 6/16 ipv4: Merge __ip_local_out and __ip_local_out_sk
In reply to Eric W. Biederman--- include/net/ip.h | 3 +-- net/ipv4/ip_output.c | 9 ++------- net/ipv4/route.c | 2 +- net/ipv4/xfrm4_policy.c | 2 +- 4 files changed, 5 insertions(+), 11 deletions(-)
include/net/ip.h +1 -2
@@ -112,8 +112,7 @@ int ip_mc_output(struct sock *sk, struct sk_buff *skb);int ip_do_fragment (struct net *net,struct sock *sk,struct sk_buff *skb,int (*output)(struct net *,struct sock *,struct sk_buff *));void ip_send_check (struct iphdr *ip); -int __ip_local_out_sk (struct sock *sk,struct sk_buff *skb); -int __ip_local_out (struct sk_buff *skb); +int __ip_local_out (struct sock *sk,struct sk_buff *skb);int ip_local_out_sk (struct sock *sk,struct sk_buff *skb);static inline int ip_local_out (struct sk_buff *skb) {
net/ipv4/ip_output.c +2 -7
@@ -96,7 +96,7 @@ void ip_send_check(struct iphdr *iph) }EXPORT_SYMBOL (ip_send_check); -int __ip_local_out_sk (struct sock *sk,struct sk_buff *skb) +int __ip_local_out (struct sock *sk,struct sk_buff *skb) {struct net *net =dev_net (skb_dst (skb)->dev);struct iphdr *iph =ip_hdr (skb);
@@ -108,17 +108,12 @@ int __ip_local_out_sk(struct sock *sk, struct sk_buff *skb) dst_output); } -int __ip_local_out (struct sk_buff *skb) -{ -return __ip_local_out_sk (skb->sk, skb); -} -int ip_local_out_sk (struct sock *sk,struct sk_buff *skb) {struct net *net =dev_net (skb_dst (skb)->dev);int err; - err =__ip_local_out_sk (sk, skb); + err =__ip_local_out (sk, skb);if (likely (err ==1 )) err =dst_output (net, sk, skb);
net/ipv4/route.c +1 -1
@@ -165,7 +165,7 @@ static struct dst_ops ipv4_dst_ops = { .link_failure = ipv4_link_failure, .update_pmtu = ip_rt_update_pmtu, .redirect = ip_do_redirect, - .local_out = __ip_local_out_sk, + .local_out = __ip_local_out, .neigh_lookup = ipv4_neigh_lookup, };
net/ipv4/xfrm4_policy.c +1 -1
@@ -243,7 +243,7 @@ static struct dst_ops xfrm4_dst_ops = { .cow_metrics = dst_cow_metrics_generic, .destroy = xfrm4_dst_destroy, .ifdown = xfrm4_dst_ifdown, - .local_out = __ip_local_out_sk, + .local_out = __ip_local_out, .gc_thresh = 32768, };
Signature · 1 line
2.2.1
PATCH 7/16 ipv4: Merge ip_local_out and ip_local_out_sk
In reply to Eric W. BiedermanIt is confusing and silly hiding a parameter so modify all of the callers to pass in the appropriate socket or skb->sk if no socket is known.
--- drivers/net/ipvlan/ipvlan_core.c | 2 +- drivers/net/ppp/pptp.c | 2 +- drivers/net/vrf.c | 4 ++-- include/net/ip.h | 6 +----- net/ipv4/igmp.c | 4 ++-- net/ipv4/ip_output.c | 10 +++++----- net/ipv4/ip_tunnel_core.c | 2 +- net/ipv4/netfilter/ipt_SYNPROXY.c | 2 +- net/ipv4/netfilter/nf_dup_ipv4.c | 2 +- net/ipv4/netfilter/nf_reject_ipv4.c | 2 +- net/netfilter/ipvs/ip_vs_xmit.c | 2 +- 11 files changed, 17 insertions(+), 21 deletions(-)
drivers/net/ipvlan/ipvlan_core.c +1 -1
@@ -364,7 +364,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb) }skb_dst_drop (skb);skb_dst_set (skb, &rt->dst); - err =ip_local_out (skb); + err =ip_local_out (skb->sk, skb);if (unlikely (net_xmit_eval (err))) dev->stats.tx_errors++;else
drivers/net/ppp/pptp.c +1 -1
@@ -282,7 +282,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)ip_select_ident (sock_net (sk), skb,NULL );ip_send_check (iph); -ip_local_out (skb); +ip_local_out (skb->sk, skb);return 1 ; tx_error:
drivers/net/vrf.c +2 -2
@@ -76,7 +76,7 @@ static struct dst_entry *vrf_ip_check(struct dst_entry *dst, u32 cookie)static int vrf_ip_local_out (struct sock *sk,struct sk_buff *skb) { -return ip_local_out_sk (sk, skb); +return ip_local_out (sk, skb); }static unsigned int vrf_v4_mtu (const struct dst_entry *dst)
@@ -222,7 +222,7 @@ static netdev_tx_t vrf_process_v4_outbound(struct sk_buff *skb, RT_SCOPE_LINK); } - ret =ip_local_out (skb); + ret =ip_local_out (skb->sk, skb);if (unlikely (net_xmit_eval (ret))) vrf_dev->stats.tx_errors++;else
include/net/ip.h +1 -5
@@ -113,11 +113,7 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, int (*output)(struct net *, struct sock *, struct sk_buff *));void ip_send_check (struct iphdr *ip);int __ip_local_out (struct sock *sk,struct sk_buff *skb); -int ip_local_out_sk (struct sock *sk,struct sk_buff *skb); -static inline int ip_local_out (struct sk_buff *skb) -{ -return ip_local_out_sk (skb->sk, skb); -} +int ip_local_out (struct sock *sk,struct sk_buff *skb);int ip_queue_xmit (struct sock *sk,struct sk_buff *skb,struct flowi *fl);void ip_init (void );
net/ipv4/igmp.c +2 -2
@@ -397,7 +397,7 @@ static int igmpv3_sendpack(struct sk_buff *skb) pig->csum =ip_compute_csum (igmp_hdr (skb), igmplen); -return ip_local_out (skb); +return ip_local_out (skb->sk, skb); }static int grec_size (struct ip_mc_list *pmc,int type,int gdel,int sdel)
@@ -739,7 +739,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc, ih->group = group; ih->csum =ip_compute_csum ((void *)ih,sizeof (struct igmphdr )); -return ip_local_out (skb); +return ip_local_out (skb->sk, skb); }static void igmp_gq_timer_expire (unsigned long data)
net/ipv4/ip_output.c +5 -5
@@ -108,7 +108,7 @@ int __ip_local_out(struct sock *sk, struct sk_buff *skb) dst_output); } -int ip_local_out_sk (struct sock *sk,struct sk_buff *skb) +int ip_local_out (struct sock *sk,struct sk_buff *skb) {struct net *net =dev_net (skb_dst (skb)->dev);int err;
@@ -119,7 +119,7 @@ int ip_local_out_sk(struct sock *sk, struct sk_buff *skb)return err; } -EXPORT_SYMBOL_GPL (ip_local_out_sk); +EXPORT_SYMBOL_GPL (ip_local_out);static inline int ip_select_ttl (struct inet_sock *inet,struct dst_entry *dst) {
@@ -169,7 +169,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, skb->mark = sk->sk_mark;/* Send it out. */ -return ip_local_out (skb); +return ip_local_out (skb->sk, skb); }EXPORT_SYMBOL_GPL (ip_build_and_send_pkt);
@@ -456,7 +456,7 @@ packet_routed: skb->priority = sk->sk_priority; skb->mark = sk->sk_mark; - res =ip_local_out_sk (sk, skb); + res =ip_local_out (sk, skb);rcu_read_unlock ();return res;
@@ -1436,7 +1436,7 @@ int ip_send_skb(struct net *net, struct sk_buff *skb) {int err; - err =ip_local_out (skb); + err =ip_local_out (skb->sk, skb);if (err) {if (err >0 ) err =net_xmit_errno (err);
net/ipv4/ip_tunnel_core.c +1 -1
@@ -79,7 +79,7 @@ int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,__ip_select_ident (dev_net (rt->dst.dev), iph,skb_shinfo (skb)->gso_segs ?:1 ); - err =ip_local_out_sk (sk, skb); + err =ip_local_out (sk, skb);if (unlikely (net_xmit_eval (err))) pkt_len =0 ;return pkt_len;
net/ipv4/netfilter/ipt_SYNPROXY.c +1 -1
@@ -63,7 +63,7 @@ synproxy_send_tcp(const struct synproxy_net *snet,nf_conntrack_get (nfct); } -ip_local_out (nskb); +ip_local_out (nskb->sk, nskb);return ; free_nskb:
net/ipv4/netfilter/nf_dup_ipv4.c +1 -1
@@ -92,7 +92,7 @@ void nf_dup_ipv4(struct net *net, struct sk_buff *skb, unsigned int hooknum,if (nf_dup_ipv4_route (net, skb, gw, oif)) {__this_cpu_write (nf_skb_duplicated, true); -ip_local_out (skb); +ip_local_out (skb->sk, skb);__this_cpu_write (nf_skb_duplicated, false); }else {kfree_skb (skb);
net/ipv4/netfilter/nf_reject_ipv4.c +1 -1
@@ -157,7 +157,7 @@ void nf_send_reset(struct net *net, struct sk_buff *oldskb, int hook)dev_queue_xmit (nskb); } else#endif -ip_local_out (nskb); +ip_local_out (nskb->sk, nskb);return ;
net/netfilter/ipvs/ip_vs_xmit.c +1 -1
@@ -1049,7 +1049,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, ret =ip_vs_tunnel_xmit_prepare (skb, cp);if (ret ==NF_ACCEPT ) -ip_local_out (skb); +ip_local_out (skb->sk, skb);else if (ret ==NF_DROP )kfree_skb (skb);rcu_read_unlock ();
Signature · 1 line
2.2.1
PATCH 8/16 ipv6: Merge __ip6_local_out and __ip6_local_out_sk
In reply to Eric W. BiedermanOnly __ip6_local_out_sk has callers so rename __ip6_local_out_sk __ip6_local_out and remove the previous __ip6_local_out.
--- include/net/ipv6.h | 3 +-- net/ipv6/output_core.c | 9 ++------- net/ipv6/route.c | 2 +- net/ipv6/xfrm6_policy.c | 2 +- 4 files changed, 5 insertions(+), 11 deletions(-)
include/net/ipv6.h +1 -2
@@ -865,8 +865,7 @@ int ip6_forward(struct sk_buff *skb);int ip6_input (struct sk_buff *skb);int ip6_mc_input (struct sk_buff *skb); -int __ip6_local_out_sk (struct sock *sk,struct sk_buff *skb); -int __ip6_local_out (struct sk_buff *skb); +int __ip6_local_out (struct sock *sk,struct sk_buff *skb);int ip6_local_out_sk (struct sock *sk,struct sk_buff *skb);int ip6_local_out (struct sk_buff *skb);
net/ipv6/output_core.c +2 -7
@@ -138,7 +138,7 @@ int ip6_dst_hoplimit(struct dst_entry *dst)EXPORT_SYMBOL (ip6_dst_hoplimit);#endif -int __ip6_local_out_sk (struct sock *sk,struct sk_buff *skb) +int __ip6_local_out (struct sock *sk,struct sk_buff *skb) {struct net *net =dev_net (skb_dst (skb)->dev);int len;
@@ -153,11 +153,6 @@ int __ip6_local_out_sk(struct sock *sk, struct sk_buff *skb) net, sk, skb,NULL ,skb_dst (skb)->dev, dst_output); } - -int __ip6_local_out (struct sk_buff *skb) -{ -return __ip6_local_out_sk (skb->sk, skb); -}EXPORT_SYMBOL_GPL (__ip6_local_out);int ip6_local_out_sk (struct sock *sk,struct sk_buff *skb)
@@ -165,7 +160,7 @@ int ip6_local_out_sk(struct sock *sk, struct sk_buff *skb)struct net *net =dev_net (skb_dst (skb)->dev);int err; - err =__ip6_local_out_sk (sk, skb); + err =__ip6_local_out (sk, skb);if (likely (err ==1 )) err =dst_output (net, sk, skb);
net/ipv6/route.c +1 -1
@@ -226,7 +226,7 @@ static struct dst_ops ip6_dst_ops_template = { .link_failure = ip6_link_failure, .update_pmtu = ip6_rt_update_pmtu, .redirect = rt6_do_redirect, - .local_out = __ip6_local_out_sk, + .local_out = __ip6_local_out, .neigh_lookup = ip6_neigh_lookup, };
net/ipv6/xfrm6_policy.c +1 -1
@@ -285,7 +285,7 @@ static struct dst_ops xfrm6_dst_ops = { .cow_metrics = dst_cow_metrics_generic, .destroy = xfrm6_dst_destroy, .ifdown = xfrm6_dst_ifdown, - .local_out = __ip6_local_out_sk, + .local_out = __ip6_local_out, .gc_thresh = 32768, };
Signature · 1 line
2.2.1
PATCH 9/16 ipv6: Merge ip6_local_out and ip6_local_out_sk
In reply to Eric W. BiedermanStop hidding the sk parameter with an inline helper function and make all of the callers pass it, so that it is clear what the function is doing.
--- drivers/net/ipvlan/ipvlan_core.c | 2 +- include/net/ip6_tunnel.h | 2 +- include/net/ipv6.h | 3 +-- net/ipv6/ip6_output.c | 2 +- net/ipv6/netfilter/ip6t_SYNPROXY.c | 2 +- net/ipv6/netfilter/nf_dup_ipv6.c | 2 +- net/ipv6/netfilter/nf_reject_ipv6.c | 2 +- net/ipv6/output_core.c | 8 +------- net/netfilter/ipvs/ip_vs_xmit.c | 2 +- 9 files changed, 9 insertions(+), 16 deletions(-)
drivers/net/ipvlan/ipvlan_core.c +1 -1
@@ -401,7 +401,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) }skb_dst_drop (skb);skb_dst_set (skb, dst); - err =ip6_local_out (skb); + err =ip6_local_out (skb->sk, skb);if (unlikely (net_xmit_eval (err))) dev->stats.tx_errors++;else
include/net/ip6_tunnel.h +1 -1
@@ -87,7 +87,7 @@ static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb,int pkt_len, err; pkt_len = skb->len -skb_inner_network_offset (skb); - err =ip6_local_out_sk (sk, skb); + err =ip6_local_out (sk, skb);if (net_xmit_eval (err) ==0 ) {struct pcpu_sw_netstats *tstats =this_cpu_ptr (dev->tstats);
include/net/ipv6.h +1 -2
@@ -866,8 +866,7 @@ int ip6_input(struct sk_buff *skb);int ip6_mc_input (struct sk_buff *skb);int __ip6_local_out (struct sock *sk,struct sk_buff *skb); -int ip6_local_out_sk (struct sock *sk,struct sk_buff *skb); -int ip6_local_out (struct sk_buff *skb); +int ip6_local_out (struct sock *sk,struct sk_buff *skb);/* * Extension header (options) processing
net/ipv6/ip6_output.c +1 -1
@@ -1692,7 +1692,7 @@ int ip6_send_skb(struct sk_buff *skb)struct rt6_info *rt = (struct rt6_info *)skb_dst (skb);int err; - err =ip6_local_out (skb); + err =ip6_local_out (skb->sk, skb);if (err) {if (err >0 ) err =net_xmit_errno (err);
net/ipv6/netfilter/ip6t_SYNPROXY.c +1 -1
@@ -76,7 +76,7 @@ synproxy_send_tcp(const struct synproxy_net *snet,nf_conntrack_get (nfct); } -ip6_local_out (nskb); +ip6_local_out (nskb->sk, nskb);return ; free_nskb:
net/ipv6/netfilter/nf_dup_ipv6.c +1 -1
@@ -68,7 +68,7 @@ void nf_dup_ipv6(struct net *net, struct sk_buff *skb, unsigned int hooknum, }if (nf_dup_ipv6_route (net, skb, gw, oif)) {__this_cpu_write (nf_skb_duplicated, true); -ip6_local_out (skb); +ip6_local_out (skb->sk, skb);__this_cpu_write (nf_skb_duplicated, false); }else {kfree_skb (skb);
net/ipv6/netfilter/nf_reject_ipv6.c +1 -1
@@ -206,7 +206,7 @@ void nf_send_reset6(struct net *net, struct sk_buff *oldskb, int hook) dev_queue_xmit(nskb); } else#endif -ip6_local_out (nskb); +ip6_local_out (nskb->sk, nskb); }EXPORT_SYMBOL_GPL (nf_send_reset6);
net/ipv6/output_core.c +1 -7
@@ -155,7 +155,7 @@ int __ip6_local_out(struct sock *sk, struct sk_buff *skb) }EXPORT_SYMBOL_GPL (__ip6_local_out); -int ip6_local_out_sk (struct sock *sk,struct sk_buff *skb) +int ip6_local_out (struct sock *sk,struct sk_buff *skb) {struct net *net =dev_net (skb_dst (skb)->dev);int err;
@@ -166,10 +166,4 @@ int ip6_local_out_sk(struct sock *sk, struct sk_buff *skb)return err; } -EXPORT_SYMBOL_GPL (ip6_local_out_sk); - -int ip6_local_out (struct sk_buff *skb) -{ -return ip6_local_out_sk (skb->sk, skb); -}EXPORT_SYMBOL_GPL (ip6_local_out);
net/netfilter/ipvs/ip_vs_xmit.c +1 -1
@@ -1141,7 +1141,7 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, ret =ip_vs_tunnel_xmit_prepare (skb, cp);if (ret ==NF_ACCEPT ) -ip6_local_out (skb); +ip6_local_out (skb->sk, skb);else if (ret ==NF_DROP )kfree_skb (skb);rcu_read_unlock ();
Signature · 1 line
2.2.1
PATCH 10/16 ipv4: Cache net in iptunnel_xmit
In reply to Eric W. BiedermanStore net in a variable in ip_tunnel_xmit so it does not need to be recomputed when it is used again.
--- net/ipv4/ip_tunnel_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv4/ip_tunnel_core.c +2 -2
@@ -53,6 +53,7 @@ int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, __u8 tos, __u8 ttl, __be16 df, bool xnet) { int pkt_len = skb->len - skb_inner_network_offset(skb); +struct net *net =dev_net (rt->dst.dev);struct iphdr *iph;int err;
@@ -76,8 +77,7 @@ int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, iph->daddr = dst; iph->saddr = src; iph->ttl = ttl; -__ip_select_ident (dev_net (rt->dst.dev), iph, -skb_shinfo (skb)->gso_segs ?:1 ); +__ip_select_ident (net, iph,skb_shinfo (skb)->gso_segs ?:1 ); err =ip_local_out (sk, skb);if (unlikely (net_xmit_eval (err)))
Signature · 1 line
2.2.1
PATCH 11/16 ipv4: Cache net in ip_build_and_send_pkt and ip_queue_xmit
In reply to Eric W. BiedermanCompute net and store it in a variable in the functions ip_build_and_send_pkt and ip_queue_xmit so that it does not need to be recomputed next time it is needed.
--- net/ipv4/ip_output.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
net/ipv4/ip_output.c +6 -4
@@ -139,6 +139,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, {struct inet_sock *inet =inet_sk (sk);struct rtable *rt =skb_rtable (skb); +struct net *net =sock_net (sk);struct iphdr *iph;/* Build the IP header. */
@@ -157,7 +158,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, iph->id =0 ; }else { iph->frag_off =0 ; -__ip_select_ident (sock_net (sk), iph,1 ); +__ip_select_ident (net, iph,1 ); }if (opt && opt->opt.optlen) {
@@ -382,6 +383,7 @@ static void ip_copy_addrs(struct iphdr *iph, const struct flowi4 *fl4)int ip_queue_xmit (struct sock *sk,struct sk_buff *skb,struct flowi *fl) {struct inet_sock *inet =inet_sk (sk); +struct net *net =sock_net (sk);struct ip_options_rcu *inet_opt;struct flowi4 *fl4;struct rtable *rt;
@@ -412,7 +414,7 @@ int ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl)* keep trying until route appears or the connection times * itself out. */ - rt = ip_route_output_ports(sock_net(sk), fl4, sk, + rt = ip_route_output_ports(net, fl4, sk, daddr, inet->inet_saddr, inet->inet_dport, inet->inet_sport,
@@ -449,7 +451,7 @@ packet_routed:ip_options_build (skb, &inet_opt->opt, inet->inet_daddr, rt,0 ); } -ip_select_ident_segs (sock_net (sk), skb, sk, +ip_select_ident_segs (net, skb, sk,skb_shinfo (skb)->gso_segs ?:1 );/* TODO : should we use skb->sk here instead of sk ? */
@@ -462,7 +464,7 @@ packet_routed: no_route:rcu_read_unlock (); -IP_INC_STATS (sock_net (sk),IPSTATS_MIB_OUTNOROUTES ); +IP_INC_STATS (net,IPSTATS_MIB_OUTNOROUTES );kfree_skb (skb);return -EHOSTUNREACH ; }
Signature · 1 line
2.2.1
PATCH 12/16 ppp: Cache net in pptp_xmit
In reply to Eric W. BiedermanCompute net and store it in a variable in pptp_xmit, so that the value can be reused the next time it is needed.
--- drivers/net/ppp/pptp.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ppp/pptp.c +3 -2
@@ -169,6 +169,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb) {struct sock *sk = (struct sock *) chan->private;struct pppox_sock *po =pppox_sk (sk); +struct net *net =sock_net (sk);struct pptp_opt *opt = &po->proto.pptp;struct pptp_gre_header *hdr;unsigned int header_len =sizeof (*hdr);
@@ -187,7 +188,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)if (sk_pppox (po)->sk_state &PPPOX_DEAD ) goto tx_error; - rt = ip_route_output_ports(sock_net(sk), &fl4, NULL, + rt = ip_route_output_ports(net, &fl4, NULL, opt->dst_addr.sin_addr.s_addr, opt->src_addr.sin_addr.s_addr, 0, 0, IPPROTO_GRE,
@@ -279,7 +280,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)nf_reset (skb); skb->ip_summed =CHECKSUM_NONE ; -ip_select_ident (sock_net (sk), skb,NULL ); +ip_select_ident (net, skb,NULL );ip_send_check (iph);ip_local_out (skb->sk, skb);
Signature · 1 line
2.2.1
PATCH 13/16 ipvlan: Cache net in ipvlan_process_v4_outbound and ipvlan_process_v6_outbound
In reply to Eric W. BiedermanCompute net once in ipvlan_process_v4_outbound and ipvlan_process_v6_outbound and store it in a variable so that net does not need to be recomputed next time it is used.
--- drivers/net/ipvlan/ipvlan_core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/ipvlan/ipvlan_core.c +4 -2
@@ -344,6 +344,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb) {const struct iphdr *ip4h =ip_hdr (skb);struct net_device *dev = skb->dev; +struct net *net =dev_net (dev);struct rtable *rt;int err, ret =NET_XMIT_DROP ;struct flowi4 fl4 = {
@@ -354,7 +355,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb) .saddr = ip4h->saddr, }; - rt =ip_route_output_flow (dev_net (dev), &fl4,NULL ); + rt =ip_route_output_flow (net, &fl4,NULL );if (IS_ERR (rt)) goto err;
@@ -381,6 +382,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) {const struct ipv6hdr *ip6h =ipv6_hdr (skb);struct net_device *dev = skb->dev; +struct net *net =dev_net (dev);struct dst_entry *dst;int err, ret =NET_XMIT_DROP ;struct flowi6 fl6 = {
@@ -393,7 +395,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) .flowi6_proto = ip6h->nexthdr, }; - dst =ip6_route_output (dev_net (dev),NULL , &fl6); + dst =ip6_route_output (net,NULL , &fl6);if (dst->error) { ret = dst->error;dst_release (dst);
Signature · 1 line
2.2.1
PATCH 14/16 ipv4,ipv6: Pass net into __ip_local_out and __ip6_local_out
In reply to Eric W. Biederman--- drivers/net/vrf.c | 2 +- include/net/dst_ops.h | 3 ++- include/net/ip.h | 2 +- include/net/ipv6.h | 2 +- net/ipv4/ip_output.c | 5 ++--- net/ipv6/output_core.c | 5 ++--- net/xfrm/xfrm_output.c | 2 +- 7 files changed, 10 insertions(+), 11 deletions(-)
drivers/net/vrf.c +1 -1
@@ -74,7 +74,7 @@ static struct dst_entry *vrf_ip_check(struct dst_entry *dst, u32 cookie)return dst; } -static int vrf_ip_local_out (struct sock *sk,struct sk_buff *skb) +static int vrf_ip_local_out (struct net *net,struct sock *sk,struct sk_buff *skb) {return ip_local_out (sk, skb); }
include/net/dst_ops.h +2 -1
@@ -9,6 +9,7 @@ struct kmem_cachep;struct net_device ;struct sk_buff ;struct sock ; +struct net ;struct dst_ops {unsigned short family;
@@ -28,7 +29,7 @@ struct dst_ops { struct sk_buff *skb, u32 mtu);void (*redirect)(struct dst_entry *dst,struct sock *sk,struct sk_buff *skb); -int (*local_out)(struct sock *sk,struct sk_buff *skb); +int (*local_out)(struct net *net,struct sock *sk,struct sk_buff *skb);struct neighbour * (*neigh_lookup)(const struct dst_entry *dst,struct sk_buff *skb,const void *daddr);
include/net/ip.h +1 -1
@@ -112,7 +112,7 @@ int ip_mc_output(struct sock *sk, struct sk_buff *skb);int ip_do_fragment (struct net *net,struct sock *sk,struct sk_buff *skb,int (*output)(struct net *,struct sock *,struct sk_buff *));void ip_send_check (struct iphdr *ip); -int __ip_local_out (struct sock *sk,struct sk_buff *skb); +int __ip_local_out (struct net *net,struct sock *sk,struct sk_buff *skb);int ip_local_out (struct sock *sk,struct sk_buff *skb);int ip_queue_xmit (struct sock *sk,struct sk_buff *skb,struct flowi *fl);
include/net/ipv6.h +1 -1
@@ -865,7 +865,7 @@ int ip6_forward(struct sk_buff *skb);int ip6_input (struct sk_buff *skb);int ip6_mc_input (struct sk_buff *skb); -int __ip6_local_out (struct sock *sk,struct sk_buff *skb); +int __ip6_local_out (struct net *net,struct sock *sk,struct sk_buff *skb);int ip6_local_out (struct sock *sk,struct sk_buff *skb);/*
net/ipv4/ip_output.c +2 -3
@@ -96,9 +96,8 @@ void ip_send_check(struct iphdr *iph) }EXPORT_SYMBOL (ip_send_check); -int __ip_local_out (struct sock *sk,struct sk_buff *skb) +int __ip_local_out (struct net *net,struct sock *sk,struct sk_buff *skb) { -struct net *net =dev_net (skb_dst (skb)->dev);struct iphdr *iph =ip_hdr (skb); iph->tot_len =htons (skb->len);
@@ -113,7 +112,7 @@ int ip_local_out(struct sock *sk, struct sk_buff *skb)struct net *net =dev_net (skb_dst (skb)->dev);int err; - err =__ip_local_out (sk, skb); + err =__ip_local_out (net, sk, skb);if (likely (err ==1 )) err =dst_output (net, sk, skb);
net/ipv6/output_core.c +2 -3
@@ -138,9 +138,8 @@ int ip6_dst_hoplimit(struct dst_entry *dst)EXPORT_SYMBOL (ip6_dst_hoplimit);#endif -int __ip6_local_out (struct sock *sk,struct sk_buff *skb) +int __ip6_local_out (struct net *net,struct sock *sk,struct sk_buff *skb) { -struct net *net =dev_net (skb_dst (skb)->dev);int len; len = skb->len -sizeof (struct ipv6hdr );
@@ -160,7 +159,7 @@ int ip6_local_out(struct sock *sk, struct sk_buff *skb)struct net *net =dev_net (skb_dst (skb)->dev);int err; - err =__ip6_local_out (sk, skb); + err =__ip6_local_out (net, sk, skb);if (likely (err ==1 )) err =dst_output (net, sk, skb);
net/xfrm/xfrm_output.c +1 -1
@@ -136,7 +136,7 @@ int xfrm_output_resume(struct sk_buff *skb, int err)while (likely ((err =xfrm_output_one (skb, err)) ==0 )) {nf_reset (skb); - err =skb_dst (skb)->ops->local_out (skb->sk, skb); + err =skb_dst (skb)->ops->local_out (net, skb->sk, skb);if (unlikely (err !=1 )) goto out;
Signature · 1 line
2.2.1
PATCH 15/16 ipv4,ipv6: Pass net into ip_local_out and ip6_local_out
In reply to Eric W. Biederman--- drivers/net/ipvlan/ipvlan_core.c | 4 ++-- drivers/net/ppp/pptp.c | 2 +- drivers/net/vrf.c | 4 ++-- include/net/ip.h | 2 +- include/net/ip6_tunnel.h | 2 +- include/net/ipv6.h | 2 +- net/ipv4/igmp.c | 4 ++-- net/ipv4/ip_output.c | 9 ++++----- net/ipv4/ip_tunnel_core.c | 2 +- net/ipv4/netfilter/ipt_SYNPROXY.c | 2 +- net/ipv4/netfilter/nf_dup_ipv4.c | 2 +- net/ipv4/netfilter/nf_reject_ipv4.c | 2 +- net/ipv6/ip6_output.c | 2 +- net/ipv6/netfilter/ip6t_SYNPROXY.c | 2 +- net/ipv6/netfilter/nf_dup_ipv6.c | 2 +- net/ipv6/netfilter/nf_reject_ipv6.c | 2 +- net/ipv6/output_core.c | 3 +-- net/netfilter/ipvs/ip_vs_xmit.c | 4 ++-- 18 files changed, 25 insertions(+), 27 deletions(-)
drivers/net/ipvlan/ipvlan_core.c +2 -2
@@ -365,7 +365,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb) }skb_dst_drop (skb);skb_dst_set (skb, &rt->dst); - err =ip_local_out (skb->sk, skb); + err =ip_local_out (net, skb->sk, skb);if (unlikely (net_xmit_eval (err))) dev->stats.tx_errors++;else
@@ -403,7 +403,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) }skb_dst_drop (skb);skb_dst_set (skb, dst); - err =ip6_local_out (skb->sk, skb); + err =ip6_local_out (net, skb->sk, skb);if (unlikely (net_xmit_eval (err))) dev->stats.tx_errors++;else
drivers/net/ppp/pptp.c +1 -1
@@ -283,7 +283,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)ip_select_ident (net, skb,NULL );ip_send_check (iph); -ip_local_out (skb->sk, skb); +ip_local_out (net, skb->sk, skb);return 1 ; tx_error:
drivers/net/vrf.c +2 -2
@@ -76,7 +76,7 @@ static struct dst_entry *vrf_ip_check(struct dst_entry *dst, u32 cookie)static int vrf_ip_local_out (struct net *net,struct sock *sk,struct sk_buff *skb) { -return ip_local_out (sk, skb); +return ip_local_out (net, sk, skb); }static unsigned int vrf_v4_mtu (const struct dst_entry *dst)
@@ -222,7 +222,7 @@ static netdev_tx_t vrf_process_v4_outbound(struct sk_buff *skb, RT_SCOPE_LINK); } - ret =ip_local_out (skb->sk, skb); + ret =ip_local_out (dev_net (skb_dst (skb)->dev), skb->sk, skb);if (unlikely (net_xmit_eval (ret))) vrf_dev->stats.tx_errors++;else
include/net/ip.h +1 -1
@@ -113,7 +113,7 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, int (*output)(struct net *, struct sock *, struct sk_buff *));void ip_send_check (struct iphdr *ip);int __ip_local_out (struct net *net,struct sock *sk,struct sk_buff *skb); -int ip_local_out (struct sock *sk,struct sk_buff *skb); +int ip_local_out (struct net *net,struct sock *sk,struct sk_buff *skb);int ip_queue_xmit (struct sock *sk,struct sk_buff *skb,struct flowi *fl);void ip_init (void );
include/net/ip6_tunnel.h +1 -1
@@ -87,7 +87,7 @@ static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb,int pkt_len, err; pkt_len = skb->len -skb_inner_network_offset (skb); - err =ip6_local_out (sk, skb); + err =ip6_local_out (dev_net (skb_dst (skb)->dev), sk, skb);if (net_xmit_eval (err) ==0 ) {struct pcpu_sw_netstats *tstats =this_cpu_ptr (dev->tstats);
include/net/ipv6.h +1 -1
@@ -866,7 +866,7 @@ int ip6_input(struct sk_buff *skb);int ip6_mc_input (struct sk_buff *skb);int __ip6_local_out (struct net *net,struct sock *sk,struct sk_buff *skb); -int ip6_local_out (struct sock *sk,struct sk_buff *skb); +int ip6_local_out (struct net *net,struct sock *sk,struct sk_buff *skb);/* * Extension header (options) processing
net/ipv4/igmp.c +2 -2
@@ -397,7 +397,7 @@ static int igmpv3_sendpack(struct sk_buff *skb) pig->csum =ip_compute_csum (igmp_hdr (skb), igmplen); -return ip_local_out (skb->sk, skb); +return ip_local_out (dev_net (skb_dst (skb)->dev), skb->sk, skb); }static int grec_size (struct ip_mc_list *pmc,int type,int gdel,int sdel)
@@ -739,7 +739,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc, ih->group = group; ih->csum =ip_compute_csum ((void *)ih,sizeof (struct igmphdr )); -return ip_local_out (skb->sk, skb); +return ip_local_out (net, skb->sk, skb); }static void igmp_gq_timer_expire (unsigned long data)
net/ipv4/ip_output.c +4 -5
@@ -107,9 +107,8 @@ int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb) dst_output); } -int ip_local_out (struct sock *sk,struct sk_buff *skb) +int ip_local_out (struct net *net,struct sock *sk,struct sk_buff *skb) { -struct net *net =dev_net (skb_dst (skb)->dev);int err; err =__ip_local_out (net, sk, skb);
@@ -169,7 +168,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, skb->mark = sk->sk_mark;/* Send it out. */ -return ip_local_out (skb->sk, skb); +return ip_local_out (net, skb->sk, skb); }EXPORT_SYMBOL_GPL (ip_build_and_send_pkt);
@@ -457,7 +456,7 @@ packet_routed: skb->priority = sk->sk_priority; skb->mark = sk->sk_mark; - res =ip_local_out (sk, skb); + res =ip_local_out (net, sk, skb);rcu_read_unlock ();return res;
@@ -1437,7 +1436,7 @@ int ip_send_skb(struct net *net, struct sk_buff *skb) {int err; - err =ip_local_out (skb->sk, skb); + err =ip_local_out (net, skb->sk, skb);if (err) {if (err >0 ) err =net_xmit_errno (err);
net/ipv4/ip_tunnel_core.c +1 -1
@@ -79,7 +79,7 @@ int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, iph->ttl = ttl;__ip_select_ident (net, iph,skb_shinfo (skb)->gso_segs ?:1 ); - err =ip_local_out (sk, skb); + err =ip_local_out (net, sk, skb);if (unlikely (net_xmit_eval (err))) pkt_len =0 ;return pkt_len;
net/ipv4/netfilter/ipt_SYNPROXY.c +1 -1
@@ -63,7 +63,7 @@ synproxy_send_tcp(const struct synproxy_net *snet,nf_conntrack_get (nfct); } -ip_local_out (nskb->sk, nskb); +ip_local_out (net, nskb->sk, nskb);return ; free_nskb:
net/ipv4/netfilter/nf_dup_ipv4.c +1 -1
@@ -92,7 +92,7 @@ void nf_dup_ipv4(struct net *net, struct sk_buff *skb, unsigned int hooknum,if (nf_dup_ipv4_route (net, skb, gw, oif)) {__this_cpu_write (nf_skb_duplicated, true); -ip_local_out (skb->sk, skb); +ip_local_out (net, skb->sk, skb);__this_cpu_write (nf_skb_duplicated, false); }else {kfree_skb (skb);
net/ipv4/netfilter/nf_reject_ipv4.c +1 -1
@@ -157,7 +157,7 @@ void nf_send_reset(struct net *net, struct sk_buff *oldskb, int hook)dev_queue_xmit (nskb); } else#endif -ip_local_out (nskb->sk, nskb); +ip_local_out (net, nskb->sk, nskb);return ;
net/ipv6/ip6_output.c +1 -1
@@ -1692,7 +1692,7 @@ int ip6_send_skb(struct sk_buff *skb)struct rt6_info *rt = (struct rt6_info *)skb_dst (skb);int err; - err =ip6_local_out (skb->sk, skb); + err =ip6_local_out (net, skb->sk, skb);if (err) {if (err >0 ) err =net_xmit_errno (err);
net/ipv6/netfilter/ip6t_SYNPROXY.c +1 -1
@@ -76,7 +76,7 @@ synproxy_send_tcp(const struct synproxy_net *snet,nf_conntrack_get (nfct); } -ip6_local_out (nskb->sk, nskb); +ip6_local_out (net, nskb->sk, nskb);return ; free_nskb:
net/ipv6/netfilter/nf_dup_ipv6.c +1 -1
@@ -68,7 +68,7 @@ void nf_dup_ipv6(struct net *net, struct sk_buff *skb, unsigned int hooknum, }if (nf_dup_ipv6_route (net, skb, gw, oif)) {__this_cpu_write (nf_skb_duplicated, true); -ip6_local_out (skb->sk, skb); +ip6_local_out (net, skb->sk, skb);__this_cpu_write (nf_skb_duplicated, false); }else {kfree_skb (skb);
net/ipv6/netfilter/nf_reject_ipv6.c +1 -1
@@ -206,7 +206,7 @@ void nf_send_reset6(struct net *net, struct sk_buff *oldskb, int hook) dev_queue_xmit(nskb); } else#endif -ip6_local_out (nskb->sk, nskb); +ip6_local_out (net, nskb->sk, nskb); }EXPORT_SYMBOL_GPL (nf_send_reset6);
net/ipv6/output_core.c +1 -2
@@ -154,9 +154,8 @@ int __ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb) }EXPORT_SYMBOL_GPL (__ip6_local_out); -int ip6_local_out (struct sock *sk,struct sk_buff *skb) +int ip6_local_out (struct net *net,struct sock *sk,struct sk_buff *skb) { -struct net *net =dev_net (skb_dst (skb)->dev);int err; err =__ip6_local_out (net, sk, skb);
net/netfilter/ipvs/ip_vs_xmit.c +2 -2
@@ -1049,7 +1049,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, ret =ip_vs_tunnel_xmit_prepare (skb, cp);if (ret ==NF_ACCEPT ) -ip_local_out (skb->sk, skb); +ip_local_out (net, skb->sk, skb);else if (ret ==NF_DROP )kfree_skb (skb);rcu_read_unlock ();
@@ -1141,7 +1141,7 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, ret =ip_vs_tunnel_xmit_prepare (skb, cp);if (ret ==NF_ACCEPT ) -ip6_local_out (skb->sk, skb); +ip6_local_out (cp->ipvs->net, skb->sk, skb);else if (ret ==NF_DROP )kfree_skb (skb);rcu_read_unlock ();
Signature · 1 line
2.2.1
PATCH 16/16 dst: Pass net into dst->output
In reply to Eric W. BiedermanThe network namespace is already passed into dst_output pass it into dst->output lwt->output and friends.
--- drivers/net/vrf.c | 3 +-- include/net/dst.h | 8 ++++---- include/net/ip.h | 4 ++-- include/net/ipv6.h | 2 +- include/net/lwtunnel.h | 8 ++++---- include/net/xfrm.h | 6 +++--- net/core/dst.c | 14 +++++++------- net/core/lwtunnel.c | 4 ++-- net/decnet/dn_route.c | 6 +++--- net/ipv4/ip_output.c | 6 ++---- net/ipv4/route.c | 4 ++-- net/ipv4/xfrm4_output.c | 4 +--- net/ipv6/ila.c | 4 ++-- net/ipv6/ip6_output.c | 3 +-- net/ipv6/route.c | 14 +++++++------- net/ipv6/xfrm6_output.c | 4 +--- net/mpls/mpls_iptunnel.c | 2 +- net/xfrm/xfrm_policy.c | 2 +- 18 files changed, 45 insertions(+), 53 deletions(-)
drivers/net/vrf.c +1 -2
@@ -312,10 +312,9 @@ err:return ret; } -static int vrf_output (struct sock *sk,struct sk_buff *skb) +static int vrf_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct net_device *dev =skb_dst (skb)->dev; -struct net *net =dev_net (dev);IP_UPD_PO_STATS (net,IPSTATS_MIB_OUT , skb->len);
include/net/dst.h +4 -4
@@ -45,7 +45,7 @@ struct dst_entry {void *__pad1;#endif int (*input)(struct sk_buff *); -int (*output)(struct sock *sk,struct sk_buff *skb); +int (*output)(struct net *net,struct sock *sk,struct sk_buff *skb);unsigned short flags;#define DST_HOST 0x0001
@@ -365,10 +365,10 @@ static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev,__skb_tunnel_rx (skb, dev, net); } -int dst_discard_sk (struct sock *sk,struct sk_buff *skb); +int dst_discard_out (struct net *net,struct sock *sk,struct sk_buff *skb);static inline int dst_discard (struct sk_buff *skb) { -return dst_discard_sk (skb->sk, skb); +return dst_discard_out (&init_net, skb->sk, skb); }void *dst_alloc (struct dst_ops *ops,struct net_device *dev,int initial_ref,int initial_obsolete,unsigned short flags);
@@ -456,7 +456,7 @@ static inline void dst_set_expires(struct dst_entry *dst, int timeout)/* Output packet to network from transport. */ static inline int dst_output (struct net *net,struct sock *sk,struct sk_buff *skb) { -return skb_dst (skb)->output (sk, skb); +return skb_dst (skb)->output (net, sk, skb); }/* Input packet from network to transport. */
include/net/ip.h +2 -2
@@ -107,8 +107,8 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev);int ip_local_deliver (struct sk_buff *skb);int ip_mr_input (struct sk_buff *skb); -int ip_output (struct sock *sk,struct sk_buff *skb); -int ip_mc_output (struct sock *sk,struct sk_buff *skb); +int ip_output (struct net *net,struct sock *sk,struct sk_buff *skb); +int ip_mc_output (struct net *net,struct sock *sk,struct sk_buff *skb);int ip_do_fragment (struct net *net,struct sock *sk,struct sk_buff *skb,int (*output)(struct net *,struct sock *,struct sk_buff *));void ip_send_check (struct iphdr *ip);
include/net/ipv6.h +1 -1
@@ -860,7 +860,7 @@ struct dst_entry *ip6_blackhole_route(struct net *net,* skb processing functions */ -int ip6_output (struct sock *sk,struct sk_buff *skb); +int ip6_output (struct net *net,struct sock *sk,struct sk_buff *skb);int ip6_forward (struct sk_buff *skb);int ip6_input (struct sk_buff *skb);int ip6_mc_input (struct sk_buff *skb);
include/net/lwtunnel.h +4 -4
@@ -18,7 +18,7 @@ struct lwtunnel_state {__u16 type;__u16 flags;atomic_t refcnt; -int (*orig_output)(struct sock *sk,struct sk_buff *skb); +int (*orig_output)(struct net *net,struct sock *sk,struct sk_buff *skb);int (*orig_input)(struct sk_buff *);int len;__u8 data[0 ];
@@ -28,7 +28,7 @@ struct lwtunnel_encap_ops {int (*build_state)(struct net_device *dev,struct nlattr *encap,unsigned int family,const void *cfg,struct lwtunnel_state **ts); -int (*output)(struct sock *sk,struct sk_buff *skb); +int (*output)(struct net *net,struct sock *sk,struct sk_buff *skb);int (*input)(struct sk_buff *skb);int (*fill_encap)(struct sk_buff *skb,struct lwtunnel_state *lwtstate);
@@ -88,7 +88,7 @@ int lwtunnel_fill_encap(struct sk_buff *skb,int lwtunnel_get_encap_size (struct lwtunnel_state *lwtstate);struct lwtunnel_state *lwtunnel_state_alloc (int hdr_len);int lwtunnel_cmp_encap (struct lwtunnel_state *a,struct lwtunnel_state *b); -int lwtunnel_output (struct sock *sk,struct sk_buff *skb); +int lwtunnel_output (struct net *net,struct sock *sk,struct sk_buff *skb);int lwtunnel_input (struct sk_buff *skb);#else
@@ -160,7 +160,7 @@ static inline int lwtunnel_cmp_encap(struct lwtunnel_state *a,return 0 ; } -static inline int lwtunnel_output (struct sock *sk,struct sk_buff *skb) +static inline int lwtunnel_output (struct net *net,struct sock *sk,struct sk_buff *skb) {return -EOPNOTSUPP ; }
include/net/xfrm.h +3 -3
@@ -333,7 +333,7 @@ struct xfrm_state_afinfo { const xfrm_address_t *saddr);int (*tmpl_sort)(struct xfrm_tmpl **dst,struct xfrm_tmpl **src,int n);int (*state_sort)(struct xfrm_state **dst,struct xfrm_state **src,int n); -int (*output)(struct sock *sk,struct sk_buff *skb); +int (*output)(struct net *net,struct sock *sk,struct sk_buff *skb);int (*output_finish)(struct sock *sk,struct sk_buff *skb);int (*extract_input)(struct xfrm_state *x,struct sk_buff *skb);
@@ -1527,7 +1527,7 @@ static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi)int xfrm4_extract_output (struct xfrm_state *x,struct sk_buff *skb);int xfrm4_prepare_output (struct xfrm_state *x,struct sk_buff *skb); -int xfrm4_output (struct sock *sk,struct sk_buff *skb); +int xfrm4_output (struct net *net,struct sock *sk,struct sk_buff *skb);int xfrm4_output_finish (struct sock *sk,struct sk_buff *skb);int xfrm4_rcv_cb (struct sk_buff *skb,u8 protocol,int err);int xfrm4_protocol_register (struct xfrm4_protocol *handler,unsigned char protocol);
@@ -1552,7 +1552,7 @@ __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr);__be32 xfrm6_tunnel_spi_lookup (struct net *net,const xfrm_address_t *saddr);int xfrm6_extract_output (struct xfrm_state *x,struct sk_buff *skb);int xfrm6_prepare_output (struct xfrm_state *x,struct sk_buff *skb); -int xfrm6_output (struct sock *sk,struct sk_buff *skb); +int xfrm6_output (struct net *net,struct sock *sk,struct sk_buff *skb);int xfrm6_output_finish (struct sock *sk,struct sk_buff *skb);int xfrm6_find_1stfragopt (struct xfrm_state *x,struct sk_buff *skb,u8 **prevhdr);
net/core/dst.c +7 -7
@@ -144,12 +144,12 @@ loop:mutex_unlock (&dst_gc_mutex); } -int dst_discard_sk (struct sock *sk,struct sk_buff *skb) +int dst_discard_out (struct net *net,struct sock *sk,struct sk_buff *skb) {kfree_skb (skb);return 0 ; } -EXPORT_SYMBOL (dst_discard_sk); +EXPORT_SYMBOL (dst_discard_out);const u32 dst_default_metrics[RTAX_MAX +1 ] = {/* This initializer is needed to force linker to place this variable
@@ -177,7 +177,7 @@ void dst_init(struct dst_entry *dst, struct dst_ops *ops, dst->xfrm =NULL ;#endif dst->input = dst_discard; - dst->output = dst_discard_sk; + dst->output = dst_discard_out; dst->error =0 ; dst->obsolete = initial_obsolete; dst->header_len =0 ;
@@ -224,7 +224,7 @@ static void ___dst_free(struct dst_entry *dst)*/ if (dst->dev ==NULL || !(dst->dev->flags&IFF_UP )) { dst->input = dst_discard; - dst->output = dst_discard_sk; + dst->output = dst_discard_out; } dst->obsolete =DST_OBSOLETE_DEAD ; }
@@ -352,7 +352,7 @@ static struct dst_ops md_dst_ops = { .family = AF_UNSPEC, }; -static int dst_md_discard_sk (struct sock *sk,struct sk_buff *skb) +static int dst_md_discard_out (struct net *net,struct sock *sk,struct sk_buff *skb) {WARN_ONCE (1 ,"Attempting to call output on metadata dst\n" );kfree_skb (skb);
@@ -375,7 +375,7 @@ static void __metadata_dst_init(struct metadata_dst *md_dst, u8 optslen) DST_METADATA | DST_NOCACHE | DST_NOCOUNT); dst->input = dst_md_discard; - dst->output = dst_md_discard_sk; + dst->output = dst_md_discard_out;memset (dst +1 ,0 ,sizeof (*md_dst) + optslen -sizeof (*dst)); }
@@ -430,7 +430,7 @@ static void dst_ifdown(struct dst_entry *dst, struct net_device *dev,if (!unregister) { dst->input = dst_discard; - dst->output = dst_discard_sk; + dst->output = dst_discard_out; }else { dst->dev =dev_net (dst->dev)->loopback_dev;dev_hold (dst->dev);
net/core/lwtunnel.c +2 -2
@@ -180,7 +180,7 @@ int lwtunnel_cmp_encap(struct lwtunnel_state *a, struct lwtunnel_state *b) }EXPORT_SYMBOL (lwtunnel_cmp_encap); -int lwtunnel_output (struct sock *sk,struct sk_buff *skb) +int lwtunnel_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct dst_entry *dst =skb_dst (skb);const struct lwtunnel_encap_ops *ops;
@@ -199,7 +199,7 @@ int lwtunnel_output(struct sock *sk, struct sk_buff *skb)rcu_read_lock (); ops =rcu_dereference (lwtun_encaps[lwtstate->type]);if (likely (ops && ops->output)) - ret = ops->output (sk, skb); + ret = ops->output (net, sk, skb);rcu_read_unlock ();if (ret == -EOPNOTSUPP )
net/decnet/dn_route.c +3 -3
@@ -744,7 +744,7 @@ out:return NET_RX_DROP ; } -static int dn_output (struct sock *sk,struct sk_buff *skb) +static int dn_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct dst_entry *dst =skb_dst (skb);struct dn_route *rt = (struct dn_route *)dst;
@@ -832,7 +832,7 @@ drop:* Used to catch bugs. This should never normally get * called. */ -static int dn_rt_bug_sk (struct sock *sk,struct sk_buff *skb) +static int dn_rt_bug_out (struct net *net,struct sock *sk,struct sk_buff *skb) {struct dn_skb_cb *cb =DN_SKB_CB (skb);
@@ -1469,7 +1469,7 @@ make_route: rt->n = neigh; rt->dst.lastuse = jiffies; - rt->dst.output = dn_rt_bug_sk; + rt->dst.output = dn_rt_bug_out;switch (res.type) {case RTN_UNICAST : rt->dst.input = dn_forward;
net/ipv4/ip_output.c +2 -4
@@ -284,11 +284,10 @@ static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *skreturn ip_finish_output2 (net, sk, skb); } -int ip_mc_output (struct sock *sk,struct sk_buff *skb) +int ip_mc_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct rtable *rt =skb_rtable (skb);struct net_device *dev = rt->dst.dev; -struct net *net =dev_net (dev);/* * If the indicated interface is up and running, send the packet.
@@ -347,10 +346,9 @@ int ip_mc_output(struct sock *sk, struct sk_buff *skb) !(IPCB(skb)->flags & IPSKB_REROUTED)); } -int ip_output (struct sock *sk,struct sk_buff *skb) +int ip_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct net_device *dev =skb_dst (skb)->dev; -struct net *net =dev_net (dev);IP_UPD_PO_STATS (net,IPSTATS_MIB_OUT , skb->len);
net/ipv4/route.c +2 -2
@@ -1152,7 +1152,7 @@ static void ipv4_link_failure(struct sk_buff *skb)dst_set_expires (&rt->dst,0 ); } -static int ip_rt_bug (struct sock *sk,struct sk_buff *skb) +static int ip_rt_bug (struct net *net,struct sock *sk,struct sk_buff *skb) { pr_debug("%s: %pI4 -> %pI4, %s\n", __func__, &ip_hdr(skb)->saddr, &ip_hdr(skb)->daddr,
@@ -2303,7 +2303,7 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or new->__use =1 ; new->input = dst_discard; - new->output = dst_discard_sk; + new->output = dst_discard_out; new->dev = ort->dst.dev;if (new->dev)
net/ipv4/xfrm4_output.c +1 -3
@@ -94,10 +94,8 @@ static int __xfrm4_output(struct net *net, struct sock *sk, struct sk_buff *skb)return x->outer_mode->afinfo->output_finish (sk, skb); } -int xfrm4_output (struct sock *sk,struct sk_buff *skb) +int xfrm4_output (struct net *net,struct sock *sk,struct sk_buff *skb) { -struct net *net =dev_net (skb_dst (skb)->dev); - return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, net, sk, skb, NULL, skb_dst(skb)->dev, __xfrm4_output,
net/ipv6/ila.c +2 -2
@@ -91,7 +91,7 @@ static void update_ipv6_locator(struct sk_buff *skb, struct ila_params *p) *(__be64 *)&ip6h->daddr = p->locator; } -static int ila_output (struct sock *sk,struct sk_buff *skb) +static int ila_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct dst_entry *dst =skb_dst (skb);
@@ -100,7 +100,7 @@ static int ila_output(struct sock *sk, struct sk_buff *skb)update_ipv6_locator (skb,ila_params_lwtunnel (dst->lwtstate)); -return dst->lwtstate->orig_output (sk, skb); +return dst->lwtstate->orig_output (net, sk, skb); drop:kfree_skb (skb);
net/ipv6/ip6_output.c +1 -2
@@ -130,11 +130,10 @@ static int ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *sreturn ip6_finish_output2 (net, sk, skb); } -int ip6_output (struct sock *sk,struct sk_buff *skb) +int ip6_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct net_device *dev =skb_dst (skb)->dev;struct inet6_dev *idev =ip6_dst_idev (skb_dst (skb)); -struct net *net =dev_net (dev);if (unlikely (idev->cnf.disable_ipv6)) {IP6_INC_STATS (net, idev,IPSTATS_MIB_OUTDISCARDS );
net/ipv6/route.c +7 -7
@@ -86,9 +86,9 @@ static void ip6_dst_ifdown(struct dst_entry *,static int ip6_dst_gc (struct dst_ops *ops);static int ip6_pkt_discard (struct sk_buff *skb); -static int ip6_pkt_discard_out (struct sock *sk,struct sk_buff *skb); +static int ip6_pkt_discard_out (struct net *net,struct sock *sk,struct sk_buff *skb);static int ip6_pkt_prohibit (struct sk_buff *skb); -static int ip6_pkt_prohibit_out (struct sock *sk,struct sk_buff *skb); +static int ip6_pkt_prohibit_out (struct net *net,struct sock *sk,struct sk_buff *skb);static void ip6_link_failure (struct sk_buff *skb);static void ip6_rt_update_pmtu (struct dst_entry *dst,struct sock *sk,struct sk_buff *skb,u32 mtu);
@@ -308,7 +308,7 @@ static const struct rt6_info ip6_blk_hole_entry_template = { .obsolete = DST_OBSOLETE_FORCE_CHK, .error = -EINVAL, .input = dst_discard, - .output = dst_discard_sk, + .output = dst_discard_out, }, .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), .rt6i_protocol = RTPROT_KERNEL,
@@ -1195,7 +1195,7 @@ struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_ori new->__use =1 ; new->input = dst_discard; - new->output = dst_discard_sk; + new->output = dst_discard_out;if (dst_metrics_read_only (&ort->dst)) new->_metrics = ort->dst._metrics;
@@ -1853,7 +1853,7 @@ int ip6_route_info_create(struct fib6_config *cfg, struct rt6_info **rt_ret)switch (cfg->fc_type) {case RTN_BLACKHOLE : rt->dst.error = -EINVAL ; - rt->dst.output = dst_discard_sk; + rt->dst.output = dst_discard_out; rt->dst.input = dst_discard;break ;case RTN_PROHIBIT :
@@ -2446,7 +2446,7 @@ static int ip6_pkt_discard(struct sk_buff *skb)return ip6_pkt_drop (skb,ICMPV6_NOROUTE ,IPSTATS_MIB_INNOROUTES ); } -static int ip6_pkt_discard_out (struct sock *sk,struct sk_buff *skb) +static int ip6_pkt_discard_out (struct net *net,struct sock *sk,struct sk_buff *skb) { skb->dev =skb_dst (skb)->dev;return ip6_pkt_drop (skb,ICMPV6_NOROUTE ,IPSTATS_MIB_OUTNOROUTES );
@@ -2457,7 +2457,7 @@ static int ip6_pkt_prohibit(struct sk_buff *skb)return ip6_pkt_drop (skb,ICMPV6_ADM_PROHIBITED ,IPSTATS_MIB_INNOROUTES ); } -static int ip6_pkt_prohibit_out (struct sock *sk,struct sk_buff *skb) +static int ip6_pkt_prohibit_out (struct net *net,struct sock *sk,struct sk_buff *skb) { skb->dev =skb_dst (skb)->dev;return ip6_pkt_drop (skb,ICMPV6_ADM_PROHIBITED ,IPSTATS_MIB_OUTNOROUTES );
net/ipv6/xfrm6_output.c +1 -3
@@ -173,10 +173,8 @@ static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)return x->outer_mode->afinfo->output_finish (sk, skb); } -int xfrm6_output (struct sock *sk,struct sk_buff *skb) +int xfrm6_output (struct net *net,struct sock *sk,struct sk_buff *skb) { -struct net *net =dev_net (skb_dst (skb)->dev); - return NF_HOOK_COND(NFPROTO_IPV6, NF_INET_POST_ROUTING, net, sk, skb, NULL, skb_dst(skb)->dev, __xfrm6_output,
net/mpls/mpls_iptunnel.c +1 -1
@@ -37,7 +37,7 @@ static unsigned int mpls_encap_size(struct mpls_iptunnel_encap *en)return en->labels *sizeof (struct mpls_shim_hdr ); } -int mpls_output (struct sock *sk,struct sk_buff *skb) +int mpls_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct mpls_iptunnel_encap *tun_encap_info;struct mpls_shim_hdr *hdr;
net/xfrm/xfrm_policy.c +1 -1
@@ -1957,7 +1957,7 @@ purge_queue:xfrm_pol_put (pol); } -static int xdst_queue_output (struct sock *sk,struct sk_buff *skb) +static int xdst_queue_output (struct net *net,struct sock *sk,struct sk_buff *skb) {unsigned long sched_next;struct dst_entry *dst =skb_dst (skb);
Signature · 1 line
2.2.1
Re: [PATCH net-next 00/16] net: Pass net through the output path v2
In reply to Eric W. BiedermanLe 07/10/2015 23:46, Eric W. Biederman a écrit :
Quoted 11 lines
This is the next installment of my work to pass struct net through the output path so the code does not need to guess how to figure out which network namespace it is in, and ultimately routes can have output devices in another network namespace.
The first patch in this series is a fix for a bug that came in when sk was passed through the functions in the output path, and as such is probably a candidate for net. At the same time my later patches depend on it so sending the fix separately would be confusing.
Quoted 8 lines
The second patch in this series is another fix that for an issue that came in when sk was passed through the output path. I don't think it needs a backport as I don't think anyone uses the path where the code was incorrect.
The rest of the patchset focuses on the path from
xxx_local_outtodst_outputand in the end succeeds in passingsock_net(sk)from the socket a packet locally originates on to thedst->outputfunction.
LGTM.
David Miller
maintainerRe: [PATCH net-next 00/16] net: Pass net through the output path v2
In reply to Eric W. BiedermanFrom: [email protected] (Eric W. Biederman)
Date: Wed, 07 Oct 2015 16:46:49 -0500
Quoted 4 lines
This is the next installment of my work to pass struct net through the output path so the code does not need to guess how to figure out which network namespace it is in, and ultimately routes can have output devices in another network namespace.
Seires applied, thanks Eric.
cover net: Pass net into defragmentation
In reply to Eric W. BiedermanThis is the next installment of my work to pass struct net through the output path so the code does not need to guess how to figure out which network namespace it is in, and ultimately routes can have output devices in another network namespace.
In netfilter and af_packet we defragment packets in the output path, and there is the usual amount of confusion about how to compute which net we are processing the packets in. This patchset clears that confusion up by explicitly passing in struct net in ip_defrag, ip_check_defrag, and nf_ct_frag6_gather.
The changes are also available against net-next at:git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/net-next.git master
Eric
Eric W. Biederman (3):
ipv4: Only compute net once in ip_call_ra_chain
ipv4: Pass struct net into ip_defrag and ip_check_defrag
ipv6: Pass struct net into nf_ct_frag6_gather
drivers/net/macvlan.c | 2 +- include/net/ip.h | 6 +++--- include/net/netfilter/ipv6/nf_defrag_ipv6.h | 2 +- net/ipv4/ip_fragment.c | 7 +++---- net/ipv4/ip_input.c | 10 ++++++---- net/ipv4/netfilter/nf_defrag_ipv4.c | 7 ++++--- net/ipv6/netfilter/nf_conntrack_reasm.c | 4 +--- net/ipv6/netfilter/nf_defrag_ipv6_hooks.c | 3 ++- net/netfilter/ipvs/ip_vs_core.c | 2 +- net/openvswitch/conntrack.c | 4 ++-- net/packet/af_packet.c | 6 +++--- 11 files changed, 27 insertions(+), 26 deletions(-)
Re: [PATCH net-next 0/3] net: Pass net into defragmentation
Quoted 11 lines · Eric W. Biederman
This is the next installment of my work to pass struct net through the output path so the code does not need to guess how to figure out which network namespace it is in, and ultimately routes can have output devices in another network namespace.
In netfilter and
af_packetwe defragment packets in the output path, and there is the usual amount of confusion about how to compute which net we are processing the packets in. This patchset clears that confusion up by explicitly passing in struct net inip_defrag,ip_check_defrag, andnf_ct_frag6_gather.
David Miller
maintainerRe: [PATCH net-next 0/3] net: Pass net into defragmentation
In reply to Eric W. BiedermanFrom: [email protected] (Eric W. Biederman)
Date: Fri, 09 Oct 2015 13:42:20 -0500
Quoted 6 lines
This is the next installment of my work to pass struct net through the output path so the code does not need to guess how to figure out which network namespace it is in, and ultimately routes can have output devices in another network namespace.
Quoted 8 lines
In netfilter and
af_packetwe defragment packets in the output path, and there is the usual amount of confusion about how to compute which net we are processing the packets in. This patchset clears that confusion up by explicitly passing in struct net inip_defrag,ip_check_defrag, andnf_ct_frag6_gather.The changes are also available against net-next at:
git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/net-next.gitmaster
I applied this as a patch series instead of pulling, in order to get Pablo's ACKs.
Thanks.
PATCH 1/3 ipv4: Only compute net once in ip_call_ra_chain
In reply to Eric W. Biedermanip_call_ra_chain is called early in the forwarding chain from ip_forward and ip_mr_input, which makes skb->dev the correct expression to get the input network device and dev_net(skb->dev) a correct expression for the network namespace the packet is being processed in.
Compute the network namespace and store it in a variable to make the code clearer.
--- net/ipv4/ip_input.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv4/ip_input.c +2 -1
@@ -157,6 +157,7 @@ bool ip_call_ra_chain(struct sk_buff *skb)u8 protocol =ip_hdr (skb)->protocol;struct sock *last =NULL ;struct net_device *dev = skb->dev; +struct net *net =dev_net (dev);for (ra =rcu_dereference (ip_ra_chain); ra; ra =rcu_dereference (ra->next)) {struct sock *sk = ra->sk;
@@ -167,7 +168,7 @@ bool ip_call_ra_chain(struct sk_buff *skb)if (sk &&inet_sk (sk)->inet_num == protocol && (!sk->sk_bound_dev_if || sk->sk_bound_dev_if == dev->ifindex) && -net_eq (sock_net (sk),dev_net (dev))) { +net_eq (sock_net (sk), net)) {if (ip_is_fragment (ip_hdr (skb))) {if (ip_defrag (skb,IP_DEFRAG_CALL_RA_CHAIN ))return true;
Signature · 1 line
2.2.1
PATCH 2/3 ipv4: Pass struct net into ip_defrag and ip_check_defrag
In reply to Eric W. BiedermanThe function ip_defrag is called on both the input and the output paths of the networking stack. In particular conntrack when it is tracking outbound packets from the local machine calls ip_defrag.
So add a struct net parameter and stop making ip_defrag guess which network namespace it needs to defragment packets in.
--- drivers/net/macvlan.c | 2 +- include/net/ip.h | 6 +++--- net/ipv4/ip_fragment.c | 7 +++---- net/ipv4/ip_input.c | 7 ++++--- net/ipv4/netfilter/nf_defrag_ipv4.c | 7 ++++--- net/netfilter/ipvs/ip_vs_core.c | 2 +- net/openvswitch/conntrack.c | 2 +- net/packet/af_packet.c | 6 +++--- 8 files changed, 20 insertions(+), 19 deletions(-)
drivers/net/macvlan.c +1 -1
@@ -412,7 +412,7 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb) port =macvlan_port_get_rcu (skb->dev);if (is_multicast_ether_addr (eth->h_dest)) { - skb =ip_check_defrag (skb,IP_DEFRAG_MACVLAN ); + skb =ip_check_defrag (dev_net (skb->dev), skb,IP_DEFRAG_MACVLAN );if (!skb)return RX_HANDLER_CONSUMED ; eth =eth_hdr (skb);
include/net/ip.h +3 -3
@@ -506,11 +506,11 @@ static inline bool ip_defrag_user_in_between(u32 user,return user >= lower_bond && user <= upper_bond; } -int ip_defrag (struct sk_buff *skb,u32 user); +int ip_defrag (struct net *net,struct sk_buff *skb,u32 user);#ifdef CONFIG_INET -struct sk_buff *ip_check_defrag (struct sk_buff *skb,u32 user); +struct sk_buff *ip_check_defrag (struct net *net,struct sk_buff *skb,u32 user);#else -static inline struct sk_buff *ip_check_defrag (struct sk_buff *skb,u32 user) +static inline struct sk_buff *ip_check_defrag (struct net *net,struct sk_buff *skb,u32 user) {return skb; }
net/ipv4/ip_fragment.c +3 -4
@@ -654,11 +654,10 @@ out_fail: }/* Process an incoming IP datagram fragment. */ -int ip_defrag (struct sk_buff *skb,u32 user) +int ip_defrag (struct net *net,struct sk_buff *skb,u32 user) {struct net_device *dev = skb->dev ? :skb_dst (skb)->dev;int vif =l3mdev_master_ifindex_rcu (dev); -struct net *net =dev_net (dev);struct ipq *qp;IP_INC_STATS_BH (net,IPSTATS_MIB_REASMREQDS );
@@ -683,7 +682,7 @@ int ip_defrag(struct sk_buff *skb, u32 user) }EXPORT_SYMBOL (ip_defrag); -struct sk_buff *ip_check_defrag (struct sk_buff *skb,u32 user) +struct sk_buff *ip_check_defrag (struct net *net,struct sk_buff *skb,u32 user) {struct iphdr iph;int netoff;
@@ -712,7 +711,7 @@ struct sk_buff *ip_check_defrag(struct sk_buff *skb, u32 user)if (pskb_trim_rcsum (skb, netoff + len))return skb;memset (IPCB (skb),0 ,sizeof (struct inet_skb_parm )); -if (ip_defrag (skb, user)) +if (ip_defrag (net, skb, user))return NULL ;skb_clear_hash (skb); }
net/ipv4/ip_input.c +4 -3
@@ -170,7 +170,7 @@ bool ip_call_ra_chain(struct sk_buff *skb) sk->sk_bound_dev_if == dev->ifindex) && net_eq(sock_net(sk), net)) {if (ip_is_fragment (ip_hdr (skb))) { -if (ip_defrag (skb,IP_DEFRAG_CALL_RA_CHAIN )) +if (ip_defrag (net, skb,IP_DEFRAG_CALL_RA_CHAIN ))return true; }if (last) {
@@ -247,14 +247,15 @@ int ip_local_deliver(struct sk_buff *skb)/* * Reassemble IP fragments. */ +struct net *net =dev_net (skb->dev);if (ip_is_fragment (ip_hdr (skb))) { -if (ip_defrag (skb,IP_DEFRAG_LOCAL_DELIVER )) +if (ip_defrag (net, skb,IP_DEFRAG_LOCAL_DELIVER ))return 0 ; }return NF_HOOK (NFPROTO_IPV4 ,NF_INET_LOCAL_IN , -dev_net (skb->dev),NULL , skb, skb->dev,NULL , + net,NULL , skb, skb->dev,NULL , ip_local_deliver_finish); }
net/ipv4/netfilter/nf_defrag_ipv4.c +4 -3
@@ -22,14 +22,15 @@#endif #include <net/netfilter/nf_conntrack_zones.h> -static int nf_ct_ipv4_gather_frags (struct sk_buff *skb,u_int32_t user) +static int nf_ct_ipv4_gather_frags (struct net *net,struct sk_buff *skb, +u_int32_t user) {int err;skb_orphan (skb);local_bh_disable (); - err =ip_defrag (skb, user); + err =ip_defrag (net, skb, user);local_bh_enable ();if (!err) {
@@ -85,7 +86,7 @@ static unsigned int ipv4_conntrack_defrag(void *priv,enum ip_defrag_users user =nf_ct_defrag_user (state->hook, skb); -if (nf_ct_ipv4_gather_frags (skb, user)) +if (nf_ct_ipv4_gather_frags (state->net, skb, user))return NF_STOLEN ; }return NF_ACCEPT ;
net/netfilter/ipvs/ip_vs_core.c +1 -1
@@ -694,7 +694,7 @@ static inline int ip_vs_gather_frags(struct netns_ipvs *ipvs,int err;local_bh_disable (); - err =ip_defrag (skb, user); + err =ip_defrag (ipvs->net, skb, user);local_bh_enable ();if (!err)ip_send_check (ip_hdr (skb));
net/openvswitch/conntrack.c +1 -1
@@ -304,7 +304,7 @@ static int handle_fragments(struct net *net, struct sw_flow_key *key,int err;memset (IPCB (skb),0 ,sizeof (struct inet_skb_parm )); - err =ip_defrag (skb, user); + err =ip_defrag (net, skb, user);if (err)return err;
net/packet/af_packet.c +3 -3
@@ -1439,17 +1439,17 @@ static int packet_rcv_fanout(struct sk_buff *skb, struct net_device *dev, {struct packet_fanout *f = pt->af_packet_priv;unsigned int num =READ_ONCE (f->num_members); +struct net *net =read_pnet (&f->net);struct packet_sock *po;unsigned int idx; -if (!net_eq (dev_net (dev),read_pnet (&f->net)) || - !num) { +if (!net_eq (dev_net (dev), net) || !num) {kfree_skb (skb);return 0 ; }if (fanout_has_flag (f,PACKET_FANOUT_FLAG_DEFRAG )) { - skb =ip_check_defrag (skb,IP_DEFRAG_AF_PACKET ); + skb =ip_check_defrag (net, skb,IP_DEFRAG_AF_PACKET );if (!skb)return 0 ; }
Signature · 1 line
2.2.1
Re: [PATCH net-next 2/3] ipv4: Pass struct net into ip_defrag and ip_check_defrag
Quoted 8 lines · Eric W. Biederman
The function
ip_defragis called on both the input and the output paths of the networking stack. In particular conntrack when it is tracking outbound packets from the local machine callsip_defrag.So add a struct net parameter and stop making
ip_defragguess which network namespace it needs to defragment packets in.Signed-off-by "Eric W. Biederman" <[email protected]>
For the netfilter chunk:
PATCH 3/3 ipv6: Pass struct net into nf_ct_frag6_gather
In reply to Eric W. BiedermanThe function nf_ct_frag6_gather is called on both the input and the output paths of the networking stack. In particular ipv6_defrag which calls nf_ct_frag6_gather is called from both the the PRE_ROUTING chain on input and the LOCAL_OUT chain on output.
The addition of a net parameter makes it explicit which network namespace the packets are being reassembled in, and removes the need for nf_ct_frag6_gather to guess.
--- include/net/netfilter/ipv6/nf_defrag_ipv6.h | 2 +- net/ipv6/netfilter/nf_conntrack_reasm.c | 4 +--- net/ipv6/netfilter/nf_defrag_ipv6_hooks.c | 3 ++- net/openvswitch/conntrack.c | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-)
include/net/netfilter/ipv6/nf_defrag_ipv6.h +1 -1
@@ -5,7 +5,7 @@ void nf_defrag_ipv6_enable(void);int nf_ct_frag6_init (void );void nf_ct_frag6_cleanup (void ); -struct sk_buff *nf_ct_frag6_gather (struct sk_buff *skb,u32 user); +struct sk_buff *nf_ct_frag6_gather (struct net *net,struct sk_buff *skb,u32 user);void nf_ct_frag6_consume_orig (struct sk_buff *skb);struct inet_frags_ctl ;
net/ipv6/netfilter/nf_conntrack_reasm.c +1 -3
@@ -563,12 +563,10 @@ find_prev_fhdr(struct sk_buff *skb, u8 *prevhdrp, int *prevhoff, int *fhoff)return 0 ; } -struct sk_buff *nf_ct_frag6_gather (struct sk_buff *skb,u32 user) +struct sk_buff *nf_ct_frag6_gather (struct net *net,struct sk_buff *skb,u32 user) {struct sk_buff *clone;struct net_device *dev = skb->dev; -struct net *net =skb_dst (skb) ?dev_net (skb_dst (skb)->dev) - :dev_net (skb->dev);struct frag_hdr *fhdr;struct frag_queue *fq;struct ipv6hdr *hdr;
net/ipv6/netfilter/nf_defrag_ipv6_hooks.c +2 -1
@@ -63,7 +63,8 @@ static unsigned int ipv6_defrag(void *priv,return NF_ACCEPT ;#endif - reasm =nf_ct_frag6_gather (skb,nf_ct6_defrag_user (state->hook, skb)); + reasm =nf_ct_frag6_gather (state->net, skb, +nf_ct6_defrag_user (state->hook, skb));/* queued */ if (reasm ==NULL )return NF_STOLEN ;
net/openvswitch/conntrack.c +1 -1
@@ -315,7 +315,7 @@ static int handle_fragments(struct net *net, struct sw_flow_key *key,struct sk_buff *reasm;memset (IP6CB (skb),0 ,sizeof (struct inet6_skb_parm )); - reasm =nf_ct_frag6_gather (skb, user); + reasm =nf_ct_frag6_gather (net, skb, user);if (!reasm)return -EINPROGRESS ;
Signature · 1 line
2.2.1
Re: [PATCH net-next 3/3] ipv6: Pass struct net into nf_ct_frag6_gather
Quoted 8 lines · Eric W. Biederman
The function
nf_ct_frag6_gatheris called on both the input and the output paths of the networking stack. In particularipv6_defragwhich callsnf_ct_frag6_gatheris called from both the thePRE_ROUTINGchain on input and theLOCAL_OUTchain on output.The addition of a net parameter makes it explicit which network namespace the packets are being reassembled in, and removes the need for
nf_ct_frag6_gatherto guess.
For the netfilter chunk: