Skip to content

Commit

Permalink
netfilter: nf_osf: add nf_osf_find()
Browse files Browse the repository at this point in the history
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: Fernando Fernandez Mancera <[email protected]>
Signed-off-by: Pablo Neira Ayuso <[email protected]>
  • Loading branch information
ummakynes committed Jul 30, 2018
1 parent 222440b commit 51c23b4
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 0 deletions.
9 changes: 9 additions & 0 deletions include/linux/netfilter/nf_osf.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
/* 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
Expand Down Expand Up @@ -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 changes: 30 additions & 0 deletions net/netfilter/nf_osf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");

0 comments on commit 51c23b4

Please sign in to comment.