Commit 963bfeee authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

net: RTA_MARK addition

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: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e955cead
...@@ -282,6 +282,7 @@ enum rtattr_type_t { ...@@ -282,6 +282,7 @@ enum rtattr_type_t {
RTA_SESSION, /* no longer used */ RTA_SESSION, /* no longer used */
RTA_MP_ALGO, /* no longer used */ RTA_MP_ALGO, /* no longer used */
RTA_TABLE, RTA_TABLE,
RTA_MARK,
__RTA_MAX __RTA_MAX
}; };
......
...@@ -2878,6 +2878,9 @@ static int rt_fill_info(struct net *net, ...@@ -2878,6 +2878,9 @@ static int rt_fill_info(struct net *net,
if (rtnetlink_put_metrics(skb, rt->dst.metrics) < 0) if (rtnetlink_put_metrics(skb, rt->dst.metrics) < 0)
goto nla_put_failure; goto nla_put_failure;
if (rt->fl.mark)
NLA_PUT_BE32(skb, RTA_MARK, rt->fl.mark);
error = rt->dst.error; error = rt->dst.error;
expires = rt->dst.expires ? rt->dst.expires - jiffies : 0; expires = rt->dst.expires ? rt->dst.expires - jiffies : 0;
if (rt->peer) { if (rt->peer) {
...@@ -2933,6 +2936,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void ...@@ -2933,6 +2936,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void
__be32 src = 0; __be32 src = 0;
u32 iif; u32 iif;
int err; int err;
int mark;
struct sk_buff *skb; struct sk_buff *skb;
err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv4_policy); 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 ...@@ -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; src = tb[RTA_SRC] ? nla_get_be32(tb[RTA_SRC]) : 0;
dst = tb[RTA_DST] ? nla_get_be32(tb[RTA_DST]) : 0; dst = tb[RTA_DST] ? nla_get_be32(tb[RTA_DST]) : 0;
iif = tb[RTA_IIF] ? nla_get_u32(tb[RTA_IIF]) : 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) { if (iif) {
struct net_device *dev; struct net_device *dev;
...@@ -2972,6 +2977,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void ...@@ -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->protocol = htons(ETH_P_IP);
skb->dev = dev; skb->dev = dev;
skb->mark = mark;
local_bh_disable(); local_bh_disable();
err = ip_route_input(skb, dst, src, rtm->rtm_tos, dev); err = ip_route_input(skb, dst, src, rtm->rtm_tos, dev);
local_bh_enable(); local_bh_enable();
...@@ -2989,6 +2995,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void ...@@ -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, .oif = tb[RTA_OIF] ? nla_get_u32(tb[RTA_OIF]) : 0,
.mark = mark,
}; };
err = ip_route_output_key(net, &rt, &fl); err = ip_route_output_key(net, &rt, &fl);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment