Stephen, Patch to support the new fib rules features I just posted on netdev.
Index: iproute2.git/include/linux/fib_rules.h =================================================================== --- iproute2.git.orig/include/linux/fib_rules.h 2007-03-25 22:26:33.000000000 +0200 +++ iproute2.git/include/linux/fib_rules.h 2007-03-27 02:00:48.000000000 +0200 @@ -7,6 +7,8 @@ /* rule is permanent, and cannot be deleted */ #define FIB_RULE_PERMANENT 1 #define FIB_RULE_INVERT 2 +#define FIB_RULE_UNRESOLVED 4 +#define FIB_RULE_DEV_DETACHED 8 struct fib_rule_hdr { @@ -29,7 +31,7 @@ enum FRA_DST, /* destination address */ FRA_SRC, /* source address */ FRA_IFNAME, /* interface name */ - FRA_UNUSED1, + FRA_GOTO, /* target to jump to (FR_ACT_GOTO) */ FRA_UNUSED2, FRA_PRIORITY, /* priority/preference */ FRA_UNUSED3, @@ -51,8 +53,8 @@ enum { FR_ACT_UNSPEC, FR_ACT_TO_TBL, /* Pass to fixed table */ - FR_ACT_RES1, - FR_ACT_RES2, + FR_ACT_GOTO, /* Jump to another rule */ + FR_ACT_NOP, /* No operation */ FR_ACT_RES3, FR_ACT_RES4, FR_ACT_BLACKHOLE, /* Drop without notification */ Index: iproute2.git/ip/iprule.c =================================================================== --- iproute2.git.orig/ip/iprule.c 2007-03-25 22:25:28.000000000 +0200 +++ iproute2.git/ip/iprule.c 2007-03-27 02:00:48.000000000 +0200 @@ -42,6 +42,7 @@ static void usage(void) fprintf(stderr, "ACTION := [ table TABLE_ID ]\n"); fprintf(stderr, " [ prohibit | reject | unreachable ]\n"); fprintf(stderr, " [ realms [SRCREALM/]DSTREALM ]\n"); + fprintf(stderr, " [ goto NUMBER ]\n"); fprintf(stderr, "TABLE_ID := [ local | main | default | NUMBER ]\n"); exit(-1); } @@ -144,6 +145,8 @@ int print_rule(const struct sockaddr_nl if (tb[RTA_IIF]) { fprintf(fp, "iif %s ", (char*)RTA_DATA(tb[RTA_IIF])); + if (r->rtm_flags & FIB_RULE_DEV_DETACHED) + fprintf(fp, "[detached] "); } table = rtm_get_table(r, tb); @@ -171,7 +174,17 @@ int print_rule(const struct sockaddr_nl abuf, sizeof(abuf))); } else fprintf(fp, "masquerade"); - } else if (r->rtm_type != RTN_UNICAST) + } else if (r->rtm_type == FR_ACT_GOTO) { + fprintf(fp, "goto "); + if (tb[FRA_GOTO]) + fprintf(fp, "%u", *(__u32 *) RTA_DATA(tb[FRA_GOTO])); + else + fprintf(fp, "none"); + if (r->rtm_flags & FIB_RULE_UNRESOLVED) + fprintf(fp, " [unresolved]"); + } else if (r->rtm_type == FR_ACT_NOP) + fprintf(fp, "nop"); + else if (r->rtm_type != RTN_UNICAST) fprintf(fp, "%s", rtnl_rtntype_n2a(r->rtm_type, b1, sizeof(b1))); fprintf(fp, "\n"); @@ -311,9 +324,19 @@ static int iprule_modify(int cmd, int ar } if (matches(*argv, "help") == 0) usage(); - if (rtnl_rtntype_a2n(&type, *argv)) + else if (matches(*argv, "goto") == 0) { + __u32 target; + type = FR_ACT_GOTO; + NEXT_ARG(); + if (get_u32(&target, *argv, 0)) + invarg("invalid target\n", *argv); + addattr32(&req.n, sizeof(req), FRA_GOTO, target); + } else if (matches(*argv, "nop") == 0) + type = FR_ACT_NOP; + else if (rtnl_rtntype_a2n(&type, *argv)) invarg("Failed to parse rule type", *argv); req.r.rtm_type = type; + table_ok = 1; } argc--; argv++; - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html