]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Simpler format of VPN RD
authorJan Moskyto Matejka <mq@ucw.cz>
Tue, 28 Mar 2017 15:35:32 +0000 (17:35 +0200)
committerJan Moskyto Matejka <mq@ucw.cz>
Tue, 28 Mar 2017 15:35:32 +0000 (17:35 +0200)
conf/cf-lex.l
lib/net.c

index fb3d59e4a3ee4e9e42da90ed627edc6282cacc8d..db847d378631ff6ce097b54ce47cdd13a1c12844 100644 (file)
@@ -123,6 +123,37 @@ include   ^{WHITE}*include{WHITE}*\".*\"{WHITE}*;
   cf_include(start, end-start);
 }
 
+{DIGIT}+:{DIGIT}+ {
+  unsigned long int l, len1, len2;
+  char *e;
+
+  errno = 0;
+  l = strtoul(yytext, &e, 10);
+  if (e && (*e != ':') || (errno == ERANGE) || (l >> 32))
+    cf_error("ASN out of range");
+
+  if (l >> 16)
+  {
+    len1 = 32;
+    len2 = 16;
+    cf_lval.i64 = (2ULL << 48) | (((u64) l) << len2);
+  }
+  else
+  {
+    len1 = 16;
+    len2 = 32;
+    cf_lval.i64 = 0 | (((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;
+}
+
 [02]:{DIGIT}+:{DIGIT}+ {
   unsigned long int l, len1, len2;
   char *e;
@@ -155,17 +186,17 @@ include   ^{WHITE}*include{WHITE}*\".*\"{WHITE}*;
   return VPN_RD;
 }
 
-1:{DIGIT}+\.{DIGIT}+\.{DIGIT}+\.{DIGIT}+:{DIGIT}+ {
+{DIGIT}+\.{DIGIT}+\.{DIGIT}+\.{DIGIT}+:{DIGIT}+ {
   unsigned long int l;
   ip4_addr ip4;
   char *e;
 
   cf_lval.i64 = 1ULL << 48;
 
-  e = strchr(yytext+2, ':');
+  e = strchr(yytext, ':');
   *e++ = '\0';
-  if (!ip4_pton(yytext+2, &ip4))
-    cf_error("Invalid IPv4 address %s in Route Distinguisher", yytext+2);
+  if (!ip4_pton(yytext, &ip4))
+    cf_error("Invalid IPv4 address %s in Route Distinguisher", yytext);
   cf_lval.i64 |= ((u64) ip4_to_u32(ip4)) << 16;
 
   errno = 0;
index c29ed299bb03925a682001a909cc64911204e63f..e6053812e263651b0eaeacecab5f5566c235d3ef 100644 (file)
--- a/lib/net.c
+++ b/lib/net.c
@@ -59,9 +59,12 @@ rd_format(const u64 rd, char *buf, int buflen)
 {
   switch (rd >> 48)
   {
-    case 0: return bsnprintf(buf, buflen, "0:%u:%u", (u32) (rd >> 32), (u32) rd);
-    case 1: return bsnprintf(buf, buflen, "1:%I4:%u", ip4_from_u32(rd >> 16), (u32) (rd & 0xffff));
-    case 2: return bsnprintf(buf, buflen, "2:%u:%u", (u32) (rd >> 16), (u32) (rd & 0xffff));
+    case 0: return bsnprintf(buf, buflen, "%u:%u", (u32) (rd >> 32), (u32) rd);
+    case 1: return bsnprintf(buf, buflen, "%I4:%u", ip4_from_u32(rd >> 16), (u32) (rd & 0xffff));
+    case 2: if (((u32) (rd >> 16)) >> 16)
+             return bsnprintf(buf, buflen, "%u:%u", (u32) (rd >> 16), (u32) (rd & 0xffff));
+           else
+             return bsnprintf(buf, buflen, "2:%u:%u", (u32) (rd >> 16), (u32) (rd & 0xffff));
     default: return bsnprintf(buf, buflen, "X:%08x:%08x", (u32) (rd >> 32), (u32) rd);
   }
 }