Annotation of embedaddon/bird2/lib/flowspec.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  *     BIRD Library -- Flow specification (RFC 5575)
                      3:  *
                      4:  *     (c) 2016 CZ.NIC z.s.p.o.
                      5:  *
                      6:  *     Can be freely distributed and used under the terms of the GNU GPL.
                      7:  */
                      8: 
                      9: #ifndef _BIRD_FLOWSPEC_H_
                     10: #define _BIRD_FLOWSPEC_H_
                     11: 
                     12: #include "nest/bird.h"
                     13: #include "lib/buffer.h"
                     14: #include "lib/net.h"
                     15: 
                     16: 
                     17: /* Flow component operators */
                     18: #define FLOW_OP_TRUE           0x00    /* 0b000 */
                     19: #define FLOW_OP_EQ             0x01    /* 0b001 */
                     20: #define FLOW_OP_GT             0x02    /* 0b010 */
                     21: #define FLOW_OP_GEQ            0x03    /* 0b011 */
                     22: #define FLOW_OP_LT             0x04    /* 0b100 */
                     23: #define FLOW_OP_LEQ            0x05    /* 0b101 */
                     24: #define FLOW_OP_NEQ            0x06    /* 0b110 */
                     25: #define FLOW_OP_FALSE          0x07    /* 0b111 */
                     26: 
                     27: #define FLOW_OP_OR             0x00
                     28: #define FLOW_OP_AND            0x40
                     29: 
                     30: 
                     31: /* Types of components in flowspec */
                     32: enum flow_type {
                     33:   FLOW_TYPE_DST_PREFIX                 =  1,
                     34:   FLOW_TYPE_SRC_PREFIX                 =  2,
                     35:   FLOW_TYPE_IP_PROTOCOL        =  3,
                     36:   FLOW_TYPE_NEXT_HEADER        =  3,   /* IPv6 */
                     37:   FLOW_TYPE_PORT               =  4,
                     38:   FLOW_TYPE_DST_PORT           =  5,
                     39:   FLOW_TYPE_SRC_PORT           =  6,
                     40:   FLOW_TYPE_ICMP_TYPE          =  7,
                     41:   FLOW_TYPE_ICMP_CODE          =  8,
                     42:   FLOW_TYPE_TCP_FLAGS          =  9,
                     43:   FLOW_TYPE_PACKET_LENGTH      = 10,
                     44:   FLOW_TYPE_DSCP               = 11,   /* DiffServ Code Point */
                     45:   FLOW_TYPE_FRAGMENT           = 12,
                     46:   FLOW_TYPE_LABEL              = 13,   /* IPv6 */
                     47:   FLOW_TYPE_MAX
                     48: };
                     49: 
                     50: const char *flow_type_str(enum flow_type type, int ipv6);
                     51: 
                     52: 
                     53: /*
                     54:  *     Length
                     55:  */
                     56: 
                     57: uint flow_write_length(byte *data, u16 len);
                     58: 
                     59: static inline u16 flow_hdr_length(const byte *data)
                     60: { return ((*data & 0xf0) == 0xf0) ? 2 : 1; }
                     61: 
                     62: static inline u16 flow_read_length(const byte *data)
                     63: { return ((*data & 0xf0) == 0xf0) ? get_u16(data) & 0x0fff : *data; }
                     64: 
                     65: static inline u16 flow4_get_length(const net_addr_flow4 *f)
                     66: { return f->length - sizeof(net_addr_flow4); }
                     67: 
                     68: static inline u16 flow6_get_length(const net_addr_flow6 *f)
                     69: { return f->length - sizeof(net_addr_flow6); }
                     70: 
                     71: static inline void flow4_set_length(net_addr_flow4 *f, u16 len)
                     72: { f->length = sizeof(net_addr_flow4) + flow_write_length(f->data, len) + len; }
                     73: 
                     74: static inline void flow6_set_length(net_addr_flow6 *f, u16 len)
                     75: { f->length = sizeof(net_addr_flow6) + flow_write_length(f->data, len) + len; }
                     76: 
                     77: 
                     78: /*
                     79:  *     Iterators
                     80:  */
                     81: 
                     82: const byte *flow4_first_part(const net_addr_flow4 *f);
                     83: const byte *flow6_first_part(const net_addr_flow6 *f);
                     84: const byte *flow4_next_part(const byte *pos, const byte *end);
                     85: const byte *flow6_next_part(const byte *pos, const byte *end);
                     86: 
                     87: 
                     88: /*
                     89:  *     Flowspec Builder
                     90:  */
                     91: 
                     92: /* A data structure for keep a state of flow builder */
                     93: struct flow_builder {
                     94:   BUFFER_(byte) data;
                     95:   enum flow_type this_type;
                     96:   enum flow_type last_type;
                     97:   u16 last_op_offset;                  /* Position of last operator in data.data */
                     98:   int ipv6;
                     99:   struct {
                    100:     u16 offset;                                /* Beginning of a component */
                    101:     u16 length;                                /* Length of a component */
                    102:   } parts[FLOW_TYPE_MAX];              /* Indexing all components */
                    103: };
                    104: 
                    105: struct flow_builder *flow_builder_init(pool *pool);
                    106: void flow_builder_clear(struct flow_builder *fb);
                    107: void flow_builder_set_type(struct flow_builder *fb, enum flow_type p);
                    108: int flow_builder4_add_pfx(struct flow_builder *fb, const net_addr_ip4 *n4);
                    109: int flow_builder6_add_pfx(struct flow_builder *fb, const net_addr_ip6 *n6, u32 offset);
                    110: int flow_builder_add_op_val(struct flow_builder *fb, byte op, u32 value);
                    111: int flow_builder_add_val_mask(struct flow_builder *fb, byte op, u32 value, u32 mask);
                    112: net_addr_flow4 *flow_builder4_finalize(struct flow_builder *fb, linpool *lpool);
                    113: net_addr_flow6 *flow_builder6_finalize(struct flow_builder *fb, linpool *lpool);
                    114: 
                    115: 
                    116: /*
                    117:  *     Validation
                    118:  */
                    119: 
                    120: /* Results of validation Flow specification */
                    121: enum flow_validated_state {
                    122:   FLOW_ST_UNKNOWN_COMPONENT,
                    123:   FLOW_ST_VALID,
                    124:   FLOW_ST_NOT_COMPLETE,
                    125:   FLOW_ST_EXCEED_MAX_PREFIX_LENGTH,
                    126:   FLOW_ST_EXCEED_MAX_PREFIX_OFFSET,
                    127:   FLOW_ST_EXCEED_MAX_VALUE_LENGTH,
                    128:   FLOW_ST_BAD_TYPE_ORDER,
                    129:   FLOW_ST_AND_BIT_SHOULD_BE_UNSET,
                    130:   FLOW_ST_ZERO_BIT_SHOULD_BE_UNSED,
                    131:   FLOW_ST_DEST_PREFIX_REQUIRED,
                    132:   FLOW_ST_INVALID_TCP_FLAGS,
                    133:   FLOW_ST_CANNOT_USE_DONT_FRAGMENT
                    134: };
                    135: 
                    136: const char *flow_validated_state_str(enum flow_validated_state code);
                    137: enum flow_validated_state flow4_validate(const byte *nlri, uint len);
                    138: enum flow_validated_state flow6_validate(const byte *nlri, uint len);
                    139: void flow_check_cf_value_length(struct flow_builder *fb, u32 expr);
                    140: void flow_check_cf_bmk_values(struct flow_builder *fb, u8 neg, u32 val, u32 mask);
                    141: void flow4_validate_cf(net_addr_flow4 *f);
                    142: void flow6_validate_cf(net_addr_flow6 *f);
                    143: 
                    144: 
                    145: /*
                    146:  *     Net Formatting
                    147:  */
                    148: 
                    149: uint flow4_net_format(char *buf, uint blen, const net_addr_flow4 *f);
                    150: uint flow6_net_format(char *buf, uint blen, const net_addr_flow6 *f);
                    151: 
                    152: #endif /* _BIRD_FLOWSPEC_H_ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>