Module Name: src Committed By: kefren Date: Sat Jun 26 14:29:36 UTC 2010
Modified Files: src/sbin/route: keywords.c keywords.h keywords.sh route.c show.c Log Message: add MPLS clue - mpls and tag keywords To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sbin/route/keywords.c cvs rdiff -u -r1.10 -r1.11 src/sbin/route/keywords.h cvs rdiff -u -r1.8 -r1.9 src/sbin/route/keywords.sh cvs rdiff -u -r1.120 -r1.121 src/sbin/route/route.c cvs rdiff -u -r1.40 -r1.41 src/sbin/route/show.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sbin/route/keywords.c diff -u src/sbin/route/keywords.c:1.7 src/sbin/route/keywords.c:1.8 --- src/sbin/route/keywords.c:1.7 Wed May 12 17:56:13 2010 +++ src/sbin/route/keywords.c Sat Jun 26 14:29:36 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: keywords.c,v 1.7 2010/05/12 17:56:13 christos Exp $ */ +/* $NetBSD: keywords.c,v 1.8 2010/06/26 14:29:36 kefren Exp $ */ /* WARNING! This file was generated by keywords.sh */ @@ -12,8 +12,6 @@ {"change", K_CHANGE}, {"cloned", K_CLONED}, {"cloning", K_CLONING}, - {"nocloned", K_NOCLONED}, - {"nocloning", K_NOCLONING}, {"delete", K_DELETE}, {"dst", K_DST}, {"expire", K_EXPIRE}, @@ -57,8 +55,12 @@ {"xns", K_XNS}, {"xresolve", K_XRESOLVE}, {"flushall", K_FLUSHALL}, + {"nocloned", K_NOCLONED}, + {"nocloning", K_NOCLONING}, {"noblackhole", K_NOBLACKHOLE}, {"noreject", K_NOREJECT}, + {"mpls", K_MPLS}, + {"tag", K_TAG}, {0, 0} }; Index: src/sbin/route/keywords.h diff -u src/sbin/route/keywords.h:1.10 src/sbin/route/keywords.h:1.11 --- src/sbin/route/keywords.h:1.10 Wed May 12 17:56:13 2010 +++ src/sbin/route/keywords.h Sat Jun 26 14:29:36 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: keywords.h,v 1.10 2010/05/12 17:56:13 christos Exp $ */ +/* $NetBSD: keywords.h,v 1.11 2010/06/26 14:29:36 kefren Exp $ */ /* WARNING! This file was generated by keywords.sh */ @@ -61,3 +61,5 @@ #define K_NOCLONING 51 #define K_NOBLACKHOLE 52 #define K_NOREJECT 53 +#define K_MPLS 54 +#define K_TAG 55 Index: src/sbin/route/keywords.sh diff -u src/sbin/route/keywords.sh:1.8 src/sbin/route/keywords.sh:1.9 --- src/sbin/route/keywords.sh:1.8 Wed May 12 19:26:33 2010 +++ src/sbin/route/keywords.sh Sat Jun 26 14:29:36 2010 @@ -1,5 +1,5 @@ #!/bin/sh -# $NetBSD: keywords.sh,v 1.8 2010/05/12 19:26:33 kefren Exp $ +# $NetBSD: keywords.sh,v 1.9 2010/06/26 14:29:36 kefren Exp $ # @(#)keywords 8.2 (Berkeley) 3/19/94 # # WARNING! If you change this file, re-run it! @@ -61,6 +61,8 @@ nocloning noblackhole noreject +mpls +tag _EOF_ Index: src/sbin/route/route.c diff -u src/sbin/route/route.c:1.120 src/sbin/route/route.c:1.121 --- src/sbin/route/route.c:1.120 Wed May 12 17:56:13 2010 +++ src/sbin/route/route.c Sat Jun 26 14:29:36 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: route.c,v 1.120 2010/05/12 17:56:13 christos Exp $ */ +/* $NetBSD: route.c,v 1.121 2010/06/26 14:29:36 kefren Exp $ */ /* * Copyright (c) 1983, 1989, 1991, 1993 @@ -39,7 +39,7 @@ #if 0 static char sccsid[] = "@(#)route.c 8.6 (Berkeley) 4/28/95"; #else -__RCSID("$NetBSD: route.c,v 1.120 2010/05/12 17:56:13 christos Exp $"); +__RCSID("$NetBSD: route.c,v 1.121 2010/06/26 14:29:36 kefren Exp $"); #endif #endif /* not lint */ @@ -57,6 +57,7 @@ #include <netinet/in.h> #include <netatalk/at.h> #include <netiso/iso.h> +#include <netmpls/mpls.h> #include <arpa/inet.h> #include <netdb.h> @@ -83,13 +84,14 @@ struct sockaddr_dl sdl; #ifndef SMALL struct sockaddr_iso siso; + struct sockaddr_mpls smpls; #endif /* SMALL */ }; typedef union sockunion *sup; struct sou { - union sockunion so_dst, so_gate, so_mask, so_genmask, so_ifa, so_ifp; + union sockunion so_dst, so_gate, so_mask, so_genmask, so_ifa, so_ifp, so_mpls; }; static char *any_ntoa(const struct sockaddr *); @@ -121,7 +123,7 @@ int pid, rtm_addrs; int sock; int forcehost, forcenet, doflush, nflag, af, qflag, tflag, Sflag; -int iflag, verbose, aflen = sizeof(struct sockaddr_in); +int iflag, verbose, aflen = sizeof(struct sockaddr_in), rtag; int locking, lockrest, debugonly, shortoutput; struct rt_metrics rt_metrics; u_int32_t rtm_inits; @@ -575,6 +577,16 @@ ((const struct sockaddr_at *)sa)->sat_addr.s_net, ((const struct sockaddr_at *)sa)->sat_addr.s_node); break; + case AF_MPLS: + { + union mpls_shim ms; + + ms.s_addr =((const struct sockaddr_mpls*)sa)->smpls_addr.s_addr; + ms.s_addr = ntohl(ms.s_addr); + + snprintf(line, sizeof(line), "%u", ms.shim.label); + break; + } #endif /* SMALL */ default: @@ -819,6 +831,16 @@ af = AF_ISO; aflen = sizeof(struct sockaddr_iso); break; + case K_MPLS: + af = AF_MPLS; + aflen = sizeof(struct sockaddr_mpls); + break; + case K_TAG: + if (!--argc) + usage(1+*argv); + aflen = sizeof(struct sockaddr_mpls); + (void)getaddr(RTA_TAG, *++argv, 0, soup); + break; #endif /* SMALL */ case K_IFACE: @@ -1140,6 +1162,10 @@ su = &soup->so_ifa; su->sa.sa_family = af; break; + case RTA_TAG: + su = &soup->so_mpls; + afamily = AF_MPLS; + break; default: su = NULL; usage("Internal Error"); @@ -1245,6 +1271,17 @@ su->sat.sat_addr.s_node = val; rtm_addrs |= RTA_NETMASK; return(forcehost || su->sat.sat_addr.s_node != 0); + case AF_MPLS: + /* Tag should be a positive value, limited to 20 bits */ + if (atoi(s) < 0 || atoi(s) >= (1 << 20)) + errx(1, "bad tag: %s", s); + su->smpls.smpls_addr.s_addr = 0; + su->smpls.smpls_addr.shim.label = atoi(s); + su->smpls.smpls_addr.s_addr = + htonl(su->smpls.smpls_addr.s_addr); + + /* We don't have netmasks for tags */ + return 1; #endif case AF_LINK: @@ -1468,6 +1505,7 @@ NEXTADDR(RTA_GENMASK, soup->so_genmask); NEXTADDR(RTA_IFP, soup->so_ifp); NEXTADDR(RTA_IFA, soup->so_ifa); + NEXTADDR(RTA_TAG, soup->so_mpls); rtm.rtm_msglen = l = cp - (char *)&m_rtmsg; if (verbose && ! shortoutput) { if (rtm_addrs) @@ -1574,7 +1612,7 @@ const char ifnetflags[] = "\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5PTP\6NOTRAILERS\7RUNNING\010NOARP\011PPROMISC\012ALLMULTI\013OACTIVE\014SIMPLEX\015LINK0\016LINK1\017LINK2\020MULTICAST"; const char addrnames[] = -"\1DST\2GATEWAY\3NETMASK\4GENMASK\5IFP\6IFA\7AUTHOR\010BRD"; +"\1DST\2GATEWAY\3NETMASK\4GENMASK\5IFP\6IFA\7AUTHOR\010BRD\011TAG"; #ifndef SMALL @@ -1739,7 +1777,7 @@ static int print_getmsg(struct rt_msghdr *rtm, int msglen, struct sou *soup) { - struct sockaddr *dst = NULL, *gate = NULL, *mask = NULL, *ifa = NULL; + struct sockaddr *dst = NULL, *gate = NULL, *mask = NULL, *ifa = NULL, *mpls = NULL; struct sockaddr_dl *ifp = NULL; struct sockaddr *sa; char *cp; @@ -1785,6 +1823,9 @@ case RTA_IFA: ifa = sa; break; + case RTA_TAG: + mpls = sa; + break; } ADVANCE(cp, sa); } @@ -1812,6 +1853,17 @@ } else (void)printf(" gateway: %s\n", name); } + if (mpls) { + const char *name; + name = routename(mpls, NULL, RTF_HOST); + if(shortoutput) { + if (*name == '\0') + return 1; + printf("%s\n", name); + } else + printf(" Tag: %s\n", name); + } + if (ifa && ! shortoutput) (void)printf(" local addr: %s\n", routename(ifa, NULL, RTF_HOST)); @@ -1986,6 +2038,14 @@ (void)printf("%s: iso %s; ", which, iso_ntoa(&su->siso.siso_addr)); break; + case AF_MPLS: + { + union mpls_shim ms; + ms.s_addr = ntohl(su->smpls.smpls_addr.s_addr); + printf("%s: mpls %u; ", + which, ms.shim.label); + } + break; #endif /* SMALL */ default: (void)printf("%s: (%d) %s; ", Index: src/sbin/route/show.c diff -u src/sbin/route/show.c:1.40 src/sbin/route/show.c:1.41 --- src/sbin/route/show.c:1.40 Tue Jan 26 21:27:54 2010 +++ src/sbin/route/show.c Sat Jun 26 14:29:36 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: show.c,v 1.40 2010/01/26 21:27:54 is Exp $ */ +/* $NetBSD: show.c,v 1.41 2010/06/26 14:29:36 kefren Exp $ */ /* * Copyright (c) 1983, 1988, 1993 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "from: @(#)route.c 8.3 (Berkeley) 3/9/94"; #else -__RCSID("$NetBSD: show.c,v 1.40 2010/01/26 21:27:54 is Exp $"); +__RCSID("$NetBSD: show.c,v 1.41 2010/06/26 14:29:36 kefren Exp $"); #endif #endif /* not lint */ @@ -43,11 +43,13 @@ #include <sys/socket.h> #include <sys/mbuf.h> +#include <arpa/inet.h> #include <net/if.h> #include <net/if_dl.h> #include <net/if_types.h> #include <net/route.h> #include <netinet/in.h> +#include <netmpls/mpls.h> #include <sys/sysctl.h> @@ -138,6 +140,10 @@ af = AF_ISO; afname = argv[argc - 1] + 1; break; + case K_MPLS: + af = AF_MPLS; + afname = argv[argc - 1] + 1; + break; #endif /* SMALL */ case K_LINK: if (nolink) @@ -319,6 +325,9 @@ case AF_ISO: afname = "ISO"; break; + case AF_MPLS: + afname = "MPLS"; + break; #endif /* SMALL */ case AF_APPLETALK: afname = "AppleTalk"; @@ -363,6 +372,18 @@ #endif /* INET6 */ #ifndef SMALL + case AF_MPLS: + { + struct sockaddr_mpls *smpls = (struct sockaddr_mpls *)sa; + union mpls_shim ms; + + ms.s_addr = ntohl(smpls->smpls_addr.s_addr); + + snprintf(workbuf, sizeof(workbuf), "%u", + ms.shim.label); + cp = workbuf; + } + break; case AF_APPLETALK: if (getnameinfo(sa, sa->sa_len, workbuf, sizeof(workbuf), NULL, 0, NI_NUMERICHOST) != 0)