void report_close(void) { int i, j, at, max, z, w; struct mplslen *mpls, *mplss; ip_t *addr; ip_t *addr2 = NULL; char name[81]; char buf[1024]; char fmt[16]; int len=0; int len_hosts = 33; if (reportwide) { // get the longest hostname len_hosts = strlen(LocalHostname); max = net_max(); at = net_min(); for (; at < max; at++) { int nlen; addr = net_addr(at); if ((nlen = snprint_addr(name, sizeof(name), addr))) if (len_hosts < nlen) len_hosts = nlen; } } #ifndef NO_IPINFO int len_tmp = len_hosts; if (ipinfo_no >= 0) { ipinfo_no %= iiwidth_len; if (reportwide) { len_hosts++; // space len_tmp += get_iiwidth(); if (!ipinfo_no) len_tmp += 2; // align header: AS } } snprintf( fmt, sizeof(fmt), "HOST: %%-%ds", len_tmp); #else snprintf( fmt, sizeof(fmt), "HOST: %%-%ds", len_hosts); #endif snprintf(buf, sizeof(buf), fmt, LocalHostname); len = reportwide ? strlen(buf) : len_hosts; for( i=0; i<MAXFLD; i++ ) { j = fld_index[fld_active[i]]; if (j < 0) continue; snprintf( fmt, sizeof(fmt), "%%%ds", data_fields[j].length ); snprintf( buf + len, sizeof(buf), fmt, data_fields[j].title ); len += data_fields[j].length; } printf("%s\n",buf); max = net_max(); at = net_min(); for(; at < max; at++) { addr = net_addr(at); mpls = net_mpls(at); snprint_addr(name, sizeof(name), addr); #ifndef NO_IPINFO if (is_printii()) { snprintf(fmt, sizeof(fmt), " %%2d. %%s%%-%ds", len_hosts); snprintf(buf, sizeof(buf), fmt, at+1, fmt_ipinfo(addr), name); } else { #endif snprintf( fmt, sizeof(fmt), " %%2d.|-- %%-%ds", len_hosts); snprintf(buf, sizeof(buf), fmt, at+1, name); #ifndef NO_IPINFO } #endif len = reportwide ? strlen(buf) : len_hosts; for( i=0; i<MAXFLD; i++ ) { j = fld_index[fld_active [i]]; if (j < 0) continue; /* 1000.0 is a temporay hack for stats usec to ms, impacted net_loss. */ if( index( data_fields[j].format, 'f' ) ) { snprintf( buf + len, sizeof(buf), data_fields[j].format, data_fields[j].net_xxx(at) /1000.0 ); } else { snprintf( buf + len, sizeof(buf), data_fields[j].format, data_fields[j].net_xxx(at) ); } len += data_fields[j].length; } printf("%s\n",buf); /* This feature shows 'loadbalances' on routes */ /* z is starting at 1 because addrs[0] is the same that addr */ for (z = 1; z < MAXPATH ; z++) { addr2 = net_addrs(at, z); mplss = net_mplss(at, z); int found = 0; if ((addrcmp ((void *) &unspec_addr, (void *) addr2, af)) == 0) break; for (w = 0; w < z; w++) /* Ok... checking if there are ips repeated on same hop */ if ((addrcmp ((void *) addr2, (void *) net_addrs (at,w), af)) == 0) { found = 1; break; } if (!found) { #ifndef NO_IPINFO if (is_printii()) { if (mpls->labels && z == 1 && enablempls) print_mpls(mpls); snprint_addr(name, sizeof(name), addr2); printf(" %s%s\n", fmt_ipinfo(addr2), name); if (enablempls) print_mpls(mplss); } else { #else int k; if (mpls->labels && z == 1 && enablempls) { for (k=0; k < mpls->labels; k++) { printf(" | |+-- [MPLS: Lbl %lu Exp %u S %u TTL %u]\n", mpls->label[k], mpls->exp[k], mpls->s[k], mpls->ttl[k]); } } if (z == 1) { printf (" | `|-- %s\n", strlongip(addr2)); for (k=0; k < mplss->labels && enablempls; k++) { printf(" | +-- [MPLS: Lbl %lu Exp %u S %u TTL %u]\n", mplss->label[k], mplss->exp[k], mplss->s[k], mplss->ttl[k]); } } else { printf (" | |-- %s\n", strlongip(addr2)); for (k=0; k < mplss->labels && enablempls; k++) { printf(" | +-- [MPLS: Lbl %lu Exp %u S %u TTL %u]\n", mplss->label[k], mplss->exp[k], mplss->s[k], mplss->ttl[k]); } } #endif #ifndef NO_IPINFO } #endif } } /* No multipath */ #ifndef NO_IPINFO if (is_printii()) { if (mpls->labels && z == 1 && enablempls) print_mpls(mpls); } else { #else if(mpls->labels && z == 1 && enablempls) { int k; for (k=0; k < mpls->labels; k++) { printf(" | +-- [MPLS: Lbl %lu Exp %u S %u TTL %u]\n", mpls->label[k], mpls->exp[k], mpls->s[k], mpls->ttl[k]); } } #endif #ifndef NO_IPINFO } #endif } }
int mpls_nhlfe_modify(int cmd, unsigned flags, int argc, char **argv) { struct genlmsghdr *ghdr; struct { struct nlmsghdr n; char buf[4096]; } req; struct mpls_out_label_req mol; struct mpls_instr_req instr; memset(&req, 0, sizeof(req)); memset(&mol, 0, sizeof(mol)); memset(&instr, 0, sizeof(instr)); req.n.nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN); req.n.nlmsg_flags = NLM_F_REQUEST|flags; req.n.nlmsg_type = PF_MPLS; ghdr = NLMSG_DATA(&req.n); ghdr->cmd = cmd; while (argc > 0) { if (strcmp(*argv, "key") == 0) { __u32 key; NEXT_ARG(); if (get_unsigned(&key, *argv, 0)) invarg(*argv, "invalid key"); mol.mol_label.u.ml_key = key; mol.mol_label.ml_type = MPLS_LABEL_KEY; } else if (strcmp(*argv, "mtu") == 0) { __u32 mtu; NEXT_ARG(); if (get_unsigned(&mtu, *argv, 0)) invarg(*argv, "invalid mtu"); mol.mol_mtu = mtu; mol.mol_change_flag |= MPLS_CHANGE_MTU; } else if (strcmp(*argv, "no_propagate_ttl") == 0) { mol.mol_propagate_ttl = 0; mol.mol_change_flag |= MPLS_CHANGE_PROP_TTL; } else if (strcmp(*argv, "propagate_ttl") == 0) { mol.mol_propagate_ttl = 1; mol.mol_change_flag |= MPLS_CHANGE_PROP_TTL; } else if (strcmp(*argv, "instructions") == 0) { NEXT_ARG(); mpls_parse_instr(&instr, &argc, &argv, MPLS_OUT); mol.mol_change_flag |= MPLS_CHANGE_INSTR; } else { usage(); } argc--; argv++; } addattr_l(&req.n, sizeof(req), MPLS_ATTR_NHLFE, &mol, sizeof(mol)); addattr_l(&req.n, sizeof(req), MPLS_ATTR_INSTR, &instr, sizeof(instr)); if (flags & NLM_F_CREATE) { if (rtnl_talk(&rth1, &req.n, 0, 0, &req.n, NULL, NULL) < 0) return 2; //exit(2); print_mpls(NULL, &req.n, stdout); } else { if (rtnl_talk(&rth2, &req.n, 0, 0, NULL, NULL, NULL) < 0) return 2; //exit(2); } return 0; }