#include <netinet/in.h>
#include <netinet/ether.h>
+#include <time.h>
+
#include <uci.h>
#include <libubox/list.h>
enum fw3_family
{
FW3_FAMILY_ANY = 0,
- FW3_FAMILY_V4 = 1,
- FW3_FAMILY_V6 = 2,
+ FW3_FAMILY_V4 = 4,
+ FW3_FAMILY_V6 = 5,
};
enum fw3_target
{
FW3_TARGET_UNSPEC = 0,
- FW3_TARGET_ACCEPT = 1,
- FW3_TARGET_REJECT = 2,
- FW3_TARGET_DROP = 3,
- FW3_TARGET_NOTRACK = 4,
- FW3_TARGET_DNAT = 5,
- FW3_TARGET_SNAT = 6,
+ FW3_TARGET_ACCEPT = 6,
+ FW3_TARGET_REJECT = 7,
+ FW3_TARGET_DROP = 8,
+ FW3_TARGET_NOTRACK = 9,
+ FW3_TARGET_DNAT = 10,
+ FW3_TARGET_SNAT = 11,
};
enum fw3_default
{
FW3_DEFAULT_UNSPEC = 0,
- FW3_DEFAULT_CUSTOM_CHAINS = 1,
- FW3_DEFAULT_SYN_FLOOD = 2,
- FW3_DEFAULT_MTU_FIX = 3,
- FW3_DEFAULT_DROP_INVALID = 4,
+ FW3_DEFAULT_CUSTOM_CHAINS = 12,
+ FW3_DEFAULT_SYN_FLOOD = 13,
+ FW3_DEFAULT_MTU_FIX = 14,
+ FW3_DEFAULT_DROP_INVALID = 15,
};
+extern const char *fw3_flag_names[FW3_DEFAULT_DROP_INVALID + 1];
+
+
enum fw3_limit_unit
{
FW3_LIMIT_UNIT_SECOND = 0,
FW3_IPSET_TYPE_SET = 5,
};
+enum fw3_include_type
+{
+ FW3_INC_TYPE_SCRIPT = 0,
+ FW3_INC_TYPE_RESTORE = 1,
+};
+
struct fw3_ipset_datatype
{
struct list_head list;
struct list_head list;
bool set;
+ bool range;
bool invert;
enum fw3_family family;
int mask;
struct in6_addr v6;
struct ether_addr mac;
} address;
+ union {
+ struct in_addr v4;
+ struct in6_addr v6;
+ struct ether_addr mac;
+ } address2;
};
struct fw3_mac
enum fw3_limit_unit unit;
};
+struct fw3_time
+{
+ bool utc;
+ struct tm datestart;
+ struct tm datestop;
+ uint32_t timestart;
+ uint32_t timestop;
+ uint32_t monthdays; /* bit 0 is invert + 1 .. 31 */
+ uint8_t weekdays; /* bit 0 is invert + 1 .. 7 */
+};
+
struct fw3_defaults
{
enum fw3_target policy_input;
bool tcp_syncookies;
bool tcp_ecn;
- bool tcp_westwood;
bool tcp_window_scaling;
bool accept_redirects;
bool disable_ipv6;
- uint8_t has_flag;
+ uint16_t flags;
};
struct fw3_zone
{
struct list_head list;
+ struct list_head running_list;
const char *name;
bool custom_chains;
- uint8_t has_src_target;
- uint8_t has_dest_target;
+ uint16_t src_flags;
+ uint16_t dst_flags;
};
struct fw3_rule
struct list_head icmp_type;
- enum fw3_target target;
-
struct fw3_limit limit;
+ struct fw3_time time;
+
+ enum fw3_target target;
const char *extra;
};
struct fw3_address ip_redir;
struct fw3_port port_redir;
+ struct fw3_time time;
+
enum fw3_target target;
const char *extra;
struct fw3_ipset
{
struct list_head list;
+ struct list_head running_list;
const char *name;
enum fw3_family family;
enum fw3_ipset_method method;
struct list_head datatypes;
- struct list_head iprange;
+ struct fw3_address iprange;
struct fw3_port portrange;
int netmask;
int timeout;
const char *external;
+
+ uint16_t flags;
+};
+
+struct fw3_include
+{
+ struct list_head list;
+ struct list_head running_list;
+
+ const char *name;
+ enum fw3_family family;
+
+ const char *path;
+ enum fw3_include_type type;
};
struct fw3_state
struct list_head redirects;
struct list_head forwards;
struct list_head ipsets;
+ struct list_head includes;
+
+ struct fw3_defaults running_defaults;
+ struct list_head running_zones;
+ struct list_head running_ipsets;
bool disable_ipsets;
+ bool statefile;
};
bool fw3_parse_family(void *ptr, const char *val);
bool fw3_parse_icmptype(void *ptr, const char *val);
bool fw3_parse_protocol(void *ptr, const char *val);
+
bool fw3_parse_ipset_method(void *ptr, const char *val);
bool fw3_parse_ipset_datatype(void *ptr, const char *val);
-void fw3_parse_options(void *s, struct fw3_option *opts, int n,
+bool fw3_parse_include_type(void *ptr, const char *val);
+
+bool fw3_parse_date(void *ptr, const char *val);
+bool fw3_parse_time(void *ptr, const char *val);
+bool fw3_parse_weekdays(void *ptr, const char *val);
+bool fw3_parse_monthdays(void *ptr, const char *val);
+
+void fw3_parse_options(void *s, const struct fw3_option *opts,
struct uci_section *section);
void fw3_format_in_out(struct fw3_device *in, struct fw3_device *out);
void fw3_format_icmptype(struct fw3_icmptype *icmp, enum fw3_family family);
void fw3_format_limit(struct fw3_limit *limit);
void fw3_format_ipset(struct fw3_ipset *ipset, bool invert);
+void fw3_format_time(struct fw3_time *time);
void __fw3_format_comment(const char *comment, ...);
#define fw3_format_comment(...) __fw3_format_comment(__VA_ARGS__, NULL)