Commit ead7b8f4 authored by Jan Moskyto Matejka's avatar Jan Moskyto Matejka
Browse files

Merge branch 'nexthop-merged' into int-new

parents da3cf9ea 61e501da
Loading
Loading
Loading
Loading
+54 −0
Original line number Diff line number Diff line
@@ -123,6 +123,60 @@ include ^{WHITE}*include{WHITE}*\".*\"{WHITE}*;
  cf_include(start, end-start);
}

[02]:{DIGIT}+:{DIGIT}+ {
  unsigned long int l, len1, len2;
  char *e;

  if (yytext[0] == '0')
  {
    cf_lval.i64 = 0;
    len1 = 16;
    len2 = 32;
  }
  else
  {
    cf_lval.i64 = 2ULL << 48;
    len1 = 32;
    len2 = 16;
  }

  errno = 0;
  l = strtoul(yytext+2, &e, 10);
  if (e && (*e != ':') || (errno == ERANGE) || (l >> len1))
    cf_error("ASN out of range");
  cf_lval.i64 |= ((u64) l) << len2;

  errno = 0;
  l = strtoul(e+1, &e, 10);
  if (e && *e || (errno == ERANGE) || (l >> len2))
    cf_error("Number out of range");
  cf_lval.i64 |= l;

  return VPN_RD;
}

1:{DIGIT}+\.{DIGIT}+\.{DIGIT}+\.{DIGIT}+:{DIGIT}+ {
  unsigned long int l;
  ip4_addr ip4;
  char *e;

  cf_lval.i64 = 1ULL << 48;

  e = strchr(yytext+2, ':');
  *e++ = '\0';
  if (!ip4_pton(yytext+2, &ip4))
    cf_error("Invalid IPv4 address %s in Route Distinguisher", yytext+2);
  cf_lval.i64 |= ((u64) ip4_to_u32(ip4)) << 16;

  errno = 0;
  l = strtoul(e, &e, 10);
  if (e && *e || (errno == ERANGE) || (l >> 16))
    cf_error("Number out of range");
  cf_lval.i64 |= l;

  return VPN_RD;
}

{DIGIT}+\.{DIGIT}+\.{DIGIT}+\.{DIGIT}+ {
  if (!ip4_pton(yytext, &cf_lval.ip4))
    cf_error("Invalid IPv4 address %s", yytext);
+38 −2
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ CF_DECLS
%union {
  int i;
  u32 i32;
  u64 i64;
  ip_addr a;
  ip4_addr ip4;
  ip6_addr ip6;
@@ -64,6 +65,7 @@ CF_DECLS
  struct proto_spec ps;
  struct channel_limit cl;
  struct timeformat *tf;
  mpls_label_stack *mls;
}

%token END CLI_MARKER INVALID_TOKEN ELSECOL DDOT
@@ -72,6 +74,7 @@ CF_DECLS
%token <i> NUM ENUM
%token <ip4> IP4
%token <ip6> IP6
%token <i64> VPN_RD
%token <s> SYM
%token <t> TEXT
%type <iface> ipa_scope
@@ -81,7 +84,8 @@ CF_DECLS
%type <time> datetime
%type <a> ipa
%type <net> net_ip4_ net_ip6_ net_ip6 net_ip_ net_ip net_or_ipa
%type <net_ptr> net_ net_any net_roa4_ net_roa6_ net_roa_
%type <net_ptr> net_ net_any net_vpn4_ net_vpn6_ net_vpn_ net_roa4_ net_roa6_ net_roa_
%type <mls> label_stack_start label_stack

%type <t> text opttext

@@ -93,7 +97,7 @@ CF_DECLS
%left '!'
%nonassoc '.'

CF_KEYWORDS(DEFINE, ON, OFF, YES, NO, S, MS, US, PORT)
CF_KEYWORDS(DEFINE, ON, OFF, YES, NO, S, MS, US, PORT, VPN)

CF_GRAMMAR

@@ -196,6 +200,18 @@ net_ip6_: IP6 '/' NUM
    cf_error("Invalid IPv6 prefix");
};

net_vpn4_: VPN_RD net_ip4_
{
  $$ = cfg_alloc(sizeof(net_addr_vpn4));
  net_fill_vpn4($$, net4_prefix(&$2), net4_pxlen(&$2), $1);
}

net_vpn6_: VPN_RD net_ip6_
{
  $$ = cfg_alloc(sizeof(net_addr_vpn6));
  net_fill_vpn6($$, net6_prefix(&$2), net6_pxlen(&$2), $1);
}

net_roa4_: net_ip4_ MAX NUM AS NUM
{
  $$ = cfg_alloc(sizeof(net_addr_roa4));
@@ -213,10 +229,12 @@ net_roa6_: net_ip6_ MAX NUM AS NUM
};

net_ip_: net_ip4_ | net_ip6_ ;
net_vpn_: net_vpn4_ | net_vpn6_ ;
net_roa_: net_roa4_ | net_roa6_ ;

net_:
   net_ip_ { $$ = cfg_alloc($1.length); net_copy($$, &($1)); }
 | net_vpn_
 | net_roa_
 | net_flow_
 ;
@@ -254,6 +272,8 @@ net_any:
net_or_ipa:
   net_ip4_
 | net_ip6_
 | net_vpn4_ { $$ = *$1; }
 | net_vpn6_ { $$ = *$1; }
 | IP4 { net_fill_ip4(&($$), $1, IP4_MAX_PREFIX_LENGTH); }
 | IP6 { net_fill_ip6(&($$), $1, IP6_MAX_PREFIX_LENGTH); }
 | SYM {
@@ -266,6 +286,22 @@ net_or_ipa:
   }
 ;

label_stack_start: NUM
{
  $$ = cfg_allocz(sizeof(mpls_label_stack));
  $$->len = 1;
  $$->stack[0] = $1;
};

label_stack:
    label_stack_start
  | label_stack '/' NUM {
    if ($1->len >= MPLS_MAX_LABEL_STACK)
      cf_error("Too many labels in stack");
    $1->stack[$1->len++] = $3;
    $$ = $1;
  }
;

datetime:
   TEXT {
+1 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ if test "$ac_test_CFLAGS" != set ; then
	bird_cflags_default=yes
fi

AC_PROG_CC
AC_PROG_CC_C99
if test -z "$GCC" ; then
	AC_MSG_ERROR([This program requires the GNU C Compiler.])
+2 −2
Original line number Diff line number Diff line
@@ -36,8 +36,8 @@ $(o)%.ps: $(o)%.dvi
	dvips -D600 -ta4 -o $@ $<

$(o)%.pdf: $(o)%.tex
	pdflatex -output-directory=$(dir $@) $<
	pdflatex -output-directory=$(dir $@) $<
	TEXINPUTS=$(TEXINPUTS):$(doc-srcdir)/tex pdflatex -output-directory=$(dir $@) $<
	TEXINPUTS=$(TEXINPUTS):$(doc-srcdir)/tex pdflatex -output-directory=$(dir $@) $<

$(o)%.txt: $(o)%.sgml
	cd $(dir $@) && $(sgml2)txt $(notdir $<)
+37 −16
Original line number Diff line number Diff line
@@ -1186,20 +1186,41 @@ foot).
	<tag><label id="type-ip">ip</tag>
	This type can hold a single IP address. Depending on the compile-time
	configuration of BIRD you are using, it is either an IPv4 or IPv6
	address. IP addresses are written in the standard notation
	address; this may be checked by <cf>.is_ip4</cf> which returns <cf/bool/.
        IP addresses are written in the standard notation
	(<cf/10.20.30.40/ or <cf/fec0:3:4::1/). You can apply special operator
	<cf>.mask(<M>num</M>)</cf> on values of type ip. It masks out all but
	first <cf><M>num</M></cf> bits from the IP address. So
	<cf/1.2.3.4.mask(8) = 1.0.0.0/ is true.

	<tag><label id="type-prefix">prefix</tag>
	This type can hold a network prefix consisting of IP address and prefix
	length. Prefix literals are written as <cf><m/ipaddress//<m/pxlen/</cf>,
	This type can hold a network prefix consisting of IP address, prefix
	length and several other values. This is the key in route tables.

	Prefixes may be of several types, which can be determined by the special
	operator <cf/.type/. The type may be:

	<cf/NET_IP4/ and <cf/NET_IP6/ prefixes hold an IP prefix. The literals
	are written as <cf><m/ipaddress//<m/pxlen/</cf>,
	or <cf><m>ipaddress</m>/<m>netmask</m></cf>. There are two special
	operators on prefixes: <cf/.ip/ which extracts the IP address from the
	pair, and <cf/.len/, which separates prefix length from the pair.
	operators on IP prefixes: <cf/.ip/ which extracts the IP address from
	the pair, and <cf/.len/, which separates prefix length from the pair.
	So <cf>1.2.0.0/16.len = 16</cf> is true.

	<cf/NET_VPN4/ and <cf/NET_VPN6/ prefixes hold an IP prefix with VPN
	Route Distinguisher (<rfc id="4364">). They support the same special
	operators as IP prefixes, and also <cf/.rd/ which extracts the Route
	Distinguisher. Their literals are written
	as <cf><m/vpnrd/ <m/ipprefix/</cf>

	<cf/NET_ROA4/ and <cf/NET_ROA6/ prefixes hold an IP prefix range
	together with an ASN. They support the same special operators as IP
	prefixes, and also <cf/.maxlen/ which extracts maximal prefix length,
	and <cf/.asn/ which extracts the ASN.

	<cf/NET_FLOW4/ and <cf/NET_FLOW6/ hold an IP prefix together with a
	flowspec rule. Filters currently don't support flowspec parsing.

	<tag><label id="type-ec">ec</tag>
	This is a specialized type used to represent BGP extended community
	values. It is essentially a 64bit value, literals of this type are
@@ -4160,12 +4181,12 @@ return packets as undeliverable if they are in your IP block, you don't have any
specific destination for them and you don't want to send them out through the
default route to prevent routing loops).

<p>There are five types of static routes: `classical' routes telling to forward
packets to a neighboring router, multipath routes specifying several (possibly
weighted) neighboring routers, device routes specifying forwarding to hosts on a
directly connected network, recursive routes computing their nexthops by doing
route table lookups for a given IP, and special routes (sink, blackhole etc.)
which specify a special action to be done instead of forwarding the packet.
<p>There are four types of static routes: `classical' routes telling to forward
packets to a neighboring router (single path or multipath, possibly weighted),
device routes specifying forwarding to hosts on a directly connected network,
recursive routes computing their nexthops by doing route table lookups for a
given IP, and special routes (sink, blackhole etc.)  which specify a special
action to be done instead of forwarding the packet.

<p>When the particular destination is not available (the interface is down or
the next hop of the route is not a neighbor at the moment), Static just
@@ -4194,14 +4215,14 @@ definition of the protocol contains mainly a list of static routes.
<p>Route definitions (each may also contain a block of per-route options):

<descrip>
	<tag><label id="static-route-via-ip">route <m/prefix/ via <m/ip/</tag>
	Static route through a neighboring router. For link-local next hops,
	<tag><label id="static-route-via-ip">route <m/prefix/ via <m/ip/ [mpls <m/num/[/<m/num/[/<m/num/[...]]]]</tag>
	Static single path route through a neighboring router. For link-local next hops,
	interface can be specified as a part of the address (e.g.,
	<cf/via fe80::1234%eth0/).
	<cf/via fe80::1234%eth0/). MPLS labels should be specified in outer-first order.

	<tag><label id="static-route-via-mpath">route <m/prefix/ multipath via <m/ip/ [weight <m/num/] [bfd <m/switch/] [via <m/.../]</tag>
	<tag><label id="static-route-via-mpath">route <m/prefix/ via <m/ip/ [mpls <m/num/[/<m/num/[/<m/num/[...]]]] [weight <m/num/] [bfd <m/switch/] [via ...]</tag>
	Static multipath route. Contains several nexthops (gateways), possibly
	with their weights.
	with their weights and MPLS labels.

	<tag><label id="static-route-via-iface">route <m/prefix/ via <m/"interface"/</tag>
	Static device route through an interface to hosts on a directly
Loading