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.

Signed-off-by: Pablo Neira Ayuso <pa...@netfilter.org>
---
Compile tested only.

 include/linux/netfilter/nf_osf.h |  3 +++
 net/netfilter/nf_osf.c           | 30 ++++++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/include/linux/netfilter/nf_osf.h b/include/linux/netfilter/nf_osf.h
index 0e114c492fb8..7d0947d6ef16 100644
--- a/include/linux/netfilter/nf_osf.h
+++ b/include/linux/netfilter/nf_osf.h
@@ -31,3 +31,6 @@ 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);
diff --git a/net/netfilter/nf_osf.c b/net/netfilter/nf_osf.c
index b44d62d5d9a9..f4c75e982902 100644
--- a/net/netfilter/nf_osf.c
+++ b/net/netfilter/nf_osf.c
@@ -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");
-- 
2.11.0

--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to