[NETFILTER] nf_conntrack: clean up to reduce size of 'struct nf_conn'
This patch moves all helper related data fields of 'struct nf_conn' into a separate structure 'struct nf_conn_help'. This new structure is only present in conntrack entries for which we actually have a helper loaded. Also, this patch cleans up the nf_conntrack 'features' mechanism to resemble what the original idea was: Just glue the feature-specific data structures at the end of 'struct nf_conn', and explicitly re-calculate the pointer to it when needed rather than keeping pointers around. Saves 20 bytes per conntrack on my x86_64 box. A non-helped conntrack is 276 bytes. We still need to save another 20 bytes in order to fit into to target of 256bytes. Signed-off-by: Harald Welte <laforge@netfilter.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
0d36f37bb1
commit
dc808fe28d
@@ -67,6 +67,18 @@ do { \
|
||||
|
||||
struct nf_conntrack_helper;
|
||||
|
||||
/* nf_conn feature for connections that have a helper */
|
||||
struct nf_conn_help {
|
||||
/* Helper. if any */
|
||||
struct nf_conntrack_helper *helper;
|
||||
|
||||
union nf_conntrack_help help;
|
||||
|
||||
/* Current number of expected connections */
|
||||
unsigned int expecting;
|
||||
};
|
||||
|
||||
|
||||
#include <net/netfilter/ipv4/nf_conntrack_ipv4.h>
|
||||
struct nf_conn
|
||||
{
|
||||
@@ -81,6 +93,9 @@ struct nf_conn
|
||||
/* Have we seen traffic both ways yet? (bitset) */
|
||||
unsigned long status;
|
||||
|
||||
/* If we were expected by an expectation, this will be it */
|
||||
struct nf_conn *master;
|
||||
|
||||
/* Timer function; drops refcnt when it goes off. */
|
||||
struct timer_list timeout;
|
||||
|
||||
@@ -88,38 +103,22 @@ struct nf_conn
|
||||
/* Accounting Information (same cache line as other written members) */
|
||||
struct ip_conntrack_counter counters[IP_CT_DIR_MAX];
|
||||
#endif
|
||||
/* If we were expected by an expectation, this will be it */
|
||||
struct nf_conn *master;
|
||||
|
||||
/* Current number of expected connections */
|
||||
unsigned int expecting;
|
||||
|
||||
/* Unique ID that identifies this conntrack*/
|
||||
unsigned int id;
|
||||
|
||||
/* Helper. if any */
|
||||
struct nf_conntrack_helper *helper;
|
||||
|
||||
/* features - nat, helper, ... used by allocating system */
|
||||
u_int32_t features;
|
||||
|
||||
/* Storage reserved for other modules: */
|
||||
|
||||
union nf_conntrack_proto proto;
|
||||
|
||||
#if defined(CONFIG_NF_CONNTRACK_MARK)
|
||||
u_int32_t mark;
|
||||
#endif
|
||||
|
||||
/* These members are dynamically allocated. */
|
||||
/* Storage reserved for other modules: */
|
||||
union nf_conntrack_proto proto;
|
||||
|
||||
union nf_conntrack_help *help;
|
||||
|
||||
/* Layer 3 dependent members. (ex: NAT) */
|
||||
union {
|
||||
struct nf_conntrack_ipv4 *ipv4;
|
||||
} l3proto;
|
||||
void *data[0];
|
||||
/* features dynamically at the end: helper, nat (both optional) */
|
||||
char data[0];
|
||||
};
|
||||
|
||||
struct nf_conntrack_expect
|
||||
@@ -373,10 +372,23 @@ nf_conntrack_expect_event(enum ip_conntrack_expect_events event,
|
||||
#define NF_CT_F_NUM 4
|
||||
|
||||
extern int
|
||||
nf_conntrack_register_cache(u_int32_t features, const char *name, size_t size,
|
||||
int (*init_conntrack)(struct nf_conn *, u_int32_t));
|
||||
nf_conntrack_register_cache(u_int32_t features, const char *name, size_t size);
|
||||
extern void
|
||||
nf_conntrack_unregister_cache(u_int32_t features);
|
||||
|
||||
/* valid combinations:
|
||||
* basic: nf_conn, nf_conn .. nf_conn_help
|
||||
* nat: nf_conn .. nf_conn_nat, nf_conn .. nf_conn_nat, nf_conn help
|
||||
*/
|
||||
static inline struct nf_conn_help *nfct_help(const struct nf_conn *ct)
|
||||
{
|
||||
unsigned int offset = sizeof(struct nf_conn);
|
||||
|
||||
if (!(ct->features & NF_CT_F_HELP))
|
||||
return NULL;
|
||||
|
||||
return (struct nf_conn_help *) ((void *)ct + offset);
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _NF_CONNTRACK_H */
|
||||
|
Reference in New Issue
Block a user