Skip to content

Commit c26d0d9

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf
Pablo Neira Ayuso says: ==================== Netfilter fixes for net 1) Fix incorrect TCP connection tracking window reset for non-syn packets, from Florian Westphal. 2) Incorrect dependency on CONFIG_NFT_FLOW_OFFLOAD, from Volodymyr Mytnyk. 3) Fix nft_socket from the output path, from Florian Westphal. * git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf: netfilter: nft_socket: only do sk lookups when indev is available netfilter: conntrack: fix udp offload timeout sysctl netfilter: nf_conntrack_tcp: re-init for syn packets only ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents aeaf59b + 743b83f commit c26d0d9

File tree

3 files changed

+45
-30
lines changed

3 files changed

+45
-30
lines changed

net/netfilter/nf_conntrack_proto_tcp.c

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -556,32 +556,23 @@ static bool tcp_in_window(struct nf_conn *ct,
556556
}
557557

558558
}
559-
} else if (((state->state == TCP_CONNTRACK_SYN_SENT
560-
&& dir == IP_CT_DIR_ORIGINAL)
561-
|| (state->state == TCP_CONNTRACK_SYN_RECV
562-
&& dir == IP_CT_DIR_REPLY))
563-
&& after(end, sender->td_end)) {
559+
} else if (tcph->syn &&
560+
after(end, sender->td_end) &&
561+
(state->state == TCP_CONNTRACK_SYN_SENT ||
562+
state->state == TCP_CONNTRACK_SYN_RECV)) {
564563
/*
565564
* RFC 793: "if a TCP is reinitialized ... then it need
566565
* not wait at all; it must only be sure to use sequence
567566
* numbers larger than those recently used."
568-
*/
569-
sender->td_end =
570-
sender->td_maxend = end;
571-
sender->td_maxwin = (win == 0 ? 1 : win);
572-
573-
tcp_options(skb, dataoff, tcph, sender);
574-
} else if (tcph->syn && dir == IP_CT_DIR_REPLY &&
575-
state->state == TCP_CONNTRACK_SYN_SENT) {
576-
/* Retransmitted syn-ack, or syn (simultaneous open).
577567
*
578568
* Re-init state for this direction, just like for the first
579569
* syn(-ack) reply, it might differ in seq, ack or tcp options.
580570
*/
581571
tcp_init_sender(sender, receiver,
582572
skb, dataoff, tcph,
583573
end, win);
584-
if (!tcph->ack)
574+
575+
if (dir == IP_CT_DIR_REPLY && !tcph->ack)
585576
return true;
586577
}
587578

net/netfilter/nf_conntrack_standalone.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -823,7 +823,7 @@ static struct ctl_table nf_ct_sysctl_table[] = {
823823
.mode = 0644,
824824
.proc_handler = proc_dointvec_jiffies,
825825
},
826-
#if IS_ENABLED(CONFIG_NFT_FLOW_OFFLOAD)
826+
#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
827827
[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD] = {
828828
.procname = "nf_flowtable_udp_timeout",
829829
.maxlen = sizeof(unsigned int),

net/netfilter/nft_socket.c

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,32 @@ nft_sock_get_eval_cgroupv2(u32 *dest, struct sock *sk, const struct nft_pktinfo
5454
}
5555
#endif
5656

57+
static struct sock *nft_socket_do_lookup(const struct nft_pktinfo *pkt)
58+
{
59+
const struct net_device *indev = nft_in(pkt);
60+
const struct sk_buff *skb = pkt->skb;
61+
struct sock *sk = NULL;
62+
63+
if (!indev)
64+
return NULL;
65+
66+
switch (nft_pf(pkt)) {
67+
case NFPROTO_IPV4:
68+
sk = nf_sk_lookup_slow_v4(nft_net(pkt), skb, indev);
69+
break;
70+
#if IS_ENABLED(CONFIG_NF_TABLES_IPV6)
71+
case NFPROTO_IPV6:
72+
sk = nf_sk_lookup_slow_v6(nft_net(pkt), skb, indev);
73+
break;
74+
#endif
75+
default:
76+
WARN_ON_ONCE(1);
77+
break;
78+
}
79+
80+
return sk;
81+
}
82+
5783
static void nft_socket_eval(const struct nft_expr *expr,
5884
struct nft_regs *regs,
5985
const struct nft_pktinfo *pkt)
@@ -67,20 +93,7 @@ static void nft_socket_eval(const struct nft_expr *expr,
6793
sk = NULL;
6894

6995
if (!sk)
70-
switch(nft_pf(pkt)) {
71-
case NFPROTO_IPV4:
72-
sk = nf_sk_lookup_slow_v4(nft_net(pkt), skb, nft_in(pkt));
73-
break;
74-
#if IS_ENABLED(CONFIG_NF_TABLES_IPV6)
75-
case NFPROTO_IPV6:
76-
sk = nf_sk_lookup_slow_v6(nft_net(pkt), skb, nft_in(pkt));
77-
break;
78-
#endif
79-
default:
80-
WARN_ON_ONCE(1);
81-
regs->verdict.code = NFT_BREAK;
82-
return;
83-
}
96+
sk = nft_socket_do_lookup(pkt);
8497

8598
if (!sk) {
8699
regs->verdict.code = NFT_BREAK;
@@ -224,13 +237,24 @@ static bool nft_socket_reduce(struct nft_regs_track *track,
224237
return nft_expr_reduce_bitwise(track, expr);
225238
}
226239

240+
static int nft_socket_validate(const struct nft_ctx *ctx,
241+
const struct nft_expr *expr,
242+
const struct nft_data **data)
243+
{
244+
return nft_chain_validate_hooks(ctx->chain,
245+
(1 << NF_INET_PRE_ROUTING) |
246+
(1 << NF_INET_LOCAL_IN) |
247+
(1 << NF_INET_LOCAL_OUT));
248+
}
249+
227250
static struct nft_expr_type nft_socket_type;
228251
static const struct nft_expr_ops nft_socket_ops = {
229252
.type = &nft_socket_type,
230253
.size = NFT_EXPR_SIZE(sizeof(struct nft_socket)),
231254
.eval = nft_socket_eval,
232255
.init = nft_socket_init,
233256
.dump = nft_socket_dump,
257+
.validate = nft_socket_validate,
234258
.reduce = nft_socket_reduce,
235259
};
236260

0 commit comments

Comments
 (0)