/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _UAPI_XT_HASHLIMIT_H
#define _UAPI_XT_HASHLIMIT_H

#include <linux/types.h>
#include <linux/limits.h>
#include <linux/if.h>


#define XT_HASHLIMIT_SCALE 10000
#define XT_HASHLIMIT_SCALE_v2 1000000llu



#define XT_HASHLIMIT_BYTE_SHIFT 4


struct xt_hashlimit_htable;

enum {
	XT_HASHLIMIT_HASH_DIP		= 1 << 0,
	XT_HASHLIMIT_HASH_DPT		= 1 << 1,
	XT_HASHLIMIT_HASH_SIP		= 1 << 2,
	XT_HASHLIMIT_HASH_SPT		= 1 << 3,
	XT_HASHLIMIT_INVERT		= 1 << 4,
	XT_HASHLIMIT_BYTES		= 1 << 5,
	XT_HASHLIMIT_RATE_MATCH		= 1 << 6,
};

struct hashlimit_cfg {
	__u32 mode;	  
	__u32 avg;    
	__u32 burst;  

	
	__u32 size;		
	__u32 max;		
	__u32 gc_interval;	
	__u32 expire;	
};

struct xt_hashlimit_info {
	char name [IFNAMSIZ];		
	struct hashlimit_cfg cfg;

	
	struct xt_hashlimit_htable *hinfo;
	union {
		void *ptr;
		struct xt_hashlimit_info *master;
	} u;
};

struct hashlimit_cfg1 {
	__u32 mode;	  
	__u32 avg;    
	__u32 burst;  

	
	__u32 size;		
	__u32 max;		
	__u32 gc_interval;	
	__u32 expire;	

	__u8 srcmask, dstmask;
};

struct hashlimit_cfg2 {
	__u64 avg;		
	__u64 burst;		
	__u32 mode;		

	
	__u32 size;		
	__u32 max;		
	__u32 gc_interval;	
	__u32 expire;		

	__u8 srcmask, dstmask;
};

struct hashlimit_cfg3 {
	__u64 avg;		
	__u64 burst;		
	__u32 mode;		

	
	__u32 size;		
	__u32 max;		
	__u32 gc_interval;	
	__u32 expire;		

	__u32 interval;
	__u8 srcmask, dstmask;
};

struct xt_hashlimit_mtinfo1 {
	char name[IFNAMSIZ];
	struct hashlimit_cfg1 cfg;

	
	struct xt_hashlimit_htable *hinfo __attribute__((aligned(8)));
};

struct xt_hashlimit_mtinfo2 {
	char name[NAME_MAX];
	struct hashlimit_cfg2 cfg;

	
	struct xt_hashlimit_htable *hinfo __attribute__((aligned(8)));
};

struct xt_hashlimit_mtinfo3 {
	char name[NAME_MAX];
	struct hashlimit_cfg3 cfg;

	
	struct xt_hashlimit_htable *hinfo __attribute__((aligned(8)));
};

#endif 
