[NET] fib_rules: Mark rules detached from the device
authorThomas Graf <tgraf@suug.ch>
Tue, 27 Mar 2007 00:37:59 +0000 (17:37 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Thu, 26 Apr 2007 05:28:13 +0000 (22:28 -0700)
Rules which match against device names in their selector can
remain while the device itself disappears, in fact the device
doesn't have to present when the rule is added in the first
place. The device name is resolved by trying when the rule is
added and later by listening to NETDEV_REGISTER/UNREGISTER
notifications.

This patch adds the flag FIB_RULE_DEV_DETACHED which is set
towards userspace when a rule contains a device match which
is unresolved at the moment. This eases spotting the reason
why certain rules seem not to function properly.

Signed-off-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/fib_rules.h
net/core/fib_rules.c

index ec9c7b1d3e9193eaaa3ef6dd7ade69bd2f55806a..c151273293e25186655a574af32de7d2faac18e4 100644 (file)
@@ -8,6 +8,7 @@
 #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
 {
index 0d8bb2efb0c1ba8fac29b54668e6105c95bce5e6..7ac602cc8c85a6f1d7a43fe4fbde1d6afea0fe25 100644 (file)
@@ -450,9 +450,13 @@ static int fib_nl_fill_rule(struct sk_buff *skb, struct fib_rule *rule,
        if (rule->action == FR_ACT_GOTO && rule->ctarget == NULL)
                frh->flags |= FIB_RULE_UNRESOLVED;
 
-       if (rule->ifname[0])
+       if (rule->ifname[0]) {
                NLA_PUT_STRING(skb, FRA_IFNAME, rule->ifname);
 
+               if (rule->ifindex == -1)
+                       frh->flags |= FIB_RULE_DEV_DETACHED;
+       }
+
        if (rule->pref)
                NLA_PUT_U32(skb, FRA_PRIORITY, rule->pref);