0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-10-18 09:58:43 +00:00

MPLS tables, static protocol MPLS support

This commit is contained in:
Jan Moskyto Matejka 2016-03-03 14:34:39 +01:00
parent 59ab6f0fcc
commit 21d358f074
4 changed files with 17 additions and 3 deletions

View 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");

View File

@ -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;

View 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; }
;

View 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");
}
}