summaryrefslogtreecommitdiff
path: root/proto/ospf/config.Y
blob: fe5b33df84847639e7f07b7068bdaafce3705b9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
 *	BIRD -- OSPF Configuration
 *
 *	(c) 1999-2000 Ondrej Filip <feela@network.cz>
 *
 *	Can be freely distributed and used under the terms of the GNU GPL.
 */

CF_HDR

#include "proto/ospf/ospf.h"

CF_DEFINES

#define OSPF_CFG ((struct ospf_config *) this_proto)
static struct ospf_area_config *this_area;
static struct iface_patt *this_ipatt;
#define OSPF_PATT ((struct ospf_iface_patt *) this_ipatt)

CF_DECLS

CF_KEYWORDS(OSPF, AREA, OSPF_METRIC1, OSPF_METRIC2, OSPF_TAG)
CF_KEYWORDS(NEIGHBORS, RFC1583COMPAT, STUB, TICK, COST, RETRANSMIT)
CF_KEYWORDS(HELLO)

%type <t> opttext

CF_GRAMMAR

CF_ADDTO(proto, ospf_proto '}')

ospf_proto_start: proto_start OSPF {
     this_proto = proto_config_new(&proto_ospf, sizeof(struct ospf_config));
     this_proto->preference = DEF_PREF_OSPF;
     init_list(&OSPF_CFG->area_list);
  }
 ;

ospf_proto:
   ospf_proto_start proto_name '{'
 | ospf_proto proto_item ';'
 | ospf_proto RFC1583COMPAT bool ';' { OSPF_CFG->rfc1583 = $3; }
 | ospf_proto ospf_area
;

ospf_area_start: AREA idval '{' {
  this_area = cfg_allocz(sizeof(struct ospf_area_config));
  add_tail(&OSPF_CFG->area_list, NODE this_area);
  this_area->areaid = $2;
  this_area->tick = DISPTICK;
  this_area->stub = 0;
  init_list(&this_area->patt_list);
 }
;

ospf_area: ospf_area_start
 | ospf_area_start ospf_area_list
;

ospf_area_list: /*EMPTY*/ | ospf_area_opts '}'
;

ospf_area_opts:
 | ospf_area_opts ospf_area_item

ospf_area_item:
 | STUB bool ';' { this_area->stub = $2 ; }
 | TICK NUM ';' { this_area->tick = $2 ; }
 | ospf_iface_list
;

ospf_iface_item:
 | COST NUM { OSPF_PATT->cost = $2 ; }
 | HELLO NUM { OSPF_PATT->helloint = $2 ; }
 | RETRANSMIT NUM { OSPF_PATT->rxmtint = $2 ; }
;
 
ospf_iface_opts:
   '{'
 | ospf_iface_opts ospf_iface_item ';'
 ;

ospf_iface_opt_list: /* EMPTY */ | ospf_iface_opts '}'
;

ospf_iface_start:
 {
  this_ipatt = cfg_allocz(sizeof(struct ospf_iface_patt));
  add_tail(&this_area->patt_list, NODE this_ipatt);
  OSPF_PATT->cost=10;
  OSPF_PATT->helloint=10;
  OSPF_PATT->rxmtint=5;
 }
;

ospf_iface:
  ospf_iface_start iface_patt ospf_iface_opt_list
;

ospf_iface_list:
   INTERFACE ospf_iface
 | ospf_iface_list ',' ospf_iface
 ;

opttext:
    TEXT
| /* empty */ { $$ = NULL; }
;

CF_ADDTO(dynamic_attr, OSPF_METRIC1 { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_METRIC1); })
CF_ADDTO(dynamic_attr, OSPF_METRIC2 { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_METRIC2); })
CF_ADDTO(dynamic_attr, OSPF_TAG { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_OSPF_TAG); })

CF_CLI(SHOW OSPF, optsym, [<name>], [[Show information about ospf protocol]])
{ ospf_sh(proto_get_named($3, &proto_ospf)); } ;

CF_CLI(SHOW OSPF NEIGHBORS, optsym opttext, [<name>] [\"<interface>\"], [[Show information about ospf neighbors]])
{ ospf_sh_neigh(proto_get_named($4, &proto_ospf), $5); } ;

CF_CLI(SHOW OSPF INTERFACE, optsym opttext, [<name>] [\"<interface>\"], [[Show infomation about interface]])
{ ospf_sh_iface(proto_get_named($4, &proto_ospf), $5); };

CF_CODE

CF_END