Annotation of embedaddon/bird2/lib/flowspec.h, revision 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>