]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
MPLS tables, static protocol MPLS support
authorJan Moskyto Matejka <mq@ucw.cz>
Thu, 3 Mar 2016 13:34:39 +0000 (14:34 +0100)
committerJan Moskyto Matejka <mq@ucw.cz>
Thu, 7 Apr 2016 08:08:43 +0000 (10:08 +0200)
conf/confbase.Y
lib/net.c
nest/config.Y
nest/rt-fib.c

index 05d3d5f8e12e953b04f8e709e421ac64f52c133d..3de00a93fc45e0e9e9abd9e5bd8dde761bb4bae3 100644 (file)
@@ -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");
index f21de0efd9b0e09d5a5364dc6e986c16cc9628e2..06490d18173ce2ca55c3fab8e24782e5c696ca6c 100644 (file)
--- a/lib/net.c
+++ b/lib/net.c
@@ -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;
index 48a830757c4b0c6c16db12d75a77a26c91d04e55..d413e4a432e82c07e3116e10d6b2e89eadb4885e 100644 (file)
@@ -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; }
  ;
 
 
index 8021ea24cd314176131697f3e3d6f7f424a70339..558b3ace127f2c469a8216de0b3f81d50d2d829e 100644 (file)
@@ -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");
   }
 }