mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
[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 <[email protected]> Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
parent
0d36f37bb1
commit
dc808fe28d
8 changed files with 148 additions and 138 deletions
|
|
@ -179,31 +179,36 @@ static unsigned int ipv6_confirm(unsigned int hooknum,
|
|||
int (*okfn)(struct sk_buff *))
|
||||
{
|
||||
struct nf_conn *ct;
|
||||
struct nf_conn_help *help;
|
||||
enum ip_conntrack_info ctinfo;
|
||||
unsigned int ret, protoff;
|
||||
unsigned int extoff = (u8*)((*pskb)->nh.ipv6h + 1)
|
||||
- (*pskb)->data;
|
||||
unsigned char pnum = (*pskb)->nh.ipv6h->nexthdr;
|
||||
|
||||
|
||||
/* This is where we call the helper: as the packet goes out. */
|
||||
ct = nf_ct_get(*pskb, &ctinfo);
|
||||
if (ct && ct->helper) {
|
||||
unsigned int ret, protoff;
|
||||
unsigned int extoff = (u8*)((*pskb)->nh.ipv6h + 1)
|
||||
- (*pskb)->data;
|
||||
unsigned char pnum = (*pskb)->nh.ipv6h->nexthdr;
|
||||
if (!ct)
|
||||
goto out;
|
||||
|
||||
protoff = nf_ct_ipv6_skip_exthdr(*pskb, extoff, &pnum,
|
||||
(*pskb)->len - extoff);
|
||||
if (protoff < 0 || protoff > (*pskb)->len ||
|
||||
pnum == NEXTHDR_FRAGMENT) {
|
||||
DEBUGP("proto header not found\n");
|
||||
return NF_ACCEPT;
|
||||
}
|
||||
help = nfct_help(ct);
|
||||
if (!help || !help->helper)
|
||||
goto out;
|
||||
|
||||
ret = ct->helper->help(pskb, protoff, ct, ctinfo);
|
||||
if (ret != NF_ACCEPT)
|
||||
return ret;
|
||||
protoff = nf_ct_ipv6_skip_exthdr(*pskb, extoff, &pnum,
|
||||
(*pskb)->len - extoff);
|
||||
if (protoff < 0 || protoff > (*pskb)->len ||
|
||||
pnum == NEXTHDR_FRAGMENT) {
|
||||
DEBUGP("proto header not found\n");
|
||||
return NF_ACCEPT;
|
||||
}
|
||||
|
||||
ret = help->helper->help(pskb, protoff, ct, ctinfo);
|
||||
if (ret != NF_ACCEPT)
|
||||
return ret;
|
||||
out:
|
||||
/* We've seen it coming out the other side: confirm it */
|
||||
|
||||
return nf_conntrack_confirm(pskb);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue