⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parse.c

📁 同时支持IPv4和IPv6的BGP协议实现
💻 C
📖 第 1 页 / 共 3 页
字号:
    /*     *   "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 + -