]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Implements proper setting of 'gw' route attribute.
authorOndrej Zajicek <santiago@crfreenet.org>
Tue, 13 Aug 2013 18:25:05 +0000 (20:25 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Tue, 13 Aug 2013 18:32:02 +0000 (20:32 +0200)
Thanks to Sergey Popovich for the bugreport.

doc/bird.sgml
filter/config.Y
filter/filter.c

index 6bf443e120b18202ea042f97e0472a27c2fbd15b..7db9fad263c47e6084238db9213196793d872b13 100644 (file)
@@ -1169,7 +1169,7 @@ undefined value is regarded as empty clist for most purposes.
        Preference of the route. Valid values are 0-65535. (See the chapter about routing tables.)
 
        <tag><m/ip/ from</tag>
-       The router which the route has originated from. Read-only.
+       The router which the route has originated from.
        
        <tag><m/ip/ gw</tag>
        Next hop packets routed using this route should be forwarded to.
index 7f73b89558267c39228b14182b7b653baed73df9..6623405078283f9a7cee031ab799790a49e23b46 100644 (file)
@@ -681,7 +681,6 @@ symbol:
 
 static_attr:
    FROM    { $$ = f_new_inst(); $$->aux = T_IP;         $$->a2.i = OFFSETOF(struct rta, from);   $$->a1.i = 1; }
-
  | GW      { $$ = f_new_inst(); $$->aux = T_IP;         $$->a2.i = OFFSETOF(struct rta, gw);     $$->a1.i = 1; }
  | NET     { $$ = f_new_inst(); $$->aux = T_PREFIX;     $$->a2.i = 0x12345678; /* This is actually ok - T_PREFIX is special-cased. */ }
  | PROTO   { $$ = f_new_inst(); $$->aux = T_STRING;     $$->a2.i = 0x12345678; /* T_STRING is also special-cased. */ }
index d784c253ac355cc3c261fe5de2c8499266769dcb..98bae331987a1b0c59ff105bd137fdb0bb2bd788 100644 (file)
@@ -853,10 +853,29 @@ interpret(struct f_inst *what)
     f_rta_cow();
     {
       struct rta *rta = (*f_rte)->attrs;
+      ip_addr ip;
+
       switch (what->aux) {
 
       case T_IP:
-       * (ip_addr *) ((char *) rta + what->a2.i) = v1.val.px.ip;
+       ip = v1.val.px.ip;
+
+       /* "gw" attribute? */
+       if (what->a2.i == OFFSETOF(struct rta, gw))
+       {
+         neighbor *n = neigh_find(rta->proto, &ip, 0);
+         if (!n || (n->scope == SCOPE_HOST))
+           runtime( "Invalid gw address" );
+
+         rta->dest = RTD_ROUTER;
+         rta->gw = ip;
+         rta->iface = n->iface;
+         rta->nexthops = NULL;
+         rta->hostentry = NULL;
+       }
+       else /* or "from" attribute? */
+         rta->from = ip;
+
        break;
 
       case T_ENUM_SCOPE:
@@ -867,10 +886,12 @@ interpret(struct f_inst *what)
        i = v1.val.i;
        if ((i != RTD_BLACKHOLE) && (i != RTD_UNREACHABLE) && (i != RTD_PROHIBIT))
          runtime( "Destination can be changed only to blackhole, unreachable or prohibit" );
+
        rta->dest = i;
        rta->gw = IPA_NONE;
        rta->iface = NULL;
        rta->nexthops = NULL;
+       rta->hostentry = NULL;
        break;
 
       default: