/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _NFOSF_H
#define _NFOSF_H

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

enum osf_fmatch_states {
	/* Packet does not match the fingerprint */
	FMATCH_WRONG = 0,
	/* Packet matches the fingerprint */
	FMATCH_OK,
	/* Options do not match the fingerprint, but header does */
	FMATCH_OPT_WRONG,
};

extern struct list_head nf_osf_fingers[2];

struct nf_osf_finger {
	struct rcu_head			rcu_head;
	struct list_head		finger_entry;
	struct nf_osf_user_finger	finger;
};

struct nf_osf_data {
	const char *genre;
	const char *version;
};

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);

bool nf_osf_find(const struct sk_buff *skb,
		 const struct list_head *nf_osf_fingers,
		 const int ttl_check, struct nf_osf_data *data);

#endif /* _NFOSF_H */