Skip to content

Commit 303e0c5

Browse files
Florian Westphalummakynes
authored andcommitted
netfilter: conntrack: avoid unneeded nf_conntrack_l4proto lookups
after removal of the packet and invert function pointers, several places do not need to lookup the l4proto structure anymore. Remove those lookups. The function nf_ct_invert_tuplepr becomes redundant, replace it with nf_ct_invert_tuple everywhere. Signed-off-by: Florian Westphal <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent edf0338 commit 303e0c5

File tree

10 files changed

+22
-68
lines changed

10 files changed

+22
-68
lines changed

include/net/netfilter/nf_conntrack.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,6 @@ bool nf_ct_delete(struct nf_conn *ct, u32 pid, int report);
187187
bool nf_ct_get_tuplepr(const struct sk_buff *skb, unsigned int nhoff,
188188
u_int16_t l3num, struct net *net,
189189
struct nf_conntrack_tuple *tuple);
190-
bool nf_ct_invert_tuplepr(struct nf_conntrack_tuple *inverse,
191-
const struct nf_conntrack_tuple *orig);
192190

193191
void __nf_ct_refresh_acct(struct nf_conn *ct, enum ip_conntrack_info ctinfo,
194192
const struct sk_buff *skb,

include/net/netfilter/nf_conntrack_core.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ void nf_conntrack_init_end(void);
3939
void nf_conntrack_cleanup_end(void);
4040

4141
bool nf_ct_invert_tuple(struct nf_conntrack_tuple *inverse,
42-
const struct nf_conntrack_tuple *orig,
43-
const struct nf_conntrack_l4proto *l4proto);
42+
const struct nf_conntrack_tuple *orig);
4443

4544
/* Find a connection corresponding to a tuple. */
4645
struct nf_conntrack_tuple_hash *

net/ipv4/netfilter/nf_nat_l3proto_ipv4.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ int nf_nat_icmp_reply_translation(struct sk_buff *skb,
214214
}
215215

216216
/* Change outer to look like the reply to an incoming packet */
217-
nf_ct_invert_tuplepr(&target, &ct->tuplehash[!dir].tuple);
217+
nf_ct_invert_tuple(&target, &ct->tuplehash[!dir].tuple);
218218
if (!nf_nat_ipv4_manip_pkt(skb, 0, &target, manip))
219219
return 0;
220220

net/ipv6/netfilter/nf_nat_l3proto_ipv6.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ int nf_nat_icmpv6_reply_translation(struct sk_buff *skb,
225225
skb->len - hdrlen, 0));
226226
}
227227

228-
nf_ct_invert_tuplepr(&target, &ct->tuplehash[!dir].tuple);
228+
nf_ct_invert_tuple(&target, &ct->tuplehash[!dir].tuple);
229229
if (!nf_nat_ipv6_manip_pkt(skb, 0, &target, manip))
230230
return 0;
231231

net/netfilter/nf_conntrack_core.c

Lines changed: 9 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,7 @@ nf_ct_get_tuple(const struct sk_buff *skb,
229229
u_int16_t l3num,
230230
u_int8_t protonum,
231231
struct net *net,
232-
struct nf_conntrack_tuple *tuple,
233-
const struct nf_conntrack_l4proto *l4proto)
232+
struct nf_conntrack_tuple *tuple)
234233
{
235234
unsigned int size;
236235
const __be32 *ap;
@@ -374,33 +373,20 @@ bool nf_ct_get_tuplepr(const struct sk_buff *skb, unsigned int nhoff,
374373
u_int16_t l3num,
375374
struct net *net, struct nf_conntrack_tuple *tuple)
376375
{
377-
const struct nf_conntrack_l4proto *l4proto;
378376
u8 protonum;
379377
int protoff;
380-
int ret;
381-
382-
rcu_read_lock();
383378

384379
protoff = get_l4proto(skb, nhoff, l3num, &protonum);
385-
if (protoff <= 0) {
386-
rcu_read_unlock();
380+
if (protoff <= 0)
387381
return false;
388-
}
389382

390-
l4proto = __nf_ct_l4proto_find(protonum);
391-
392-
ret = nf_ct_get_tuple(skb, nhoff, protoff, l3num, protonum, net, tuple,
393-
l4proto);
394-
395-
rcu_read_unlock();
396-
return ret;
383+
return nf_ct_get_tuple(skb, nhoff, protoff, l3num, protonum, net, tuple);
397384
}
398385
EXPORT_SYMBOL_GPL(nf_ct_get_tuplepr);
399386

400387
bool
401388
nf_ct_invert_tuple(struct nf_conntrack_tuple *inverse,
402-
const struct nf_conntrack_tuple *orig,
403-
const struct nf_conntrack_l4proto *l4proto)
389+
const struct nf_conntrack_tuple *orig)
404390
{
405391
memset(inverse, 0, sizeof(*inverse));
406392

@@ -1354,7 +1340,6 @@ EXPORT_SYMBOL_GPL(nf_conntrack_free);
13541340
static noinline struct nf_conntrack_tuple_hash *
13551341
init_conntrack(struct net *net, struct nf_conn *tmpl,
13561342
const struct nf_conntrack_tuple *tuple,
1357-
const struct nf_conntrack_l4proto *l4proto,
13581343
struct sk_buff *skb,
13591344
unsigned int dataoff, u32 hash)
13601345
{
@@ -1367,7 +1352,7 @@ init_conntrack(struct net *net, struct nf_conn *tmpl,
13671352
struct nf_conn_timeout *timeout_ext;
13681353
struct nf_conntrack_zone tmp;
13691354

1370-
if (!nf_ct_invert_tuple(&repl_tuple, tuple, l4proto)) {
1355+
if (!nf_ct_invert_tuple(&repl_tuple, tuple)) {
13711356
pr_debug("Can't invert tuple.\n");
13721357
return NULL;
13731358
}
@@ -1449,7 +1434,6 @@ resolve_normal_ct(struct nf_conn *tmpl,
14491434
struct sk_buff *skb,
14501435
unsigned int dataoff,
14511436
u_int8_t protonum,
1452-
const struct nf_conntrack_l4proto *l4proto,
14531437
const struct nf_hook_state *state)
14541438
{
14551439
const struct nf_conntrack_zone *zone;
@@ -1462,7 +1446,7 @@ resolve_normal_ct(struct nf_conn *tmpl,
14621446

14631447
if (!nf_ct_get_tuple(skb, skb_network_offset(skb),
14641448
dataoff, state->pf, protonum, state->net,
1465-
&tuple, l4proto)) {
1449+
&tuple)) {
14661450
pr_debug("Can't get tuple\n");
14671451
return 0;
14681452
}
@@ -1472,7 +1456,7 @@ resolve_normal_ct(struct nf_conn *tmpl,
14721456
hash = hash_conntrack_raw(&tuple, state->net);
14731457
h = __nf_conntrack_find_get(state->net, zone, &tuple, hash);
14741458
if (!h) {
1475-
h = init_conntrack(state->net, tmpl, &tuple, l4proto,
1459+
h = init_conntrack(state->net, tmpl, &tuple,
14761460
skb, dataoff, hash);
14771461
if (!h)
14781462
return 0;
@@ -1592,7 +1576,6 @@ static int nf_conntrack_handle_packet(struct nf_conn *ct,
15921576
unsigned int
15931577
nf_conntrack_in(struct sk_buff *skb, const struct nf_hook_state *state)
15941578
{
1595-
const struct nf_conntrack_l4proto *l4proto;
15961579
enum ip_conntrack_info ctinfo;
15971580
struct nf_conn *ct, *tmpl;
15981581
u_int8_t protonum;
@@ -1619,8 +1602,6 @@ nf_conntrack_in(struct sk_buff *skb, const struct nf_hook_state *state)
16191602
goto out;
16201603
}
16211604

1622-
l4proto = __nf_ct_l4proto_find(protonum);
1623-
16241605
if (protonum == IPPROTO_ICMP || protonum == IPPROTO_ICMPV6) {
16251606
ret = nf_conntrack_handle_icmp(tmpl, skb, dataoff,
16261607
protonum, state);
@@ -1634,7 +1615,7 @@ nf_conntrack_in(struct sk_buff *skb, const struct nf_hook_state *state)
16341615
}
16351616
repeat:
16361617
ret = resolve_normal_ct(tmpl, skb, dataoff,
1637-
protonum, l4proto, state);
1618+
protonum, state);
16381619
if (ret < 0) {
16391620
/* Too stressed to deal. */
16401621
NF_CT_STAT_INC_ATOMIC(state->net, drop);
@@ -1681,19 +1662,6 @@ nf_conntrack_in(struct sk_buff *skb, const struct nf_hook_state *state)
16811662
}
16821663
EXPORT_SYMBOL_GPL(nf_conntrack_in);
16831664

1684-
bool nf_ct_invert_tuplepr(struct nf_conntrack_tuple *inverse,
1685-
const struct nf_conntrack_tuple *orig)
1686-
{
1687-
bool ret;
1688-
1689-
rcu_read_lock();
1690-
ret = nf_ct_invert_tuple(inverse, orig,
1691-
__nf_ct_l4proto_find(orig->dst.protonum));
1692-
rcu_read_unlock();
1693-
return ret;
1694-
}
1695-
EXPORT_SYMBOL_GPL(nf_ct_invert_tuplepr);
1696-
16971665
/* Alter reply tuple (maybe alter helper). This is for NAT, and is
16981666
implicitly racy: see __nf_conntrack_confirm */
16991667
void nf_conntrack_alter_reply(struct nf_conn *ct,
@@ -1824,7 +1792,6 @@ static void nf_conntrack_attach(struct sk_buff *nskb, const struct sk_buff *skb)
18241792

18251793
static int nf_conntrack_update(struct net *net, struct sk_buff *skb)
18261794
{
1827-
const struct nf_conntrack_l4proto *l4proto;
18281795
struct nf_conntrack_tuple_hash *h;
18291796
struct nf_conntrack_tuple tuple;
18301797
enum ip_conntrack_info ctinfo;
@@ -1845,10 +1812,8 @@ static int nf_conntrack_update(struct net *net, struct sk_buff *skb)
18451812
if (dataoff <= 0)
18461813
return -1;
18471814

1848-
l4proto = nf_ct_l4proto_find_get(l4num);
1849-
18501815
if (!nf_ct_get_tuple(skb, skb_network_offset(skb), dataoff, l3num,
1851-
l4num, net, &tuple, l4proto))
1816+
l4num, net, &tuple))
18521817
return -1;
18531818

18541819
if (ct->status & IPS_SRC_NAT) {

net/netfilter/nf_conntrack_pptp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ static void pptp_expectfn(struct nf_conn *ct,
121121
struct nf_conntrack_expect *exp_other;
122122

123123
/* obviously this tuple inversion only works until you do NAT */
124-
nf_ct_invert_tuplepr(&inv_t, &exp->tuple);
124+
nf_ct_invert_tuple(&inv_t, &exp->tuple);
125125
pr_debug("trying to unexpect other dir: ");
126126
nf_ct_dump_tuple(&inv_t);
127127

net/netfilter/nf_conntrack_proto_icmp.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ icmp_error_message(struct nf_conn *tmpl, struct sk_buff *skb,
109109
const struct nf_hook_state *state)
110110
{
111111
struct nf_conntrack_tuple innertuple, origtuple;
112-
const struct nf_conntrack_l4proto *innerproto;
113112
const struct nf_conntrack_tuple_hash *h;
114113
const struct nf_conntrack_zone *zone;
115114
enum ip_conntrack_info ctinfo;
@@ -127,12 +126,9 @@ icmp_error_message(struct nf_conn *tmpl, struct sk_buff *skb,
127126
return -NF_ACCEPT;
128127
}
129128

130-
/* rcu_read_lock()ed by nf_hook_thresh */
131-
innerproto = __nf_ct_l4proto_find(origtuple.dst.protonum);
132-
133129
/* Ordinarily, we'd expect the inverted tupleproto, but it's
134130
been preserved inside the ICMP. */
135-
if (!nf_ct_invert_tuple(&innertuple, &origtuple, innerproto)) {
131+
if (!nf_ct_invert_tuple(&innertuple, &origtuple)) {
136132
pr_debug("icmp_error_message: no match\n");
137133
return -NF_ACCEPT;
138134
}

net/netfilter/nf_conntrack_proto_icmpv6.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,6 @@ icmpv6_error_message(struct net *net, struct nf_conn *tmpl,
130130
{
131131
struct nf_conntrack_tuple intuple, origtuple;
132132
const struct nf_conntrack_tuple_hash *h;
133-
const struct nf_conntrack_l4proto *inproto;
134133
enum ip_conntrack_info ctinfo;
135134
struct nf_conntrack_zone tmp;
136135

@@ -146,12 +145,9 @@ icmpv6_error_message(struct net *net, struct nf_conn *tmpl,
146145
return -NF_ACCEPT;
147146
}
148147

149-
/* rcu_read_lock()ed by nf_hook_thresh */
150-
inproto = __nf_ct_l4proto_find(origtuple.dst.protonum);
151-
152148
/* Ordinarily, we'd expect the inverted tupleproto, but it's
153149
been preserved inside the ICMP. */
154-
if (!nf_ct_invert_tuple(&intuple, &origtuple, inproto)) {
150+
if (!nf_ct_invert_tuple(&intuple, &origtuple)) {
155151
pr_debug("icmpv6_error: Can't invert tuple\n");
156152
return -NF_ACCEPT;
157153
}

net/netfilter/nf_nat_core.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ nf_nat_used_tuple(const struct nf_conntrack_tuple *tuple,
158158
*/
159159
struct nf_conntrack_tuple reply;
160160

161-
nf_ct_invert_tuplepr(&reply, tuple);
161+
nf_ct_invert_tuple(&reply, tuple);
162162
return nf_conntrack_tuple_taken(&reply, ignored_conntrack);
163163
}
164164
EXPORT_SYMBOL(nf_nat_used_tuple);
@@ -253,7 +253,7 @@ find_appropriate_src(struct net *net,
253253
net_eq(net, nf_ct_net(ct)) &&
254254
nf_ct_zone_equal(ct, zone, IP_CT_DIR_ORIGINAL)) {
255255
/* Copy source part from reply tuple. */
256-
nf_ct_invert_tuplepr(result,
256+
nf_ct_invert_tuple(result,
257257
&ct->tuplehash[IP_CT_DIR_REPLY].tuple);
258258
result->dst = tuple->dst;
259259

@@ -560,16 +560,16 @@ nf_nat_setup_info(struct nf_conn *ct,
560560
* manipulations (future optimization: if num_manips == 0,
561561
* orig_tp = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple)
562562
*/
563-
nf_ct_invert_tuplepr(&curr_tuple,
564-
&ct->tuplehash[IP_CT_DIR_REPLY].tuple);
563+
nf_ct_invert_tuple(&curr_tuple,
564+
&ct->tuplehash[IP_CT_DIR_REPLY].tuple);
565565

566566
get_unique_tuple(&new_tuple, &curr_tuple, range, ct, maniptype);
567567

568568
if (!nf_ct_tuple_equal(&new_tuple, &curr_tuple)) {
569569
struct nf_conntrack_tuple reply;
570570

571571
/* Alter conntrack table so will recognize replies. */
572-
nf_ct_invert_tuplepr(&reply, &new_tuple);
572+
nf_ct_invert_tuple(&reply, &new_tuple);
573573
nf_conntrack_alter_reply(ct, &reply);
574574

575575
/* Non-atomic: we own this at the moment. */
@@ -640,7 +640,7 @@ static unsigned int nf_nat_manip_pkt(struct sk_buff *skb, struct nf_conn *ct,
640640
struct nf_conntrack_tuple target;
641641

642642
/* We are aiming to look like inverse of other direction. */
643-
nf_ct_invert_tuplepr(&target, &ct->tuplehash[!dir].tuple);
643+
nf_ct_invert_tuple(&target, &ct->tuplehash[!dir].tuple);
644644

645645
l3proto = __nf_nat_l3proto_find(target.src.l3num);
646646
if (!l3proto->manip_pkt(skb, 0, &target, mtype))

net/openvswitch/conntrack.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,7 @@ ovs_ct_find_existing(struct net *net, const struct nf_conntrack_zone *zone,
622622
if (natted) {
623623
struct nf_conntrack_tuple inverse;
624624

625-
if (!nf_ct_invert_tuplepr(&inverse, &tuple)) {
625+
if (!nf_ct_invert_tuple(&inverse, &tuple)) {
626626
pr_debug("ovs_ct_find_existing: Inversion failed!\n");
627627
return NULL;
628628
}

0 commit comments

Comments
 (0)