Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 51c23b47 authored by Pablo Neira Ayuso's avatar Pablo Neira Ayuso
Browse files

netfilter: nf_osf: add nf_osf_find()



This new function returns the OS genre as a string. Plan is to use to
from the new nft_osf extension.

Note that this doesn't yet support ttl options, but it could be easily
extended to do so.

Tested-by: default avatarFernando Fernandez Mancera <ffmancera@riseup.net>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 222440b4
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _NFOSF_H
#define _NFOSF_H

#include <uapi/linux/netfilter/nf_osf.h>

/* Initial window size option state machine: multiple of mss, mtu or
@@ -31,3 +35,8 @@ bool nf_osf_match(const struct sk_buff *skb, u_int8_t family,
		  int hooknum, struct net_device *in, struct net_device *out,
		  const struct nf_osf_info *info, struct net *net,
		  const struct list_head *nf_osf_fingers);

const char *nf_osf_find(const struct sk_buff *skb,
                        const struct list_head *nf_osf_fingers);

#endif /* _NFOSF_H */
+30 −0
Original line number Diff line number Diff line
@@ -249,4 +249,34 @@ nf_osf_match(const struct sk_buff *skb, u_int8_t family,
}
EXPORT_SYMBOL_GPL(nf_osf_match);

const char *nf_osf_find(const struct sk_buff *skb,
			const struct list_head *nf_osf_fingers)
{
	const struct iphdr *ip = ip_hdr(skb);
	const struct nf_osf_user_finger *f;
	unsigned char opts[MAX_IPOPTLEN];
	const struct nf_osf_finger *kf;
	struct nf_osf_hdr_ctx ctx;
	const struct tcphdr *tcp;
	const char *genre = NULL;

	memset(&ctx, 0, sizeof(ctx));

	tcp = nf_osf_hdr_ctx_init(&ctx, skb, ip, opts);
	if (!tcp)
		return false;

	list_for_each_entry_rcu(kf, &nf_osf_fingers[ctx.df], finger_entry) {
		f = &kf->finger;
		if (!nf_osf_match_one(skb, f, -1, &ctx))
			continue;

		genre = f->genre;
		break;
	}

	return genre;
}
EXPORT_SYMBOL_GPL(nf_osf_find);

MODULE_LICENSE("GPL");