]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
add support for the RTA_NEWDST attribute.
authorEric W. Biederman <ebiederm@xmission.com>
Sun, 15 Mar 2015 19:53:11 +0000 (14:53 -0500)
committerStephen Hemminger <shemming@brocade.com>
Tue, 24 Mar 2015 22:45:23 +0000 (15:45 -0700)
This attribute is like RTA_DST except it specifies the destination
address to place on a packet when it leaves the host.  For ip based
protocols this is destination NAT and not a common part of forwarding.
For protocols like MPLS label swapping is something that typically
happens on every hop.

There is likely to be a RTA_NEWSRC at some point so RTA_NEWDST
is printed as "as to"  and can be specified either as "as to"
or just "as"

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
ip/iproute.c
man/man8/ip-route.8.in

index 214aaac9a17af5527feff34b48a1e334b686c1a1..500e6b4a701965ce638ff9829be1b3dd6f8adb40 100644 (file)
@@ -77,7 +77,7 @@ static void usage(void)
        fprintf(stderr, "INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]...\n");
        fprintf(stderr, "NH := [ via [ FAMILY ] ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS\n");
        fprintf(stderr, "FAMILY := [ inet | inet6 | ipx | dnet | bridge | link ]");
-       fprintf(stderr, "OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ]\n");
+       fprintf(stderr, "OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ] [ as [ to ] ADDRESS ]\n");
        fprintf(stderr, "           [ rtt TIME ] [ rttvar TIME ] [ reordering NUMBER ]\n");
        fprintf(stderr, "           [ window NUMBER] [ cwnd NUMBER ] [ initcwnd NUMBER ]\n");
        fprintf(stderr, "           [ ssthresh NUMBER ] [ realms REALM ] [ src ADDRESS ]\n");
@@ -388,6 +388,13 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
        } else if (r->rtm_src_len) {
                fprintf(fp, "from 0/%u ", r->rtm_src_len);
        }
+       if (tb[RTA_NEWDST]) {
+               fprintf(fp, "as to %s ", format_host(r->rtm_family,
+                                                 RTA_PAYLOAD(tb[RTA_NEWDST]),
+                                                 RTA_DATA(tb[RTA_NEWDST]),
+                                                 abuf, sizeof(abuf))
+                       );
+       }
        if (r->rtm_tos && filter.tosmask != -1) {
                SPRINT_BUF(b1);
                fprintf(fp, "tos %s ", rtnl_dsfield_n2a(r->rtm_tos, b1, sizeof(b1)));
@@ -802,6 +809,16 @@ static int iproute_modify(int cmd, unsigned flags, int argc, char **argv)
                        if (req.r.rtm_family == AF_UNSPEC)
                                req.r.rtm_family = addr.family;
                        addattr_l(&req.n, sizeof(req), RTA_PREFSRC, &addr.data, addr.bytelen);
+               } else if (strcmp(*argv, "as") == 0) {
+                       inet_prefix addr;
+                       NEXT_ARG();
+                       if (strcmp(*argv, "to") == 0) {
+                               NEXT_ARG();
+                       }
+                       get_addr(&addr, *argv, req.r.rtm_family);
+                       if (req.r.rtm_family == AF_UNSPEC)
+                               req.r.rtm_family = addr.family;
+                       addattr_l(&req.n, sizeof(req), RTA_NEWDST, &addr.data, addr.bytelen);
                } else if (strcmp(*argv, "via") == 0) {
                        inet_prefix addr;
                        int family;
index 906cfea0cd6bb535e38b4967ab5d1783a8875378..5112344971c01f369c3d0b69e298c053eb2d22b6 100644 (file)
@@ -98,6 +98,11 @@ replace " } "
 .IR NUMBER " ] [ "
 .B  advmss
 .IR NUMBER " ] [ "
+.B  as
+[
+.B to
+]
+.IR ADDRESS " ]"
 .B  rtt
 .IR TIME " ] [ "
 .B  rttvar