Annotation of embedaddon/bird2/conf/flowspec.Y, revision 1.1

1.1     ! misho       1: /*
        !             2:  *     BIRD -- Flow specification (RFC 5575) grammar
        !             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: CF_HDR
        !            10: 
        !            11: #define PARSER 1
        !            12: 
        !            13: #include "nest/bird.h"
        !            14: #include "lib/flowspec.h"
        !            15: 
        !            16: 
        !            17: CF_DEFINES
        !            18: 
        !            19: struct flow_builder *this_flow;
        !            20: 
        !            21: 
        !            22: CF_DECLS
        !            23: 
        !            24: %type <i32> flow_num_op flow_srcdst flow_logic_op flow_num_type_ flow_frag_val flow_neg
        !            25: %type <net_ptr> net_flow4_ net_flow6_ net_flow_
        !            26: 
        !            27: CF_KEYWORDS(FLOW4, FLOW6, DST, SRC, PROTO, NEXT, HEADER, DPORT, SPORT, ICMP,
        !            28:            TYPE, CODE, TCP, FLAGS, LENGTH, DSCP, DONT_FRAGMENT, IS_FRAGMENT,
        !            29:            FIRST_FRAGMENT, LAST_FRAGMENT, FRAGMENT, LABEL, OFFSET)
        !            30: 
        !            31: 
        !            32: CF_GRAMMAR
        !            33: 
        !            34: /* Network Flow Specification */
        !            35: 
        !            36: flow_num_op:
        !            37:    TRUE                { $$ = FLOW_OP_TRUE; }
        !            38:  | '='         { $$ = FLOW_OP_EQ;  }
        !            39:  | NEQ         { $$ = FLOW_OP_NEQ; }
        !            40:  | '<'         { $$ = FLOW_OP_LT;  }
        !            41:  | LEQ         { $$ = FLOW_OP_LEQ; }
        !            42:  | '>'         { $$ = FLOW_OP_GT;  }
        !            43:  | GEQ         { $$ = FLOW_OP_GEQ; }
        !            44:  | FALSE       { $$ = FLOW_OP_FALSE; }
        !            45:  ;
        !            46: 
        !            47: flow_logic_op:
        !            48:    OR          { $$ = FLOW_OP_OR; }
        !            49:  | AND         { $$ = FLOW_OP_AND; }
        !            50:  ;
        !            51: 
        !            52: flow_num_type_:
        !            53:    PROTO       { $$ = FLOW_TYPE_IP_PROTOCOL; }
        !            54:  | NEXT HEADER  { $$ = FLOW_TYPE_NEXT_HEADER; }
        !            55:  | PORT                { $$ = FLOW_TYPE_PORT; }
        !            56:  | DPORT       { $$ = FLOW_TYPE_DST_PORT; }
        !            57:  | SPORT       { $$ = FLOW_TYPE_SRC_PORT; }
        !            58:  | ICMP TYPE   { $$ = FLOW_TYPE_ICMP_TYPE; }
        !            59:  | ICMP CODE   { $$ = FLOW_TYPE_ICMP_CODE; }
        !            60:  | LENGTH      { $$ = FLOW_TYPE_PACKET_LENGTH; }
        !            61:  | DSCP                { $$ = FLOW_TYPE_DSCP; }
        !            62:  ;
        !            63: 
        !            64: flow_num_type: flow_num_type_{ flow_builder_set_type(this_flow, $1); };
        !            65: flow_flag_type: TCP FLAGS    { flow_builder_set_type(this_flow, FLOW_TYPE_TCP_FLAGS); };
        !            66: flow_frag_type: FRAGMENT     { flow_builder_set_type(this_flow, FLOW_TYPE_FRAGMENT); };
        !            67: flow_label_type: LABEL       { flow_builder_set_type(this_flow, FLOW_TYPE_LABEL); };
        !            68: 
        !            69: flow_srcdst:
        !            70:    DST         { $$ = FLOW_TYPE_DST_PREFIX; }
        !            71:  | SRC         { $$ = FLOW_TYPE_SRC_PREFIX; }
        !            72:  ;
        !            73: 
        !            74: flow_num_opts:
        !            75:    flow_num_op expr {
        !            76:      flow_check_cf_value_length(this_flow, $2);
        !            77:      flow_builder_add_op_val(this_flow, $1, $2);
        !            78:    }
        !            79:  | flow_num_opts flow_logic_op flow_num_op expr {
        !            80:      flow_check_cf_value_length(this_flow, $4);
        !            81:      flow_builder_add_op_val(this_flow, $2 | $3, $4);
        !            82:    }
        !            83:  | flow_num_opt_ext
        !            84:  | flow_num_opts OR flow_num_opt_ext
        !            85:  ;
        !            86: 
        !            87: flow_num_opt_ext_expr:
        !            88:    expr {
        !            89:      flow_check_cf_value_length(this_flow, $1);
        !            90:      flow_builder_add_op_val(this_flow, FLOW_OP_EQ, $1);
        !            91:    }
        !            92:  | expr DDOT expr {
        !            93:      flow_check_cf_value_length(this_flow, $1);
        !            94:      flow_check_cf_value_length(this_flow, $3);
        !            95:      flow_builder_add_op_val(this_flow, FLOW_OP_GEQ, $1);
        !            96:      flow_builder_add_op_val(this_flow, FLOW_OP_AND | FLOW_OP_LEQ, $3);
        !            97:    }
        !            98:  ;
        !            99: 
        !           100: flow_num_opt_ext:
        !           101:    flow_num_opt_ext_expr
        !           102:  | flow_num_opt_ext ',' flow_num_opt_ext_expr
        !           103:  ;
        !           104: 
        !           105: flow_bmk_opts:
        !           106:    flow_neg expr '/' expr {
        !           107:      flow_check_cf_bmk_values(this_flow, $1, $2, $4);
        !           108:      flow_builder_add_val_mask(this_flow, $1, $2, $4);
        !           109:    }
        !           110:  | flow_bmk_opts flow_logic_op flow_neg expr '/' expr {
        !           111:      flow_check_cf_bmk_values(this_flow, $3, $4, $6);
        !           112:      flow_builder_add_val_mask(this_flow, $2 | $3, $4, $6);
        !           113:    }
        !           114:  | flow_bmk_opts ',' flow_neg expr '/' expr {
        !           115:      flow_check_cf_bmk_values(this_flow, $3, $4, $6);
        !           116:      flow_builder_add_val_mask(this_flow, 0x40 | $3, $4, $6); /* AND */
        !           117:    }
        !           118:  ;
        !           119: 
        !           120: flow_neg:
        !           121:    /* empty */         { $$ = 0x00; }
        !           122:  | '!'         { $$ = 0x02; }
        !           123:  ;
        !           124: 
        !           125: flow_frag_val:
        !           126:    DONT_FRAGMENT  { $$ = 1; }
        !           127:  | IS_FRAGMENT   { $$ = 2; }
        !           128:  | FIRST_FRAGMENT { $$ = 4; }
        !           129:  | LAST_FRAGMENT  { $$ = 8; }
        !           130:  ;
        !           131: 
        !           132: flow_frag_opts:
        !           133:    flow_neg flow_frag_val {
        !           134:      flow_builder_add_val_mask(this_flow, 0, ($1 ? 0 : $2), $2);
        !           135:    }
        !           136:  | flow_frag_opts flow_logic_op flow_neg flow_frag_val {
        !           137:      flow_builder_add_val_mask(this_flow, $2, ($3 ? 0 : $4), $4);
        !           138:    }
        !           139:  | flow_frag_opts ',' flow_neg flow_frag_val {
        !           140:      flow_builder_add_val_mask(this_flow, 0x40, ($3 ? 0 : $4), $4); /* AND */
        !           141:    }
        !           142:  ;
        !           143: 
        !           144: flow4_item:
        !           145:    flow_srcdst net_ip {
        !           146:      flow_builder_set_type(this_flow, $1);
        !           147:      flow_builder4_add_pfx(this_flow, (net_addr_ip4 *) &($2));
        !           148:    }
        !           149:  | flow_num_type flow_num_opts
        !           150:  | flow_flag_type flow_bmk_opts
        !           151:  | flow_frag_type flow_frag_opts
        !           152:  ;
        !           153: 
        !           154: flow6_item:
        !           155:    flow_srcdst net_ip6 {
        !           156:      flow_builder_set_type(this_flow, $1);
        !           157:      flow_builder6_add_pfx(this_flow, (net_addr_ip6 *) &($2), 0);
        !           158:    }
        !           159:  | flow_srcdst net_ip6 OFFSET NUM {
        !           160:      if ($4 > $2.pxlen)
        !           161:        cf_error("Prefix offset is higher than prefix length");
        !           162:      flow_builder_set_type(this_flow, $1);
        !           163:      flow_builder6_add_pfx(this_flow, (net_addr_ip6 *) &($2), $4);
        !           164:    }
        !           165:  | flow_num_type flow_num_opts
        !           166:  | flow_flag_type flow_bmk_opts
        !           167:  | flow_frag_type flow_frag_opts
        !           168:  | flow_label_type flow_bmk_opts
        !           169:  ;
        !           170: 
        !           171: flow4_opts:
        !           172:    /* empty */
        !           173:  | flow4_opts flow4_item ';'
        !           174:  ;
        !           175: 
        !           176: flow6_opts:
        !           177:  /* empty */
        !           178:  | flow6_opts flow6_item ';'
        !           179:  ;
        !           180: 
        !           181: flow_builder_init:
        !           182: {
        !           183:   if (this_flow == NULL)
        !           184:     this_flow = flow_builder_init(&root_pool);
        !           185:   else
        !           186:     flow_builder_clear(this_flow);
        !           187: };
        !           188: 
        !           189: flow_builder_set_ipv4: { this_flow->ipv6 = 0; };
        !           190: flow_builder_set_ipv6: { this_flow->ipv6 = 1; };
        !           191: 
        !           192: net_flow4_: FLOW4 '{' flow_builder_init flow_builder_set_ipv4 flow4_opts '}'
        !           193: {
        !           194:   $$ = (net_addr *) flow_builder4_finalize(this_flow, cfg_mem);
        !           195:   flow4_validate_cf((net_addr_flow4 *) $$);
        !           196: };
        !           197: 
        !           198: net_flow6_: FLOW6 '{' flow_builder_init flow_builder_set_ipv6 flow6_opts '}'
        !           199: {
        !           200:   $$ = (net_addr *) flow_builder6_finalize(this_flow, cfg_mem);
        !           201:   flow6_validate_cf((net_addr_flow6 *) $$);
        !           202: };
        !           203: 
        !           204: net_flow_: net_flow4_ | net_flow6_ ;
        !           205: 
        !           206: 
        !           207: CF_CODE
        !           208: 
        !           209: CF_END

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