Linux Netfilter discussions
 help / color / mirror / Atom feed
* deleting a conntrack record
@ 2004-06-17 15:07 Tobias DiPasquale
  2004-06-17 15:20 ` Antony Stone
  0 siblings, 1 reply; 3+ messages in thread
From: Tobias DiPasquale @ 2004-06-17 15:07 UTC (permalink / raw)
  To: netdev, linux-net, netfilter

Hello all,

I have a module that exports a /proc entry which takes a string with 4
args in it (src IP/port and dst IP/port) and then attempts to delete
the conntrack entry for the TCP connection associated with those
arguments. Here's the code in question (keep reading past the code for
a description of the problem I'm having):

<code>
static inline int kill_ct_record( const struct ip_conntrack *c, void *p)
{
       struct ip_conntrack *q = (struct ip_conntrack *)p;

       if (!memcmp( &c->tuplehash[IP_CT_DIR_ORIGINAL],
                    &q->tuplehash[IP_CT_DIR_ORIGINAL],
                    sizeof( struct ip_conntrack_tuple_hash))) {
               ip_conntrack_put( q);
               return 1;
       }
       return 0;
}

static int delete_ct_record( u_int32_t src, u_int16_t sport, u_int32_t
dst, u_int16_t dport)
{
       struct ip_conntrack_tuple tuple;
       struct ip_conntrack_tuple_hash *h;

       memset( &tuple, 0, sizeof( tuple));
       tuple.src.ip = src;
       tuple.src.u.tcp.port = sport;
       tuple.dst.ip = dst;
       tuple.dst.u.tcp.port = dport;
       tuple.dst.protonum = IPPROTO_TCP;
       h = ip_conntrack_find_get( &tuple, NULL);
       if (!h)
               return -ENOENT;
       ip_ct_selective_cleanup( kill_ct_record, h->ctrack);
       return 1;
}
</code>

The problem is as follows:

There is a userspace script that runs from cron every 5 minutes. It
looks through the /proc/net/ip_conntrack listing to see if any 
connections are "stale" (i.e. haven't seen a packet from them in
some amount of time). It then feeds their connection information
into my module's /proc entry so that those conntrack records can
be destroyed.

In the kill_ct_record() function in the module, if the 
ip_conntrack_put() call is not commented out, this causes the box 
to go into some infinite loop after some unspecified amount of time. 
There is no LKCD dump and I don't know what happened since I wasn't 
physically present for the crash in any of the instances.

On the other hand, when the ip_conntrack_put() call _is_ commented
out, the system leaks memory from conntrack as indicated in the
ip_conntrack line in /proc/slabinfo. But the crash doesn't happen
under that condition.

So, is there a cleaner way to hand-delete a conntrack record? Or is
this the only method? Or is there some error in the way that I am
doing the above?

By the way, this is almost exactly what ctnetlink does to delete a
conntrack record so any errors discovered here will almost surely have
to be fixed there, as well.

-- 
[ Tobias DiPasquale ]
0x636f6465736c696e67657240676d61696c2e636f6d

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

* Re: deleting a conntrack record
  2004-06-17 15:07 deleting a conntrack record Tobias DiPasquale
@ 2004-06-17 15:20 ` Antony Stone
  2004-06-17 15:31   ` Tobias DiPasquale
  0 siblings, 1 reply; 3+ messages in thread
From: Antony Stone @ 2004-06-17 15:20 UTC (permalink / raw)
  To: netfilter

On Thursday 17 June 2004 4:07 pm, Tobias DiPasquale wrote:

> Hello all,
>
> I have a module that exports a /proc entry which takes a string with 4
> args in it (src IP/port and dst IP/port) and then attempts to delete
> the conntrack entry for the TCP connection associated with those
> arguments.
>
> The problem is as follows:
>
> There is a userspace script that runs from cron every 5 minutes. It
> looks through the /proc/net/ip_conntrack listing to see if any
> connections are "stale" (i.e. haven't seen a packet from them in
> some amount of time). It then feeds their connection information
> into my module's /proc entry so that those conntrack records can
> be destroyed.

Why not just use the built-in timeouts to delete stale entries from the 
conntrack table?

You can adjust the timeout settings using entries in 
/proc/sys/net/ipv4/netfilter and I believe there may be a p-o-m update to 
give even further fine-grained control.

Regards,

Antony.

-- 
I own three Windows books, published by O'Reilly.   They are "Windows 
Annoyances", "Office 97 Annoyances" and "Windows 98 Annoyances".   That 
pretty much sums it up for me.

                                                     Please reply to the list;
                                                           please don't CC me.



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

* Re: deleting a conntrack record
  2004-06-17 15:20 ` Antony Stone
@ 2004-06-17 15:31   ` Tobias DiPasquale
  0 siblings, 0 replies; 3+ messages in thread
From: Tobias DiPasquale @ 2004-06-17 15:31 UTC (permalink / raw)
  To: netfilter

On Thu, 17 Jun 2004 16:20:23 +0100, Antony Stone
<antony@soft-solutions.co.uk> wrote:
> Why not just use the built-in timeouts to delete stale entries from the
> conntrack table?
> 
> You can adjust the timeout settings using entries in
> /proc/sys/net/ipv4/netfilter and I believe there may be a p-o-m update to
> give even further fine-grained control.

Because I only want to delete conntrack records for certain
connections, so timing out all TCP connections early is no good. As
well, I can't just do that alone also because other operations have to
be performed aside from deleting the conntrack record.
 
-- 
[ Tobias DiPasquale ]
0x636f6465736c696e67657240676d61696c2e636f6d


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

end of thread, other threads:[~2004-06-17 15:31 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-06-17 15:07 deleting a conntrack record Tobias DiPasquale
2004-06-17 15:20 ` Antony Stone
2004-06-17 15:31   ` Tobias DiPasquale

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox