|
@@ -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);
|
|
|
}
|