Commit 21d358f0 authored by Jan Moskyto Matejka's avatar Jan Moskyto Matejka
Browse files

MPLS tables, static protocol MPLS support

parent 59ab6f0f
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ 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_vpn4_ net_vpn6_ net_vpn_ net_roa4_ net_roa6_ net_roa_
%type <net_ptr> net_ net_any net_vpn4_ net_vpn6_ net_vpn_ net_roa4_ net_roa6_ net_roa_ net_mpls_
%type <mpls> mpls_stack_start mpls_stack

%type <t> text opttext
@@ -235,6 +235,14 @@ net_roa6_: net_ip6_ MAX NUM AS NUM
    cf_error("Maximum prefix length %d must be >= prefix length %d", ((net_addr_roa6 *) $$)->max_pxlen, ($$)->pxlen);
};

net_mpls_: NUM
{
  $$ = cfg_alloc(sizeof(net_addr_mpls));
  net_fill_mpls($$, $1);
  if ($1 < 0 || $1 > (1<<20))
    cf_error("Invalid MPLS label %d", $1);
}

net_ip_: net_ip4_ | net_ip6_ ;
net_roa_: net_roa4_ | net_roa6_ ;
net_vpn_: net_vpn4_ | net_vpn6_ ;
@@ -268,6 +276,7 @@ net_ip:

net_any:
   net_
 | net_mpls_
 | SYM {
     if ($1->class != (SYM_CONSTANT | T_NET))
       cf_error("Network expected");
+2 −1
Original line number Diff line number Diff line
@@ -193,7 +193,8 @@ net_classify(const net_addr *N)
  case NET_ROA6:
    return ip6_zero(n->ip6.prefix) ? (IADDR_HOST | SCOPE_UNIVERSE) : ip6_classify(&n->ip6.prefix);

  /* classify probably not needed for NET_MPLS */
  case NET_MPLS:
    return IADDR_HOST | SCOPE_SITE;
  }

  return IADDR_INVALID;
+2 −1
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ CF_DECLS

CF_KEYWORDS(ROUTER, ID, PROTOCOL, TEMPLATE, PREFERENCE, DISABLED, DEBUG, ALL, OFF, DIRECT)
CF_KEYWORDS(INTERFACE, IMPORT, EXPORT, FILTER, NONE, TABLE, STATES, ROUTES, FILTERS)
CF_KEYWORDS(IPV4, IPV6, VPN4, VPN6, ROA4, ROA6)
CF_KEYWORDS(IPV4, IPV6, VPN4, VPN6, ROA4, ROA6, MPLS)
CF_KEYWORDS(RECEIVE, LIMIT, ACTION, WARN, BLOCK, RESTART, DISABLE, KEEP, FILTERED)
CF_KEYWORDS(PASSWORD, FROM, PASSIVE, TO, ID, EVENTS, PACKETS, PROTOCOLS, INTERFACES)
CF_KEYWORDS(PRIMARY, STATS, COUNT, FOR, COMMANDS, PREEXPORT, NOEXPORT, GENERATE) /* ,ROA */
@@ -148,6 +148,7 @@ net_type:
 | VPN6 { $$ = NET_VPN6; }
 | ROA4 { $$ = NET_ROA4; }
 | ROA6 { $$ = NET_ROA6; }
 | MPLS { $$ = NET_MPLS; }
 ;


+3 −0
Original line number Diff line number Diff line
@@ -193,6 +193,7 @@ fib_hash(struct fib *f, const net_addr *a)
  case NET_VPN6: return FIB_HASH(f, a, vpn6);
  case NET_ROA4: return FIB_HASH(f, a, roa4);
  case NET_ROA6: return FIB_HASH(f, a, roa6);
  case NET_MPLS: return FIB_HASH(f, a, mpls);
  default: bug("invalid type");
  }
}
@@ -227,6 +228,7 @@ fib_find(struct fib *f, const net_addr *a)
  case NET_VPN6: return FIB_FIND(f, a, vpn6);
  case NET_ROA4: return FIB_FIND(f, a, roa4);
  case NET_ROA6: return FIB_FIND(f, a, roa6);
  case NET_MPLS: return FIB_FIND(f, a, mpls);
  default: bug("invalid type");
  }
}
@@ -244,6 +246,7 @@ fib_insert(struct fib *f, const net_addr *a, struct fib_node *e)
  case NET_VPN6: FIB_INSERT(f, a, e, vpn6); return;
  case NET_ROA4: FIB_INSERT(f, a, e, roa4); return;
  case NET_ROA6: FIB_INSERT(f, a, e, roa6); return;
  case NET_MPLS: FIB_INSERT(f, a, e, mpls); return;
  default: bug("invalid type");
  }
}