iproute: make printing IPv4 cache flags a function

More refactoring prior to JSON support.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
Stephen Hemminger 2018-02-07 09:10:11 -08:00 committed by David Ahern
parent 8cfc2d4739
commit daf30f6fde
1 changed files with 39 additions and 26 deletions

View File

@ -382,6 +382,43 @@ static void print_rt_pref(FILE *fp, unsigned int pref)
}
}
static void print_cache_flags(FILE *fp, __u32 flags)
{
flags &= ~0xFFFF;
fprintf(fp, "%s cache ", _SL_);
if (flags == 0)
return;
putc('<', fp);
#define PRTFL(fl, flname) \
if (flags & RTCF_##fl) { \
flags &= ~RTCF_##fl; \
fprintf(fp, "%s%s", flname, flags ? "," : "> "); \
}
PRTFL(LOCAL, "local");
PRTFL(REJECT, "reject");
PRTFL(MULTICAST, "mc");
PRTFL(BROADCAST, "brd");
PRTFL(DNAT, "dst-nat");
PRTFL(SNAT, "src-nat");
PRTFL(MASQ, "masq");
PRTFL(DIRECTDST, "dst-direct");
PRTFL(DIRECTSRC, "src-direct");
PRTFL(REDIRECTED, "redirected");
PRTFL(DOREDIRECT, "redirect");
PRTFL(FAST, "fastroute");
PRTFL(NOTIFY, "notify");
PRTFL(TPROXY, "proxy");
#undef PRTFL
if (flags)
fprintf(fp, "%#x> ", flags);
}
int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
{
FILE *fp = (FILE *)arg;
@ -544,33 +581,9 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
if (tb[RTA_UID])
fprintf(fp, "uid %u ", rta_getattr_u32(tb[RTA_UID]));
if ((r->rtm_flags&RTM_F_CLONED) && r->rtm_family == AF_INET) {
__u32 flags = r->rtm_flags&~0xFFFF;
int first = 1;
if ((r->rtm_flags & RTM_F_CLONED) && r->rtm_family == AF_INET) {
print_cache_flags(fp, r->rtm_flags);
fprintf(fp, "%s cache ", _SL_);
#define PRTFL(fl, flname) if (flags&RTCF_##fl) { \
flags &= ~RTCF_##fl; \
fprintf(fp, "%s" flname "%s", first ? "<" : "", flags ? "," : "> "); \
first = 0; }
PRTFL(LOCAL, "local");
PRTFL(REJECT, "reject");
PRTFL(MULTICAST, "mc");
PRTFL(BROADCAST, "brd");
PRTFL(DNAT, "dst-nat");
PRTFL(SNAT, "src-nat");
PRTFL(MASQ, "masq");
PRTFL(DIRECTDST, "dst-direct");
PRTFL(DIRECTSRC, "src-direct");
PRTFL(REDIRECTED, "redirected");
PRTFL(DOREDIRECT, "redirect");
PRTFL(FAST, "fastroute");
PRTFL(NOTIFY, "notify");
PRTFL(TPROXY, "proxy");
if (flags)
fprintf(fp, "%s%x> ", first ? "<" : "", flags);
if (tb[RTA_CACHEINFO]) {
struct rta_cacheinfo *ci = RTA_DATA(tb[RTA_CACHEINFO]);