]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - net/decnet/dn_rules.c
[NET] rules: Unified rules dumping
[net-next-2.6.git] / net / decnet / dn_rules.c
index b7dfd04a9638b2f4bc25b9eedd975888f66e9612..fd0cc2aa316c6018adb007519b7cdc5732f7e61f 100644 (file)
@@ -109,8 +109,6 @@ errout:
 
 static struct nla_policy dn_fib_rule_policy[FRA_MAX+1] __read_mostly = {
        FRA_GENERIC_POLICY,
-       [FRA_SRC]       = { .type = NLA_U16 },
-       [FRA_DST]       = { .type = NLA_U16 },
 };
 
 static int dn_fib_rule_match(struct fib_rule *rule, struct flowi *fl, int flags)
@@ -133,7 +131,7 @@ static int dn_fib_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
        int err = -EINVAL;
        struct dn_fib_rule *r = (struct dn_fib_rule *)rule;
 
-       if (frh->src_len > 16 || frh->dst_len > 16 || frh->tos)
+       if (frh->tos)
                goto  errout;
 
        if (rule->table == RT_TABLE_UNSPEC) {
@@ -150,11 +148,11 @@ static int dn_fib_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
                }
        }
 
-       if (tb[FRA_SRC])
-               r->src = nla_get_u16(tb[FRA_SRC]);
+       if (frh->src_len)
+               r->src = nla_get_le16(tb[FRA_SRC]);
 
-       if (tb[FRA_DST])
-               r->dst = nla_get_u16(tb[FRA_DST]);
+       if (frh->dst_len)
+               r->dst = nla_get_le16(tb[FRA_DST]);
 
        r->src_len = frh->src_len;
        r->srcmask = dnet_make_mask(r->src_len);
@@ -176,10 +174,10 @@ static int dn_fib_rule_compare(struct fib_rule *rule, struct fib_rule_hdr *frh,
        if (frh->dst_len && (r->dst_len != frh->dst_len))
                return 0;
 
-       if (tb[FRA_SRC] && (r->src != nla_get_u16(tb[FRA_SRC])))
+       if (frh->src_len && (r->src != nla_get_le16(tb[FRA_SRC])))
                return 0;
 
-       if (tb[FRA_DST] && (r->dst != nla_get_u16(tb[FRA_DST])))
+       if (frh->dst_len && (r->dst != nla_get_le16(tb[FRA_DST])))
                return 0;
 
        return 1;
@@ -214,9 +212,9 @@ static int dn_fib_rule_fill(struct fib_rule *rule, struct sk_buff *skb,
        frh->tos = 0;
 
        if (r->dst_len)
-               NLA_PUT_U16(skb, FRA_DST, r->dst);
+               NLA_PUT_LE16(skb, FRA_DST, r->dst);
        if (r->src_len)
-               NLA_PUT_U16(skb, FRA_SRC, r->src);
+               NLA_PUT_LE16(skb, FRA_SRC, r->src);
 
        return 0;
 
@@ -241,20 +239,10 @@ static u32 dn_fib_rule_default_pref(void)
        return 0;
 }
 
-static size_t dn_fib_rule_nlmsg_payload(struct fib_rule *rule)
-{
-       return nla_total_size(2) /* dst */
-              + nla_total_size(2); /* src */
-}
-
-int dn_fib_dump_rules(struct sk_buff *skb, struct netlink_callback *cb)
-{
-       return fib_rules_dump(skb, cb, AF_DECnet);
-}
-
 static struct fib_rules_ops dn_fib_rules_ops = {
        .family         = AF_DECnet,
        .rule_size      = sizeof(struct dn_fib_rule),
+       .addr_size      = sizeof(u16),
        .action         = dn_fib_rule_action,
        .match          = dn_fib_rule_match,
        .configure      = dn_fib_rule_configure,