📄 parse.c
字号:
/* * "IamRR" (Route Reflector) */ if (strncasecmp(&buf[i], sysatom[C_RR], strlen(sysatom[C_RR])) == 0) { if (bit_test(parsedflag, C_RR)) { syslog(LOG_ERR, "<conf_check>: %s:%d %s doubly defined", filename, line, sysatom[C_RR]); fatalx("<conf_check>: doubly defined"); } bit_set(parsedflag ,C_RR); i += strlen(sysatom[C_RR]); IamRR = 1; /* (global) */ SENTENCE_END(i); continue; } /* * "clusterId" (when I am Route Reflecter) */ if (strncasecmp(&buf[i], sysatom[C_CLUSTERID], strlen(sysatom[C_CLUSTERID])) == 0) { if (bit_test(parsedflag, C_CLUSTERID)) { syslog(LOG_ERR, "<conf_check>: %s:%d %s doubly defined", filename, line, sysatom[C_CLUSTERID]); fatalx("<conf_check>: doubly defined"); } bit_set(parsedflag ,C_CLUSTERID); i += strlen(sysatom[C_CLUSTERID]); SKIP_WHITE(i); READ_ATOM(i, j); clusterId = atoi(atom); /* (global) */ SENTENCE_END(i); continue; } /* * "holdtime" (in sec.) */ if (strncasecmp(&buf[i], sysatom[C_HOLDTIME], strlen(sysatom[C_HOLDTIME])) == 0) { if (bit_test(parsedflag ,C_HOLDTIME)) { syslog(LOG_ERR, "<conf_check>: %s:%d %s doubly defined", filename, line, sysatom[C_HOLDTIME]); fatalx("<conf_check>: doubly defined"); } bit_set(parsedflag ,C_HOLDTIME); i += strlen(sysatom[C_HOLDTIME]); SKIP_WHITE(i); READ_ATOM(i, j); bgpHoldtime = atoi(atom); /* (global) */ if (!HOLDTIME_ISCORRECT(bgpHoldtime)) { syslog(LOG_ERR, "<conf_check>: %s:%d Invalid holdtime %d", filename, line, bgpHoldtime); fatalx("<conf_check>: Invalid holdtime"); } SENTENCE_END(i); continue; } /* * "rip yes {...}" */ if (strncasecmp(&buf[i], sysatom[C_RIP], strlen(sysatom[C_RIP])) == 0) { if (bit_test(parsedflag, C_RIP)) { syslog(LOG_ERR, "%s:%d %s doubly defined", filename, line, sysatom[C_RIP]); fatalx("<conf_check>: doubly defined"); } bit_set(parsedflag, C_RIP); i += strlen(sysatom[C_RIP]); SKIP_WHITE(i); if (strncasecmp(&buf[i], sysatom[C_YES], strlen(sysatom[C_YES])) == 0) { ripyes = 1; i += strlen(sysatom[C_YES]); } else { if (strncasecmp(&buf[i], sysatom[C_NO], strlen(sysatom[C_NO])) == 0) { i += strlen(sysatom[C_NO]); } else { syslog(LOG_ERR, "%s:%d syntax error", filename, line); fatalx("<conf_check>: syntax error"); } } SKIP_WHITE(i); if (buf[i++] != '{') { syslog(LOG_ERR, "%s:%d syntax error, missing \'{\'", filename, line); fatalx("<conf_check>: syntax error"); } if (ripyes) rip_init(); /** rip_init() **/ while(1) { SKIP_WHITE(i); /* "interface .." (options) */ if (strncasecmp(&buf[i], sysatom[C_INTERFACE], strlen(sysatom[C_INTERFACE])) == 0) { struct ifinfo *ifp; struct ripif *ripif; i += strlen(sysatom[C_INTERFACE]); SKIP_WHITE(i); READ_ATOM(i, j); if ((ifp = find_if_by_name(atom)) && /* find "ifinfo" */ (ripif = find_rip_by_index(ifp->ifi_ifn->if_index))) { while(1) { SKIP_WHITE(i); if (strncasecmp(&buf[i], sysatom[C_NORIPIN], strlen(sysatom[C_NORIPIN])) == 0) { ripif->rip_mode |= IFS_NORIPIN; i += strlen(sysatom[C_NORIPIN]); continue; } if (strncasecmp(&buf[i], sysatom[C_NORIPOUT], strlen(sysatom[C_NORIPOUT])) == 0) { ripif->rip_mode |= IFS_NORIPOUT; i += strlen(sysatom[C_NORIPOUT]); continue; } if (strncasecmp(&buf[i], sysatom[C_DEFAULT], strlen(sysatom[C_DEFAULT])) == 0) { i += strlen(sysatom[C_DEFAULT]); SKIP_WHITE(i); if (strncasecmp(&buf[i], sysatom[C_ORIGINATE], strlen(sysatom[C_ORIGINATE])) == 0) { ripif->rip_mode |= IFS_DEFAULTORIGINATE; ripif->rip_filterset.deffilterflags |= DEFAULT_FILTERIN; i += strlen(sysatom[C_ORIGINATE]); } else { syslog(LOG_ERR, "%s:%d syntax error, missing any valid words after \'%s\'", filename, line, sysatom[C_DEFAULT]); fatalx("<conf_check>: syntax error"); } continue; } if (strncasecmp(&buf[i], sysatom[C_METRICIN], strlen(sysatom[C_METRICIN])) == 0) { int metric; i += strlen(sysatom[C_METRICIN]); SKIP_WHITE(i); READ_ATOM(i, j); metric = atoi(atom); if (metric == 0 || metric > RIPNG_METRIC_UNREACHABLE) { syslog(LOG_ERR, "%s: %d syntax error, invalid RIPng " "metric(%s)", filename, line, atom); fatalx("<conf_check>: syntax error"); } ripif->rip_metricin = metric; continue; } if (strncasecmp(&buf[i], sysatom[C_FILTERIN], strlen(sysatom[C_FILTERIN])) == 0) { /* "filterin prfx/plen": incoming route filter */ i += strlen(sysatom[C_FILTERIN]); SKIP_WHITE(i); READ_ATOM(i, j); if (set_filter(&ripif->rip_filterin, atom, filename, line)) { /* * non zero return value means exact match * to default route */ ripif->rip_filterset.deffilterflags |= DEFAULT_FILTERIN; } continue; } if (strncasecmp(&buf[i], sysatom[C_RESTRICTIN], strlen(sysatom[C_RESTRICTIN])) == 0) { /* "restrictin prfx/plen": incoming route restriction */ i += strlen(sysatom[C_RESTRICTIN]); SKIP_WHITE(i); READ_ATOM(i, j); if (set_filter(&ripif->rip_restrictin, atom, filename, line)) ripif->rip_filterset.deffilterflags |= DEFAULT_RESTRICTIN; continue; } if (strncasecmp(&buf[i], sysatom[C_FILTEROUT], strlen(sysatom[C_FILTEROUT])) == 0) { /* "filter prfx/plen": outgoing route filter */ i += strlen(sysatom[C_FILTEROUT]); SKIP_WHITE(i); READ_ATOM(i, j); if (set_filter(&ripif->rip_filterout, atom, filename, line)) ripif->rip_filterset.deffilterflags |= DEFAULT_FILTEROUT; continue; } if (strncasecmp(&buf[i], sysatom[C_RESTRICTOUT], strlen(sysatom[C_RESTRICTOUT])) == 0) { /* "filter prfx/plen": outgoing route restriction */ i += strlen(sysatom[C_RESTRICTOUT]); SKIP_WHITE(i); READ_ATOM(i, j); if (set_filter(&ripif->rip_restrictout, atom, filename, line)) ripif->rip_filterset.deffilterflags |= DEFAULT_RESTRICTOUT; continue; } break; /* while */ /* No match. */ } /* while */ } else { syslog(LOG_ERR, "%s:%d interface %s misconfigure", filename, line, atom); fatalx("interface misconfigure"); } SENTENCE_END(i); } else /* "sitelocal [yes|no]" */ if (strncasecmp(&buf[i], sysatom[C_SITELOCAL], strlen(sysatom[C_SITELOCAL])) == 0) { if (bit_test(parsedflag, C_SITELOCAL)) { syslog(LOG_ERR, "%s:%d %s doubly defined", filename, line, sysatom[C_SITELOCAL]); fatalx("<conf_check>: doubly defined"); } bit_set(parsedflag, C_SITELOCAL); i += strlen(sysatom[C_SITELOCAL]); SKIP_WHITE(i); if (strncasecmp(&buf[i], sysatom[C_YES], strlen(sysatom[C_YES])) == 0) { rip_use_sitelocal = 1; i += strlen(sysatom[C_YES]); } else if (strncasecmp(&buf[i], sysatom[C_NO], strlen(sysatom[C_NO])) == 0) { rip_use_sitelocal = 0; i += strlen(sysatom[C_NO]); } else { syslog(LOG_ERR, "%s:%d syntax error", filename, line); fatalx("<conf_check>: syntax error"); } SENTENCE_END(i); } else break; } /* end-of-while */ if (buf[i++] != '}') { syslog(LOG_ERR, "%s:%d syntax error, missing \'}\'", filename, line); fatalx("syntax error"); } SKIP_WHITE(i); SENTENCE_END(i); continue; } /* * export proto bgp as ... { * proto ... ; * proto ... ; * }; */ if (strncasecmp(&buf[i], sysatom[C_EXPORT], strlen(sysatom[C_EXPORT])) == 0) { struct rpcb *asp = NULL; /* export to */ u_int16_t easnum; /* export to */ i += strlen(sysatom[C_EXPORT]); SKIP_WHITE(i); if (strncasecmp(&buf[i], sysatom[C_PROTO], strlen(sysatom[C_PROTO])) != 0) { syslog(LOG_ERR, "%s:%d syntax error, missing \'%s\'", filename, line, sysatom[C_PROTO]); fatalx("<conf_check>: parse error"); } i += strlen(sysatom[C_PROTO]); SKIP_WHITE(i); if (strncasecmp(&buf[i], sysatom[C_BGP], strlen(sysatom[C_BGP])) == 0) { i += strlen(sysatom[C_BGP]); SKIP_WHITE(i); if (strncasecmp(&buf[i], sysatom[C_AS], strlen(sysatom[C_AS])) != 0) { syslog(LOG_ERR, "%s:%d syntax error, missing \'%s\'", filename, line, sysatom[C_AS]); fatalx("<conf_check>: syntax error"); } i += strlen(sysatom[C_AS]); SKIP_WHITE(i); READ_ATOM(i, j); /* * "as" (to be exported to) */ if ((easnum = atoi(atom)) == 0) { syslog(LOG_ERR, "%s:%d invalid AS number", filename, line); fatalx("<conf_check>: invalid AS number"); } /* experimentally allow bgpd to export to IBGP peers(20000210) */ if (easnum == my_as_number) { /* IBGP peer */ /* XXX currently the address for the peer is always required. */ struct sockaddr_in6 sa6_peer; memset(&sa6_peer, 0, sizeof(sa6_peer)); SKIP_WHITE(i); READ_ATOM(i, j); /* TODO: support scoped addresses */ if (get_in6_addr(atom, &sa6_peer) || (asp = find_apeer_by_addr(&sa6_peer.sin6_addr)) == NULL) { syslog(LOG_ERR, "%s:%d invalid peer address", filename, line); fatalx("<conf_check>: invalid peer address"); } } else if ((asp = find_peer_by_as(easnum)) == NULL) { /* already ? */ syslog(LOG_ERR, "%s:%d AS %d not defined", filename, line, easnum); fatalx("<conf_check>: AS not defined"); } SKIP_WHITE(i); if (buf[i++] != '{') { syslog(LOG_ERR, "%s:%d syntax error, missing \'{\'", filename, line); fatalx("<conf_check>: syntax error"); } while(1) { struct rtproto *rtp; MALLOC(rtp, struct rtproto); SKIP_WHITE(i); /* * "proto" ..? */ if (strncasecmp(&buf[i], sysatom[C_PROTO], strlen(sysatom[C_PROTO])) == 0) { i += strlen(sysatom[C_PROTO]); SKIP_WHITE(i); } else { free(rtp); rtp = NULL; } /* * "direct" */ if (strncasecmp(&buf[i], sysatom[C_DIRECT], strlen(sysatom[C_DIRECT])) == 0) { struct ifinfo *ifp; i += strlen(sysatom[C_DIRECT]); SKIP_WHITE(i); /* "interface .." */ if (strncasecmp(&buf[i], sysatom[C_INTERFACE], strlen(sysatom[C_INTERFACE])) != 0) { syslog(LOG_ERR, "%s:%d syntax error, missing \'%s\'", filename, line, sysatom[C_INTERFACE]); fatalx("<conf_check>: syntax error"); } i += strlen(sysatom[C_INTERFACE]); SKIP_WHITE(i); READ_ATOM(i, j); if ((ifp = find_if_by_name(atom)) == NULL) {/* find "ifinfo" */ syslog(LOG_ERR, "%s:%d interface \'%s\' not found", filename, line, atom); fatalx("<conf_check>: interface not found"); } SKIP_WHITE(i); if (buf[i++] != '{') { syslog(LOG_ERR, "%s:%d syntax error, missing \'{\'", filename, line); fatalx("<conf_check>: syntax error"); } SKIP_WHITE(i); /* * "ALL" */ if (strncasecmp(&buf[i], sysatom[C_ALL], strlen(sysatom[C_ALL])) != 0) { syslog(LOG_ERR, "%s:%d syntax error, missing \'%s\'", filename, line, sysatom[C_ALL]); fatalx("<conf_check>: syntax error"); } i += strlen(sysatom[C_ALL]); rtp->rtp_type = RTPROTO_IF; rtp->rtp_if = ifp; if (asp->rp_adj_ribs_out != NULL) { /* struct rtproto */ if (find_rtp(rtp, asp->rp_adj_ribs_out)) { syslog(LOG_ERR, "%s:%d origination I/F doubly defined", filename,line); fatalx("<conf_check>: origination I/F doubly defined"); } insque(rtp, asp->rp_adj_ribs_out); } else { rtp->rtp_next = rtp; rtp->rtp_prev = rtp; asp->rp_adj_ribs_out = rtp; } SENTENCE_END(i); SKIP_WHITE(i); if (buf[i++] != '}') { syslog(LOG_ERR, "%s:%d syntax error, missing \'}\'", filename, line); fatalx("<conf_check>: syntax error"); } SENTENCE_END(i); continue; /*** direct End ***/ } /* * "bgp" */ if (strncasecmp(&buf[i], sysatom[C_BGP], strlen(sysatom[C_BGP])) == 0) { struct rpcb *ibnp; /* origin */ int iasnum; i += strlen(sysatom[C_BGP]); SKIP_WHITE(i); /* "as [..]" */ if (strncasecmp(&buf[i], sysatom[C_AS], strlen(sysatom[C_AS])) != 0) { syslog(LOG_ERR, "%s:%d syntax error, missing \'%s\'", filename, line, sysatom[C_AS]); fatalx("<conf_check>: syntax error"); } i += strlen(sysatom[C_AS]); SKIP_WHITE(i); READ_ATOM(i, j); if ((iasnum = atoi(atom)) == 0 || iasnum == my_as_number) { syslog(LOG_ERR, "%s:%d: invalid AS number", filename, line); fatalx("<conf_check>: invalid AS number"); } if ((ibnp = find_peer_by_as(iasnum)) == NULL) { /* already ? */ syslog(LOG_ERR, "%s:%d AS %d not defined", filename, line, iasnum); fatalx("<conf_check>: AS not defined"); } SKIP_WHITE(i); if (buf[i++] != '{') { syslog(LOG_ERR, "%s:%d syntax error, missing \'{\'", filename, line); fatalx("<conf_check>: syntax error"); } SKIP_WHITE(i); /* * "ALL" */ if (strncasecmp(&buf[i], sysatom[C_ALL], strlen(sysatom[C_ALL])) != 0) { syslog(LOG_ERR, "%s:%d syntax error, missing \'%s\'", filename, line, sysatom[C_ALL]); fatalx("<conf_check>: syntax error"); } i += strlen(sysatom[C_ALL]); rtp->rtp_type = RTPROTO_BGP; rtp->rtp_bgp = ibnp; if (asp->rp_adj_ribs_out != NULL) { /* struct rtproto */ if (find_rtp(rtp, asp->rp_adj_ribs_out)) { syslog(LOG_ERR, "%s:%d originating BGP peer doubly defined", filename, line); fatalx("<conf_check>: originating BGP peer doubly defined"); } insque(rtp, asp->rp_adj_ribs_out); } else { rtp->rtp_next = rtp->rtp_prev = rtp; asp->rp_adj_ribs_out = rtp; } SENTENCE_END(i); SKIP_WHITE(i); if (buf[i++] != '}') { syslog(LOG_ERR, "%s:%d syntax error, missing \'}\'", filename, line); fatalx("<conf_check>: syntax error"); } SENTENCE_END(i); continue; /*** bgp End ***/ } /* * "rip" */ if (strncasecmp(&buf[i], sysatom[C_RIP], strlen(sysatom[C_RIP])) == 0) { struct ripif *ripif; extern struct ripif *ripifs; i += strlen(sysatom[C_RIP]); SKIP_WHITE(i); if (buf[i++] != '{') { syslog(LOG_ERR, "%s:%d syntax error, missing \'{\'", filename, line); fatalx("<conf_check>: syntax error"); } SKIP_WHITE(i); /* * "ALL" */ if (strncasecmp(&buf[i], sysatom[C_ALL], strlen(sysatom[C_ALL])) != 0) { syslog(LOG_ERR, "%s:%d syntax error, missing \'%s\'", filename, line, sysatom[C_ALL]); fatalx("<conf_check>: syntax error"); } i += strlen(sysatom[C_ALL]); if (!ripyes || !ripifs) { syslog(LOG_ERR, "%s:%d RIPng not configured", filename, line); fatalx("<conf_check>: RIPng not configured"); } ripif = ripifs; /* "ripifs" is global-RIP-list */ while(ripif) { rtp->rtp_type = RTPROTO_RIP; rtp->rtp_rip = ripif; if (asp->rp_adj_ribs_out != NULL) { /* struct rtproto */ if (find_rtp(rtp, asp->rp_adj_ribs_out)) { syslog(LOG_ERR, "%s:%d original rtproto doubly defined", filename, line); fatalx("<conf_check>: original rtproto doubly defined"); } insque(rtp, asp->rp_adj_ribs_out);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -