4 #include <net/netfilter/nf_tables.h>
5 #include <linux/netfilter/nfnetlink_osf.h>
11 static const struct nla_policy nft_osf_policy[NFTA_OSF_MAX + 1] = {
12 [NFTA_OSF_DREG] = { .type = NLA_U32 },
15 static void nft_osf_eval(const struct nft_expr *expr, struct nft_regs *regs,
16 const struct nft_pktinfo *pkt)
18 struct nft_osf *priv = nft_expr_priv(expr);
19 u32 *dest = ®s->data[priv->dreg];
20 struct sk_buff *skb = pkt->skb;
21 const struct tcphdr *tcp;
25 if (pkt->tprot != IPPROTO_TCP) {
26 regs->verdict.code = NFT_BREAK;
30 tcp = skb_header_pointer(skb, ip_hdrlen(skb),
31 sizeof(struct tcphdr), &_tcph);
33 regs->verdict.code = NFT_BREAK;
37 regs->verdict.code = NFT_BREAK;
41 os_name = nf_osf_find(skb, nf_osf_fingers);
43 strncpy((char *)dest, "unknown", NFT_OSF_MAXGENRELEN);
45 strncpy((char *)dest, os_name, NFT_OSF_MAXGENRELEN);
48 static int nft_osf_init(const struct nft_ctx *ctx,
49 const struct nft_expr *expr,
50 const struct nlattr * const tb[])
52 struct nft_osf *priv = nft_expr_priv(expr);
55 if (!tb[NFTA_OSF_DREG])
58 err = nft_parse_register_store(ctx, tb[NFTA_OSF_DREG], &priv->dreg,
67 static int nft_osf_dump(struct sk_buff *skb, const struct nft_expr *expr)
69 const struct nft_osf *priv = nft_expr_priv(expr);
71 if (nft_dump_register(skb, NFTA_OSF_DREG, priv->dreg))
80 static int nft_osf_validate(const struct nft_ctx *ctx,
81 const struct nft_expr *expr,
82 const struct nft_data **data)
86 switch (ctx->family) {
90 hooks = (1 << NF_INET_LOCAL_IN) |
91 (1 << NF_INET_PRE_ROUTING) |
92 (1 << NF_INET_FORWARD);
98 return nft_chain_validate_hooks(ctx->chain, hooks);
101 static struct nft_expr_type nft_osf_type;
102 static const struct nft_expr_ops nft_osf_op = {
103 .eval = nft_osf_eval,
104 .size = NFT_EXPR_SIZE(sizeof(struct nft_osf)),
105 .init = nft_osf_init,
106 .dump = nft_osf_dump,
107 .type = &nft_osf_type,
108 .validate = nft_osf_validate,
111 static struct nft_expr_type nft_osf_type __read_mostly = {
114 .owner = THIS_MODULE,
115 .policy = nft_osf_policy,
116 .maxattr = NFTA_OSF_MAX,
119 static int __init nft_osf_module_init(void)
121 return nft_register_expr(&nft_osf_type);
124 static void __exit nft_osf_module_exit(void)
126 return nft_unregister_expr(&nft_osf_type);
129 module_init(nft_osf_module_init);
130 module_exit(nft_osf_module_exit);
132 MODULE_LICENSE("GPL");
133 MODULE_AUTHOR("Fernando Fernandez <ffmancera@riseup.net>");
134 MODULE_ALIAS_NFT_EXPR("osf");