/*
* Soft: Keepalived is a failover program for the LVS project
* <www.linuxvirtualserver.org>. It monitor & manipulate
* a loadbalanced server pool using multi-layer checks.
*
* Part: vrrp_iprule.c include file.
*
* Author: Chris Riley, <kernelchris@gmail.com>
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Copyright (C) 2015 Chris Riley, <kernelchris@gmail.com>
* Copyright (C) 2016-2017 Alexandre Cassen, <acassen@gmail.com>
*/
#ifndef _VRRP_IPRULE_H
#define _VRRP_IPRULE_H
/* global includes */
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <sys/types.h>
#if HAVE_DECL_FRA_UID_RANGE
#include <linux/fib_rules.h>
#endif
/* local includes */
#include "vrrp_if.h"
#include "vrrp_ipaddress.h"
#include "vrrp_static_track.h"
/* print buffer sizes */
#define RULE_BUF_SIZE 256
enum iprule_param_mask {
IPRULE_BIT_PRIORITY = 0x01,
IPRULE_BIT_FWMARK = 0x02,
IPRULE_BIT_FWMASK = 0x04,
IPRULE_BIT_SUP_GROUP = 0x08,
IPRULE_BIT_UID_RANGE = 0x10,
#if HAVE_DECL_FRA_PROTOCOL
IPRULE_BIT_PROTOCOL = 0x20,
#endif
#if HAVE_DECL_FRA_IP_PROTO
IPRULE_BIT_IP_PROTO = 0x40,
#endif
#if HAVE_DECL_FRA_SPORT_RANGE
IPRULE_BIT_SPORT_RANGE = 0x80,
#endif
#if HAVE_DECL_FRA_DPORT_RANGE
IPRULE_BIT_DPORT_RANGE = 0x100,
#endif
} ;
/* types definition */
typedef struct _ip_rule {
uint32_t mask;
bool invert;
int family;
ip_address_t *from_addr;
ip_address_t *to_addr;
uint32_t priority;
uint8_t tos;
uint32_t fwmark;
uint32_t fwmask;
uint32_t realms;
#if HAVE_DECL_FRA_SUPPRESS_PREFIXLEN
int32_t suppress_prefix_len;
#endif
#if HAVE_DECL_FRA_SUPPRESS_IFGROUP
uint32_t suppress_group;
#endif
interface_t *iif;
#if HAVE_DECL_FRA_OIFNAME
interface_t *oif;
#endif
uint32_t goto_target;
uint32_t table;
uint8_t action;
#if HAVE_DECL_FRA_TUN_ID
uint64_t tunnel_id;
#endif
#if HAVE_DECL_FRA_UID_RANGE
struct fib_rule_uid_range uid_range;
#endif
#if HAVE_DECL_FRA_L3MDEV
bool l3mdev;
#endif
#if HAVE_DECL_FRA_PROTOCOL
uint8_t protocol;
#endif
#if HAVE_DECL_FRA_IP_PROTO
uint8_t ip_proto;
#endif
#if HAVE_DECL_FRA_SPORT_RANGE
struct fib_rule_port_range src_port;
#endif
#if HAVE_DECL_FRA_DPORT_RANGE
struct fib_rule_port_range dst_port;
#endif
bool dont_track; /* used for virtual rules */
static_track_group_t *track_group; /* used for static rules */
bool set;
} ip_rule_t;
#define IPRULE_DEL 0
#define IPRULE_ADD 1
/* prototypes */
extern void reinstate_static_rule(ip_rule_t *);
extern void netlink_rulelist(list, int, bool);
extern void free_iprule(void *);
extern void format_iprule(ip_rule_t *, char *, size_t);
extern void dump_iprule(FILE *, void *);
extern void alloc_rule(list, vector_t *, bool);
extern void clear_diff_rules(list, list);
extern void clear_diff_srules(void);
extern void reset_next_rule_priority(void);
#endif