4 #include <net/netfilter/nf_tables.h>
5 #include <linux/netfilter/nfnetlink_osf.h>
8 enum nft_registers dreg
:8;
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 tcp
= skb_header_pointer(skb
, ip_hdrlen(skb
),
26 sizeof(struct tcphdr
), &_tcph
);
28 regs
->verdict
.code
= NFT_BREAK
;
32 regs
->verdict
.code
= NFT_BREAK
;
36 os_name
= nf_osf_find(skb
, nf_osf_fingers
);
38 strncpy((char *)dest
, "unknown", NFT_OSF_MAXGENRELEN
);
40 strncpy((char *)dest
, os_name
, NFT_OSF_MAXGENRELEN
);
43 static int nft_osf_init(const struct nft_ctx
*ctx
,
44 const struct nft_expr
*expr
,
45 const struct nlattr
* const tb
[])
47 struct nft_osf
*priv
= nft_expr_priv(expr
);
50 if (!tb
[NFTA_OSF_DREG
])
53 priv
->dreg
= nft_parse_register(tb
[NFTA_OSF_DREG
]);
54 err
= nft_validate_register_store(ctx
, priv
->dreg
, NULL
,
55 NFT_DATA_VALUE
, NFT_OSF_MAXGENRELEN
);
62 static int nft_osf_dump(struct sk_buff
*skb
, const struct nft_expr
*expr
)
64 const struct nft_osf
*priv
= nft_expr_priv(expr
);
66 if (nft_dump_register(skb
, NFTA_OSF_DREG
, priv
->dreg
))
75 static int nft_osf_validate(const struct nft_ctx
*ctx
,
76 const struct nft_expr
*expr
,
77 const struct nft_data
**data
)
79 return nft_chain_validate_hooks(ctx
->chain
, (1 << NF_INET_LOCAL_IN
) |
80 (1 << NF_INET_PRE_ROUTING
) |
81 (1 << NF_INET_FORWARD
));
84 static struct nft_expr_type nft_osf_type
;
85 static const struct nft_expr_ops nft_osf_op
= {
87 .size
= NFT_EXPR_SIZE(sizeof(struct nft_osf
)),
90 .type
= &nft_osf_type
,
91 .validate
= nft_osf_validate
,
94 static struct nft_expr_type nft_osf_type __read_mostly
= {
98 .policy
= nft_osf_policy
,
99 .maxattr
= NFTA_OSF_MAX
,
102 static int __init
nft_osf_module_init(void)
104 return nft_register_expr(&nft_osf_type
);
107 static void __exit
nft_osf_module_exit(void)
109 return nft_unregister_expr(&nft_osf_type
);
112 module_init(nft_osf_module_init
);
113 module_exit(nft_osf_module_exit
);
115 MODULE_LICENSE("GPL");
116 MODULE_AUTHOR("Fernando Fernandez <ffmancera@riseup.net>");
117 MODULE_ALIAS_NFT_EXPR("osf");