net: RTA_MARK addition
authorEric Dumazet <eric.dumazet@gmail.com>
Tue, 20 Jul 2010 22:03:14 +0000 (22:03 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 22 Jul 2010 20:46:21 +0000 (13:46 -0700)
Add a new rt attribute, RTA_MARK, and use it in
rt_fill_info()/inet_rtm_getroute() to support following commands :

ip route get 192.168.20.110 mark NUMBER
ip route get 192.168.20.108 from 192.168.20.110 iif eth1 mark NUMBER
ip route list cache [192.168.20.110] mark NUMBER

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/rtnetlink.h
net/ipv4/route.c

index fbc8cb0d48c336d4e71f458ad3f8b8d842a1c918..58d44491880fa79ec30d7c863f609547c4ed7439 100644 (file)
@@ -282,6 +282,7 @@ enum rtattr_type_t {
        RTA_SESSION, /* no longer used */
        RTA_MP_ALGO, /* no longer used */
        RTA_TABLE,
+       RTA_MARK,
        __RTA_MAX
 };
 
index 562ce92de2a65370f70550e683f8a27e3742e348..3f56b6e6c6aab583d65902e7190bbf1a6eaa60b6 100644 (file)
@@ -2878,6 +2878,9 @@ static int rt_fill_info(struct net *net,
        if (rtnetlink_put_metrics(skb, rt->dst.metrics) < 0)
                goto nla_put_failure;
 
+       if (rt->fl.mark)
+               NLA_PUT_BE32(skb, RTA_MARK, rt->fl.mark);
+
        error = rt->dst.error;
        expires = rt->dst.expires ? rt->dst.expires - jiffies : 0;
        if (rt->peer) {
@@ -2933,6 +2936,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void
        __be32 src = 0;
        u32 iif;
        int err;
+       int mark;
        struct sk_buff *skb;
 
        err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv4_policy);
@@ -2960,6 +2964,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void
        src = tb[RTA_SRC] ? nla_get_be32(tb[RTA_SRC]) : 0;
        dst = tb[RTA_DST] ? nla_get_be32(tb[RTA_DST]) : 0;
        iif = tb[RTA_IIF] ? nla_get_u32(tb[RTA_IIF]) : 0;
+       mark = tb[RTA_MARK] ? nla_get_u32(tb[RTA_MARK]) : 0;
 
        if (iif) {
                struct net_device *dev;
@@ -2972,6 +2977,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void
 
                skb->protocol   = htons(ETH_P_IP);
                skb->dev        = dev;
+               skb->mark       = mark;
                local_bh_disable();
                err = ip_route_input(skb, dst, src, rtm->rtm_tos, dev);
                local_bh_enable();
@@ -2989,6 +2995,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void
                                },
                        },
                        .oif = tb[RTA_OIF] ? nla_get_u32(tb[RTA_OIF]) : 0,
+                       .mark = mark,
                };
                err = ip_route_output_key(net, &rt, &fl);
        }