#include "interface-ip.h"
+#define IPRULE_PRIORITY_ADDR 10000
+#define IPRULE_PRIORITY_ADDR_MASK 20000
+#define IPRULE_PRIORITY_NW 90000
+#define IPRULE_PRIORITY_REJECT 4200000000
+
enum iprule_flags {
/* address family for rule */
IPRULE_INET4 = (0 << 0),
IPRULE_FAMILY = IPRULE_INET4 | IPRULE_INET6,
/* rule specifies input device */
- IPRULE_IN = (1 << 2),
+ IPRULE_IN = (1 << 2),
/* rule specifies output device */
- IPRULE_OUT = (1 << 3),
+ IPRULE_OUT = (1 << 3),
/* rule specifies src */
- IPRULE_SRC = (1 << 4),
+ IPRULE_SRC = (1 << 4),
/* rule specifies dest */
- IPRULE_DEST = (1 << 5),
+ IPRULE_DEST = (1 << 5),
/* rule specifies priority */
IPRULE_PRIORITY = (1 << 6),
/* rule specifies diffserv/tos */
- IPRULE_TOS = (1 << 7),
+ IPRULE_TOS = (1 << 7),
/* rule specifies fwmark */
IPRULE_FWMARK = (1 << 8),
IPRULE_ACTION = (1 << 11),
/* rule is a goto */
- IPRULE_GOTO = (1 << 12),
+ IPRULE_GOTO = (1 << 12),
+
+ /* rule suppresses results by prefix length */
+ IPRULE_SUP_PREFIXLEN = (1 << 13),
+
+ /* rule specifies uidrange */
+ IPRULE_UIDRANGE = (1 << 14),
};
struct iprule {
struct vlist_node node;
unsigned int order;
+ /* to receive interface events */
+ struct interface_user in_iface_user;
+ struct interface_user out_iface_user;
+
+ /* device name */
+ char in_dev[IFNAMSIZ + 1];
+ char out_dev[IFNAMSIZ + 1];
+
/* everything below is used as avl tree key */
+ /* don't change the order */
+
+ /* uci interface name */
+ char *in_iface;
+ char *out_iface;
+
enum iprule_flags flags;
bool invert;
- char in_dev[IFNAMSIZ + 1];
- char out_dev[IFNAMSIZ + 1];
-
unsigned int src_mask;
union if_addr src_addr;
unsigned int fwmask;
unsigned int lookup;
+ unsigned int sup_prefixlen;
+ unsigned int uidrange_start;
+ unsigned int uidrange_end;
unsigned int action;
unsigned int gotoid;
};
extern struct vlist_tree iprules;
-extern const struct config_param_list rule_attr_list;
+extern const struct uci_blob_param_list rule_attr_list;
void iprule_add(struct blob_attr *attr, bool v6);
void iprule_update_start(void);