All of lore.kernel.org
 help / color / mirror / Atom feed
* pass netns to ->match or to not pass
@ 2008-10-23 23:16 Alexey Dobriyan
  2008-10-23 23:17 ` Jan Engelhardt
  2008-10-24  3:43 ` Patrick McHardy
  0 siblings, 2 replies; 10+ messages in thread
From: Alexey Dobriyan @ 2008-10-23 23:16 UTC (permalink / raw)
  To: netfilter-devel

xt_recent wants netns inside ->match hook (and xt_hashlimit probably,
haven't looked closely):

	recent_mt
	recent_table_lookup
	[use per-netns tables list]

Now, I can drag netns through struct xt_match_param, or use
dev_net(skb->dev ? skb->dev : skb->dst->dev) trick.

And the latter should be better, because only xt_recent module will be
affected.

Comments?

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: pass netns to ->match or to not pass
  2008-10-23 23:16 pass netns to ->match or to not pass Alexey Dobriyan
@ 2008-10-23 23:17 ` Jan Engelhardt
  2008-10-23 23:36   ` Alexey Dobriyan
  2008-10-24  3:43 ` Patrick McHardy
  1 sibling, 1 reply; 10+ messages in thread
From: Jan Engelhardt @ 2008-10-23 23:17 UTC (permalink / raw)
  To: Alexey Dobriyan; +Cc: netfilter-devel


On Thursday 2008-10-23 19:16, Alexey Dobriyan wrote:

>xt_recent wants netns inside ->match hook (and xt_hashlimit probably,
>haven't looked closely):
>
>	recent_mt
>	recent_table_lookup
>	[use per-netns tables list]
>
>Now, I can drag netns through struct xt_match_param, or use
>dev_net(skb->dev ? skb->dev : skb->dst->dev) trick.
>
>And the latter should be better, because only xt_recent module will be
>affected.
>
>Comments?

What exactly needs netns? This?

	if (par->out != NULL && skb->sk == NULL)
		ttl++;

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: pass netns to ->match or to not pass
  2008-10-23 23:17 ` Jan Engelhardt
@ 2008-10-23 23:36   ` Alexey Dobriyan
  2008-10-24  0:23     ` Jan Engelhardt
  0 siblings, 1 reply; 10+ messages in thread
From: Alexey Dobriyan @ 2008-10-23 23:36 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: netfilter-devel

On Thu, Oct 23, 2008 at 07:17:29PM -0400, Jan Engelhardt wrote:
> 
> On Thursday 2008-10-23 19:16, Alexey Dobriyan wrote:
> 
> >xt_recent wants netns inside ->match hook (and xt_hashlimit probably,
> >haven't looked closely):
> >
> >	recent_mt
> >	recent_table_lookup
> >	[use per-netns tables list]
> >
> >Now, I can drag netns through struct xt_match_param, or use
> >dev_net(skb->dev ? skb->dev : skb->dst->dev) trick.
> >
> >And the latter should be better, because only xt_recent module will be
> >affected.
> >
> >Comments?
> 
> What exactly needs netns? This?
> 
> 	if (par->out != NULL && skb->sk == NULL)
> 		ttl++;

Nope, something like below, and if I'm reading correctly,
struct xt_recent_mtinfo is immutable because of ABI, hence the question.


--- a/net/netfilter/xt_recent.c
+++ b/net/netfilter/xt_recent.c
@@ -180,11 +180,12 @@ static void recent_entry_update(struct recent_table *t, struct recent_entry *e)
 	list_move_tail(&e->lru_list, &t->lru_list);
 }
 
-static struct recent_table *recent_table_lookup(const char *name)
+static struct recent_table *recent_table_lookup(struct net *net, const char *name)
 {
+	struct netns_recent *net_recent = net_generic(net, recent_net_id);
 	struct recent_table *t;
 
-	list_for_each_entry(t, &tables, list)
+	list_for_each_entry(t, &net_recent->tables, list)
 		if (!strcmp(t->name, name))
 			return t;
 	return NULL;
@@ -203,6 +204,7 @@ static void recent_table_flush(struct recent_table *t)
 static bool
 recent_mt(const struct sk_buff *skb, const struct xt_match_param *par)
 {
+	struct net *net = ???;
 	const struct xt_recent_mtinfo *info = par->matchinfo;
 	struct recent_table *t;
 	struct recent_entry *e;
@@ -235,7 +237,7 @@ recent_mt(const struct sk_buff *skb, const struct xt_match_param *par)
 		ttl++;
 
 	spin_lock_bh(&recent_lock);
-	t = recent_table_lookup(info->name);
+	t = recent_table_lookup(net, info->name);
 	e = recent_entry_lookup(t, &addr, par->match->family,
 				(info->check_set & XT_RECENT_TTL) ? ttl : 0);
 	if (e == NULL) {

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: pass netns to ->match or to not pass
  2008-10-23 23:36   ` Alexey Dobriyan
@ 2008-10-24  0:23     ` Jan Engelhardt
  2008-10-24  9:45       ` Alexey Dobriyan
  0 siblings, 1 reply; 10+ messages in thread
From: Jan Engelhardt @ 2008-10-24  0:23 UTC (permalink / raw)
  To: Alexey Dobriyan; +Cc: netfilter-devel


On Thursday 2008-10-23 19:36, Alexey Dobriyan wrote:
>> 
>> >xt_recent wants netns inside ->match hook (and xt_hashlimit probably,
>> >haven't looked closely):
>> >
>> >	recent_mt
>> >	recent_table_lookup
>> >	[use per-netns tables list]
>> >
>> >Now, I can drag netns through struct xt_match_param, or use
>> >dev_net(skb->dev ? skb->dev : skb->dst->dev) trick.
>> >
>> >And the latter should be better, because only xt_recent module will be
>> >affected.
>> >
>> >Comments?
>> 
>> What exactly needs netns? This?
>> 
>> 	if (par->out != NULL && skb->sk == NULL)
>> 		ttl++;
>
>Nope, something like below, and if I'm reading correctly,
>struct xt_recent_mtinfo is immutable because of ABI, hence the question.

What info would you pass thorugh xt_recent_mtinfo anyway?

>@@ -203,6 +204,7 @@ static void recent_table_flush(struct recent_table *t)
> static bool
> recent_mt(const struct sk_buff *skb, const struct xt_match_param *par)
> {
>+	struct net *net = ???;

Either add a net in match_param or use dev_net.
The latter seems nicer because it does not use another 8 bytes
in match_param.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: pass netns to ->match or to not pass
  2008-10-23 23:16 pass netns to ->match or to not pass Alexey Dobriyan
  2008-10-23 23:17 ` Jan Engelhardt
@ 2008-10-24  3:43 ` Patrick McHardy
  1 sibling, 0 replies; 10+ messages in thread
From: Patrick McHardy @ 2008-10-24  3:43 UTC (permalink / raw)
  To: Alexey Dobriyan; +Cc: netfilter-devel

Alexey Dobriyan wrote:
> xt_recent wants netns inside ->match hook (and xt_hashlimit probably,
> haven't looked closely):
> 
> 	recent_mt
> 	recent_table_lookup
> 	[use per-netns tables list]
> 
> Now, I can drag netns through struct xt_match_param, or use
> dev_net(skb->dev ? skb->dev : skb->dst->dev) trick.
> 
> And the latter should be better, because only xt_recent module will be
> affected.
> 
> Comments?

I prefer the later. Using the supplied device parameters would
be better though to keep the device handling centralized.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: pass netns to ->match or to not pass
  2008-10-24  0:23     ` Jan Engelhardt
@ 2008-10-24  9:45       ` Alexey Dobriyan
  2008-10-24 13:31         ` Jan Engelhardt
  0 siblings, 1 reply; 10+ messages in thread
From: Alexey Dobriyan @ 2008-10-24  9:45 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: netfilter-devel

On Thu, Oct 23, 2008 at 08:23:10PM -0400, Jan Engelhardt wrote:
> 
> On Thursday 2008-10-23 19:36, Alexey Dobriyan wrote:
> >> 
> >> >xt_recent wants netns inside ->match hook (and xt_hashlimit probably,
> >> >haven't looked closely):
> >> >
> >> >	recent_mt
> >> >	recent_table_lookup
> >> >	[use per-netns tables list]
> >> >
> >> >Now, I can drag netns through struct xt_match_param, or use
> >> >dev_net(skb->dev ? skb->dev : skb->dst->dev) trick.
> >> >
> >> >And the latter should be better, because only xt_recent module will be
> >> >affected.
> >> >
> >> >Comments?
> >> 
> >> What exactly needs netns? This?
> >> 
> >> 	if (par->out != NULL && skb->sk == NULL)
> >> 		ttl++;
> >
> >Nope, something like below, and if I'm reading correctly,
> >struct xt_recent_mtinfo is immutable because of ABI, hence the question.
> 
> What info would you pass thorugh xt_recent_mtinfo anyway?

Well, if it would have a pointer like xt_connlimit has, I could take
netns from ->matchinfo. Here is xt_connlimit patch, btw.


commit d922d559ee30336579f56e7f45b4eac977643f29
Author: Alexey Dobriyan <adobriyan@gmail.com>
Date:   Fri Oct 24 02:37:00 2008 +0400

    netns nf: xt_connlimit in netns

diff --git a/net/netfilter/xt_connlimit.c b/net/netfilter/xt_connlimit.c
index 7f404cc..ef01431 100644
--- a/net/netfilter/xt_connlimit.c
+++ b/net/netfilter/xt_connlimit.c
@@ -38,6 +38,7 @@ struct xt_connlimit_conn {
 struct xt_connlimit_data {
 	struct list_head iphash[256];
 	spinlock_t lock;
+	struct net *net;
 };
 
 static u_int32_t connlimit_rnd;
@@ -105,6 +106,7 @@ static int count_them(struct xt_connlimit_data *data,
 		      const union nf_inet_addr *mask,
 		      const struct xt_match *match)
 {
+	struct net *net = data->net;
 	const struct nf_conntrack_tuple_hash *found;
 	struct xt_connlimit_conn *conn;
 	struct xt_connlimit_conn *tmp;
@@ -123,7 +125,7 @@ static int count_them(struct xt_connlimit_data *data,
 
 	/* check the saved connections */
 	list_for_each_entry_safe(conn, tmp, hash, list) {
-		found    = __nf_conntrack_find(&init_net, &conn->tuple);
+		found    = __nf_conntrack_find(net, &conn->tuple);
 		found_ct = NULL;
 
 		if (found != NULL)
@@ -242,6 +244,7 @@ static bool connlimit_mt_check(const struct xt_mtchk_param *par)
 	spin_lock_init(&info->data->lock);
 	for (i = 0; i < ARRAY_SIZE(info->data->iphash); ++i)
 		INIT_LIST_HEAD(&info->data->iphash[i]);
+	info->data->net = par->net;
 
 	return true;
 }

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: pass netns to ->match or to not pass
  2008-10-24  9:45       ` Alexey Dobriyan
@ 2008-10-24 13:31         ` Jan Engelhardt
  2008-10-24 14:10           ` Alexey Dobriyan
  0 siblings, 1 reply; 10+ messages in thread
From: Jan Engelhardt @ 2008-10-24 13:31 UTC (permalink / raw)
  To: Alexey Dobriyan; +Cc: netfilter-devel


On Friday 2008-10-24 05:45, Alexey Dobriyan wrote:
>
>Well, if it would have a pointer like xt_connlimit has, I could take
>netns from ->matchinfo. Here is xt_connlimit patch, btw.
>
>diff --git a/net/netfilter/xt_connlimit.c b/net/netfilter/xt_connlimit.c
>index 7f404cc..ef01431 100644
>--- a/net/netfilter/xt_connlimit.c
>+++ b/net/netfilter/xt_connlimit.c
>@@ -38,6 +38,7 @@ struct xt_connlimit_conn {
> struct xt_connlimit_data {
> 	struct list_head iphash[256];
> 	spinlock_t lock;
>+	struct net *net;
> };

And why should this be better than dev_net(par->in)/dev_net(par_out)?


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: pass netns to ->match or to not pass
  2008-10-24 13:31         ` Jan Engelhardt
@ 2008-10-24 14:10           ` Alexey Dobriyan
  2008-10-24 15:06             ` Jan Engelhardt
  0 siblings, 1 reply; 10+ messages in thread
From: Alexey Dobriyan @ 2008-10-24 14:10 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: netfilter-devel

On Fri, Oct 24, 2008 at 09:31:28AM -0400, Jan Engelhardt wrote:
> 
> On Friday 2008-10-24 05:45, Alexey Dobriyan wrote:
> >
> >Well, if it would have a pointer like xt_connlimit has, I could take
> >netns from ->matchinfo. Here is xt_connlimit patch, btw.
> >
> >diff --git a/net/netfilter/xt_connlimit.c b/net/netfilter/xt_connlimit.c
> >index 7f404cc..ef01431 100644
> >--- a/net/netfilter/xt_connlimit.c
> >+++ b/net/netfilter/xt_connlimit.c
> >@@ -38,6 +38,7 @@ struct xt_connlimit_conn {
> > struct xt_connlimit_data {
> > 	struct list_head iphash[256];
> > 	spinlock_t lock;
> >+	struct net *net;
> > };
> 
> And why should this be better than dev_net(par->in)/dev_net(par_out)?

par->in doesn't exist, not sure what do you mean.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: pass netns to ->match or to not pass
  2008-10-24 14:10           ` Alexey Dobriyan
@ 2008-10-24 15:06             ` Jan Engelhardt
  2008-10-24 16:25               ` Alexey Dobriyan
  0 siblings, 1 reply; 10+ messages in thread
From: Jan Engelhardt @ 2008-10-24 15:06 UTC (permalink / raw)
  To: Alexey Dobriyan; +Cc: netfilter-devel


On Friday 2008-10-24 10:10, Alexey Dobriyan wrote:
>On Fri, Oct 24, 2008 at 09:31:28AM -0400, Jan Engelhardt wrote:
>> 
>> >Well, if it would have a pointer like xt_connlimit has, I could take
>> >netns from ->matchinfo. Here is xt_connlimit patch, btw.
>> >
>> >diff --git a/net/netfilter/xt_connlimit.c b/net/netfilter/xt_connlimit.c
>> >index 7f404cc..ef01431 100644
>> >--- a/net/netfilter/xt_connlimit.c
>> >+++ b/net/netfilter/xt_connlimit.c
>> >@@ -38,6 +38,7 @@ struct xt_connlimit_conn {
>> > struct xt_connlimit_data {
>> > 	struct list_head iphash[256];
>> > 	spinlock_t lock;
>> >+	struct net *net;
>> > };
>> 
>> And why should this be better than dev_net(par->in)/dev_net(par_out)?
>
>par->in doesn't exist, not sure what do you mean.
>
Of course that exists when you get a packet. (If not, then it's par->out
in case of forwarded/output traffic.)

static bool
connlimit_mt(const struct sk_buff *skb, const struct xt_match_param *par)
{
	...
}

struct xt_match_param {
	const struct net_device *in, *out;   <- THAT ONE
	const struct xt_match *match;
	const void *matchinfo;
	int fragoff;
	unsigned int thoff;
	bool *hotdrop;
	u_int8_t family;
};

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: pass netns to ->match or to not pass
  2008-10-24 15:06             ` Jan Engelhardt
@ 2008-10-24 16:25               ` Alexey Dobriyan
  0 siblings, 0 replies; 10+ messages in thread
From: Alexey Dobriyan @ 2008-10-24 16:25 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: netfilter-devel

On Fri, Oct 24, 2008 at 11:06:25AM -0400, Jan Engelhardt wrote:
> 
> On Friday 2008-10-24 10:10, Alexey Dobriyan wrote:
> >On Fri, Oct 24, 2008 at 09:31:28AM -0400, Jan Engelhardt wrote:
> >> 
> >> >Well, if it would have a pointer like xt_connlimit has, I could take
> >> >netns from ->matchinfo. Here is xt_connlimit patch, btw.
> >> >
> >> >diff --git a/net/netfilter/xt_connlimit.c b/net/netfilter/xt_connlimit.c
> >> >index 7f404cc..ef01431 100644
> >> >--- a/net/netfilter/xt_connlimit.c
> >> >+++ b/net/netfilter/xt_connlimit.c
> >> >@@ -38,6 +38,7 @@ struct xt_connlimit_conn {
> >> > struct xt_connlimit_data {
> >> > 	struct list_head iphash[256];
> >> > 	spinlock_t lock;
> >> >+	struct net *net;
> >> > };
> >> 
> >> And why should this be better than dev_net(par->in)/dev_net(par_out)?
> >
> >par->in doesn't exist, not sure what do you mean.
> >
> Of course that exists when you get a packet. (If not, then it's par->out
> in case of forwarded/output traffic.)
> 
> static bool
> connlimit_mt(const struct sk_buff *skb, const struct xt_match_param *par)
> {
> 	...
> }
> 
> struct xt_match_param {
> 	const struct net_device *in, *out;   <- THAT ONE

Ah, these ones!

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2008-10-24 16:22 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-23 23:16 pass netns to ->match or to not pass Alexey Dobriyan
2008-10-23 23:17 ` Jan Engelhardt
2008-10-23 23:36   ` Alexey Dobriyan
2008-10-24  0:23     ` Jan Engelhardt
2008-10-24  9:45       ` Alexey Dobriyan
2008-10-24 13:31         ` Jan Engelhardt
2008-10-24 14:10           ` Alexey Dobriyan
2008-10-24 15:06             ` Jan Engelhardt
2008-10-24 16:25               ` Alexey Dobriyan
2008-10-24  3:43 ` Patrick McHardy

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.