1*0f617141Sclaudio /* $OpenBSD: dvmrpctl.c,v 1.8 2009/09/14 11:49:25 claudio Exp $ */ 289189827Snorby 389189827Snorby /* 489189827Snorby * Copyright (c) 2005 Claudio Jeker <claudio@openbsd.org> 589189827Snorby * Copyright (c) 2004, 2005, 2006 Esben Norby <norby@openbsd.org> 689189827Snorby * Copyright (c) 2003 Henning Brauer <henning@openbsd.org> 789189827Snorby * 889189827Snorby * Permission to use, copy, modify, and distribute this software for any 989189827Snorby * purpose with or without fee is hereby granted, provided that the above 1089189827Snorby * copyright notice and this permission notice appear in all copies. 1189189827Snorby * 1289189827Snorby * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1389189827Snorby * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1489189827Snorby * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1589189827Snorby * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1689189827Snorby * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1789189827Snorby * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1889189827Snorby * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1989189827Snorby */ 2089189827Snorby 2189189827Snorby #include <sys/types.h> 2289189827Snorby #include <sys/socket.h> 2389189827Snorby #include <sys/un.h> 2489189827Snorby #include <netinet/in.h> 2589189827Snorby #include <netinet/ip_mroute.h> 2689189827Snorby #include <arpa/inet.h> 2789189827Snorby #include <net/if_media.h> 2889189827Snorby #include <net/if_types.h> 2989189827Snorby 3089189827Snorby #include <err.h> 3189189827Snorby #include <stdio.h> 3289189827Snorby #include <stdlib.h> 3389189827Snorby #include <string.h> 3489189827Snorby #include <unistd.h> 3589189827Snorby 3689189827Snorby #include "igmp.h" 3789189827Snorby #include "dvmrp.h" 3889189827Snorby #include "dvmrpd.h" 3989189827Snorby #include "dvmrpe.h" 4089189827Snorby #include "parser.h" 4189189827Snorby #include "log.h" 4289189827Snorby 4389189827Snorby __dead void usage(void); 4489189827Snorby int show_summary_msg(struct imsg *); 4589189827Snorby int get_ifms_type(int); 4689189827Snorby int show_interface_msg(struct imsg *); 4789189827Snorby int show_interface_detail_msg(struct imsg *); 4889189827Snorby int show_igmp_msg(struct imsg *); 4989189827Snorby const char *print_if_type(enum iface_type type); 5089189827Snorby const char *print_nbr_state(int); 5189189827Snorby const char *print_link(int); 5289189827Snorby const char *fmt_timeframe(time_t t); 5389189827Snorby const char *fmt_timeframe_core(time_t t); 5489189827Snorby int show_nbr_msg(struct imsg *); 5589189827Snorby const char *print_dvmrp_options(u_int8_t); 5689189827Snorby int show_nbr_detail_msg(struct imsg *); 5789189827Snorby int show_rib_msg(struct imsg *); 5889189827Snorby int show_rib_detail_msg(struct imsg *); 5989189827Snorby int show_mfc_msg(struct imsg *); 6089189827Snorby int show_mfc_detail_msg(struct imsg *); 6189189827Snorby const char * get_linkstate(int, int); 6289189827Snorby 6389189827Snorby struct imsgbuf *ibuf; 6489189827Snorby 6589189827Snorby __dead void 6689189827Snorby usage(void) 6789189827Snorby { 6889189827Snorby extern char *__progname; 6989189827Snorby 70b63b9e86Ssobrado fprintf(stderr, "usage: %s command [argument ...]\n", __progname); 7189189827Snorby exit(1); 7289189827Snorby } 7389189827Snorby 7489189827Snorby int 7589189827Snorby main(int argc, char *argv[]) 7689189827Snorby { 7789189827Snorby struct sockaddr_un sun; 7889189827Snorby struct parse_result *res; 7989189827Snorby struct imsg imsg; 8089189827Snorby unsigned int ifidx = 0; 8189189827Snorby int ctl_sock; 8289189827Snorby int done = 0; 8389189827Snorby int n; 8489189827Snorby 8589189827Snorby /* parse options */ 8689189827Snorby if ((res = parse(argc - 1, argv + 1)) == NULL) 8789189827Snorby exit(1); 8889189827Snorby 8989189827Snorby /* connect to dvmrpd control socket */ 9089189827Snorby if ((ctl_sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) 9189189827Snorby err(1, "socket"); 9289189827Snorby 9389189827Snorby bzero(&sun, sizeof(sun)); 9489189827Snorby sun.sun_family = AF_UNIX; 9589189827Snorby strlcpy(sun.sun_path, DVMRPD_SOCKET, sizeof(sun.sun_path)); 9689189827Snorby if (connect(ctl_sock, (struct sockaddr *)&sun, sizeof(sun)) == -1) 9789189827Snorby err(1, "connect: %s", DVMRPD_SOCKET); 9889189827Snorby 9989189827Snorby if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) 10089189827Snorby fatal(NULL); 10114d72cd0Spyr imsg_init(ibuf, ctl_sock); 10289189827Snorby done = 0; 10389189827Snorby 10489189827Snorby /* process user request */ 10589189827Snorby switch (res->action) { 10689189827Snorby case NONE: 10789189827Snorby usage(); 10889189827Snorby /* NOTREACHED */ 10989189827Snorby case SHOW: 11089189827Snorby case SHOW_SUM: 11114d72cd0Spyr imsg_compose(ibuf, IMSG_CTL_SHOW_SUM, 0, 0, -1, NULL, 0); 11289189827Snorby break; 11389189827Snorby case SHOW_IFACE: 11489189827Snorby printf("%-11s %-18s %-10s %-10s %-10s %-8s %s\n", 11589189827Snorby "Interface", "Address", "State", "ProbeTimer", "Linkstate", 11689189827Snorby "Uptime", "Groups"); 11789189827Snorby /* FALLTHROUGH */ 11889189827Snorby case SHOW_IFACE_DTAIL: 11989189827Snorby if (*res->ifname) { 12089189827Snorby ifidx = if_nametoindex(res->ifname); 12189189827Snorby if (ifidx == 0) 12289189827Snorby errx(1, "no such interface %s", res->ifname); 12389189827Snorby } 12414d72cd0Spyr imsg_compose(ibuf, IMSG_CTL_SHOW_IFACE, 0, 0, -1, &ifidx, 12589189827Snorby sizeof(ifidx)); 12689189827Snorby break; 12789189827Snorby case SHOW_IGMP: 12889189827Snorby if (*res->ifname) { 12989189827Snorby ifidx = if_nametoindex(res->ifname); 13089189827Snorby if (ifidx == 0) 13189189827Snorby errx(1, "no such interface %s", res->ifname); 13289189827Snorby } 13314d72cd0Spyr imsg_compose(ibuf, IMSG_CTL_SHOW_IGMP, 0, 0, -1, &ifidx, 13489189827Snorby sizeof(ifidx)); 13589189827Snorby break; 13689189827Snorby case SHOW_NBR: 13789189827Snorby printf("%-15s %-10s %-9s %-15s %-11s %-8s\n", "ID", "State", 13889189827Snorby "DeadTime", "Address", "Interface", "Uptime"); 13989189827Snorby /* FALLTHROUGH */ 14089189827Snorby case SHOW_NBR_DTAIL: 14114d72cd0Spyr imsg_compose(ibuf, IMSG_CTL_SHOW_NBR, 0, 0, -1, NULL, 0); 14289189827Snorby break; 14389189827Snorby case SHOW_RIB: 14489189827Snorby printf("%-20s %-17s %-7s %-10s %-s\n", "Destination", "Nexthop", 14589189827Snorby "Cost", "Uptime", "Expire"); 14689189827Snorby /* FALLTHROUGH */ 14789189827Snorby case SHOW_RIB_DTAIL: 14814d72cd0Spyr imsg_compose(ibuf, IMSG_CTL_SHOW_RIB, 0, 0, -1, NULL, 0); 14989189827Snorby break; 15089189827Snorby case SHOW_MFC: 15189189827Snorby printf("%-16s %-16s %-9s %-9s %-4s %-10s %-10s\n", "Group", 15289189827Snorby "Origin", "Incoming", "Outgoing", "TTL", "Uptime", 15389189827Snorby "Expire"); 15489189827Snorby /* FALLTHROUGH */ 15589189827Snorby case SHOW_MFC_DTAIL: 15614d72cd0Spyr imsg_compose(ibuf, IMSG_CTL_SHOW_MFC, 0, 0, -1, NULL, 0); 15789189827Snorby break; 15889189827Snorby case RELOAD: 15914d72cd0Spyr imsg_compose(ibuf, IMSG_CTL_RELOAD, 0, 0, -1, NULL, 0); 16089189827Snorby printf("reload request sent.\n"); 16189189827Snorby done = 1; 16289189827Snorby break; 16389189827Snorby } 16489189827Snorby 16589189827Snorby while (ibuf->w.queued) 16689189827Snorby if (msgbuf_write(&ibuf->w) < 0) 16789189827Snorby err(1, "write error"); 16889189827Snorby 16989189827Snorby while (!done) { 17089189827Snorby if ((n = imsg_read(ibuf)) == -1) 17189189827Snorby errx(1, "imsg_read error"); 17289189827Snorby if (n == 0) 17389189827Snorby errx(1, "pipe closed"); 17489189827Snorby 17589189827Snorby while (!done) { 17689189827Snorby if ((n = imsg_get(ibuf, &imsg)) == -1) 17789189827Snorby errx(1, "imsg_get error"); 17889189827Snorby if (n == 0) 17989189827Snorby break; 18089189827Snorby switch (res->action) { 18189189827Snorby case SHOW: 18289189827Snorby case SHOW_SUM: 18389189827Snorby done = show_summary_msg(&imsg); 18489189827Snorby break; 18589189827Snorby case SHOW_IFACE: 18689189827Snorby done = show_interface_msg(&imsg); 18789189827Snorby break; 18889189827Snorby case SHOW_IFACE_DTAIL: 18989189827Snorby done = show_interface_detail_msg(&imsg); 19089189827Snorby break; 19189189827Snorby case SHOW_IGMP: 19289189827Snorby done = show_igmp_msg(&imsg); 19389189827Snorby break; 19489189827Snorby case SHOW_NBR: 19589189827Snorby done = show_nbr_msg(&imsg); 19689189827Snorby break; 19789189827Snorby case SHOW_NBR_DTAIL: 19889189827Snorby done = show_nbr_detail_msg(&imsg); 19989189827Snorby break; 20089189827Snorby case SHOW_RIB: 20189189827Snorby done = show_rib_msg(&imsg); 20289189827Snorby break; 20389189827Snorby case SHOW_RIB_DTAIL: 20489189827Snorby done = show_rib_detail_msg(&imsg); 20589189827Snorby break; 20689189827Snorby case SHOW_MFC: 20789189827Snorby done = show_mfc_msg(&imsg); 20889189827Snorby break; 20989189827Snorby case SHOW_MFC_DTAIL: 21089189827Snorby done = show_mfc_detail_msg(&imsg); 21189189827Snorby break; 21289189827Snorby case NONE: 21389189827Snorby case RELOAD: 21489189827Snorby break; 21589189827Snorby } 21689189827Snorby imsg_free(&imsg); 21789189827Snorby } 21889189827Snorby } 21989189827Snorby close(ctl_sock); 22089189827Snorby free(ibuf); 22189189827Snorby 22289189827Snorby return (0); 22389189827Snorby } 22489189827Snorby 22589189827Snorby int 22689189827Snorby show_summary_msg(struct imsg *imsg) 22789189827Snorby { 22889189827Snorby struct ctl_sum *sum; 22989189827Snorby 23089189827Snorby switch (imsg->hdr.type) { 23189189827Snorby case IMSG_CTL_SHOW_SUM: 23289189827Snorby sum = imsg->data; 23389189827Snorby printf("Router ID: %s\n", inet_ntoa(sum->rtr_id)); 23489189827Snorby printf("Hold time is %d sec(s)\n", sum->hold_time); 23589189827Snorby break; 23689189827Snorby case IMSG_CTL_END: 23789189827Snorby printf("\n"); 23889189827Snorby return (1); 23989189827Snorby default: 24089189827Snorby break; 24189189827Snorby } 24289189827Snorby 24389189827Snorby return (0); 24489189827Snorby } 24589189827Snorby 24689189827Snorby int 24789189827Snorby get_ifms_type(int mediatype) 24889189827Snorby { 24989189827Snorby switch (mediatype) { 25089189827Snorby case IFT_ETHER: 25189189827Snorby return (IFM_ETHER); 25289189827Snorby break; 25389189827Snorby case IFT_FDDI: 25489189827Snorby return (IFM_FDDI); 25589189827Snorby break; 25689189827Snorby case IFT_CARP: 25789189827Snorby return (IFM_CARP); 25889189827Snorby break; 25989189827Snorby default: 26089189827Snorby return (0); 26189189827Snorby break; 26289189827Snorby } 26389189827Snorby } 26489189827Snorby 26589189827Snorby int 26689189827Snorby show_interface_msg(struct imsg *imsg) 26789189827Snorby { 26889189827Snorby struct ctl_iface *iface; 26989189827Snorby char *netid; 27089189827Snorby 27189189827Snorby switch (imsg->hdr.type) { 27289189827Snorby case IMSG_CTL_SHOW_IFACE: 27389189827Snorby iface = imsg->data; 27489189827Snorby 27589189827Snorby if (asprintf(&netid, "%s/%d", inet_ntoa(iface->addr), 27689189827Snorby mask2prefixlen(iface->mask.s_addr)) == -1) 27789189827Snorby err(1, NULL); 27889189827Snorby printf("%-11s %-18s %-10s %-10s %-10s %-8s %5d\n", 27989189827Snorby iface->name, netid, if_state_name(iface->state), 28089189827Snorby iface->probe_timer == 0 ? "00:00:00" : 28189189827Snorby fmt_timeframe_core(iface->probe_timer), 282*0f617141Sclaudio get_linkstate(iface->mediatype, iface->linkstate), 283*0f617141Sclaudio iface->uptime == 0 ? "00:00:00" : 28489189827Snorby fmt_timeframe_core(iface->uptime), iface->group_cnt); 28589189827Snorby free(netid); 28689189827Snorby break; 28789189827Snorby case IMSG_CTL_END: 28889189827Snorby printf("\n"); 28989189827Snorby return (1); 29089189827Snorby default: 29189189827Snorby break; 29289189827Snorby } 29389189827Snorby 29489189827Snorby return (0); 29589189827Snorby } 29689189827Snorby 29789189827Snorby int 29889189827Snorby show_interface_detail_msg(struct imsg *imsg) 29989189827Snorby { 30089189827Snorby struct ctl_iface *iface; 30189189827Snorby 30289189827Snorby switch (imsg->hdr.type) { 30389189827Snorby case IMSG_CTL_SHOW_IFACE: 30489189827Snorby iface = imsg->data; 30589189827Snorby 30689189827Snorby printf("\n"); 30789189827Snorby printf("Interface %s, line protocol is %s\n", 30889189827Snorby iface->name, print_link(iface->flags)); 30989189827Snorby printf(" Internet address %s/%d\n", 31089189827Snorby inet_ntoa(iface->addr), 31189189827Snorby mask2prefixlen(iface->mask.s_addr)); 31289189827Snorby printf(" Linkstate %s\n", 313*0f617141Sclaudio get_linkstate(iface->mediatype, iface->linkstate)); 31489189827Snorby printf(" Network type %s, cost: %d\n", 31589189827Snorby if_type_name(iface->type), iface->metric); 31689189827Snorby printf(" State %s, querier ", if_state_name(iface->state)); 31789189827Snorby if (iface->state == IF_STA_QUERIER) 31889189827Snorby printf("%s\n", inet_ntoa(iface->addr)); 31989189827Snorby else 32089189827Snorby printf("%s\n", inet_ntoa(iface->querier)); 32189189827Snorby printf(" Generation ID %d\n", iface->gen_id); 32289189827Snorby printf(" Timer intervals configured, " 32389189827Snorby "probe %d, dead %d\n", iface->probe_interval, 32489189827Snorby iface->dead_interval); 32589189827Snorby if (iface->passive) 32689189827Snorby printf(" Passive interface (No Hellos)\n"); 32789189827Snorby else if (iface->probe_timer < 0) 32889189827Snorby printf(" Hello timer not running\n"); 32989189827Snorby else 33089189827Snorby printf(" Hello timer due in %s\n", 33189189827Snorby fmt_timeframe_core(iface->probe_timer)); 33289189827Snorby printf(" Uptime %s\n", iface->uptime == 0 ? 33389189827Snorby "00:00:00" : fmt_timeframe_core(iface->uptime)); 334b39d1d57Smichele printf(" Adjacent neighbor count is " 335b39d1d57Smichele "%d\n", iface->adj_cnt); 33689189827Snorby break; 33789189827Snorby case IMSG_CTL_END: 33889189827Snorby printf("\n"); 33989189827Snorby return (1); 34089189827Snorby default: 34189189827Snorby break; 34289189827Snorby } 34389189827Snorby 34489189827Snorby return (0); 34589189827Snorby } 34689189827Snorby 34789189827Snorby int 34889189827Snorby show_igmp_msg(struct imsg *imsg) 34989189827Snorby { 35089189827Snorby struct ctl_iface *iface; 35189189827Snorby struct ctl_group *group; 35289189827Snorby char *netid; 35389189827Snorby 35489189827Snorby switch (imsg->hdr.type) { 35589189827Snorby case IMSG_CTL_SHOW_IFACE: 35689189827Snorby iface = imsg->data; 35789189827Snorby if (asprintf(&netid, "%s/%d", inet_ntoa(iface->addr), 35889189827Snorby mask2prefixlen(iface->mask.s_addr)) == -1) 35989189827Snorby err(1, NULL); 36089189827Snorby printf("\nInterface %s, address %s, state %s, groups %d\n", 36189189827Snorby iface->name, netid, if_state_name(iface->state), 36289189827Snorby iface->group_cnt); 36389189827Snorby free(netid); 36489189827Snorby printf(" %-16s %-10s %-10s %-10s\n", "Group", "State", 36589189827Snorby "DeadTimer", "Uptime"); 36689189827Snorby break; 36789189827Snorby case IMSG_CTL_SHOW_IGMP: 36889189827Snorby group = imsg->data; 36989189827Snorby printf(" %-16s %-10s %-10s %-10s\n", inet_ntoa(group->addr), 37089189827Snorby group_state_name(group->state), 37189189827Snorby group->dead_timer == 0 ? "00:00:00" : 37289189827Snorby fmt_timeframe_core(group->dead_timer), 37389189827Snorby group->uptime == 0 ? "00:00:00" : 37489189827Snorby fmt_timeframe_core(group->uptime)); 37589189827Snorby break; 37689189827Snorby case IMSG_CTL_END: 37789189827Snorby printf("\n"); 37889189827Snorby return (1); 37989189827Snorby default: 38089189827Snorby break; 38189189827Snorby } 38289189827Snorby 38389189827Snorby return (0); 38489189827Snorby } 38589189827Snorby 38689189827Snorby const char * 38789189827Snorby print_if_type(enum iface_type type) 38889189827Snorby { 38989189827Snorby switch (type) { 39089189827Snorby case IF_TYPE_POINTOPOINT: 39189189827Snorby return ("POINTOPOINT"); 39289189827Snorby case IF_TYPE_BROADCAST: 39389189827Snorby return ("BROADCAST"); 39489189827Snorby default: 39589189827Snorby return ("UNKNOWN"); 39689189827Snorby } 39789189827Snorby } 39889189827Snorby 39989189827Snorby const char * 40089189827Snorby print_nbr_state(int state) 40189189827Snorby { 40289189827Snorby switch (state) { 40389189827Snorby case NBR_STA_DOWN: 40489189827Snorby return ("DOWN"); 40589189827Snorby case NBR_STA_1_WAY: 40689189827Snorby return ("1-WAY"); 40789189827Snorby case NBR_STA_2_WAY: 40889189827Snorby return ("2-WAY"); 40989189827Snorby default: 41089189827Snorby return ("UNKNOWN"); 41189189827Snorby } 41289189827Snorby } 41389189827Snorby 41489189827Snorby const char * 41589189827Snorby print_link(int state) 41689189827Snorby { 41789189827Snorby if (state & IFF_UP) 41889189827Snorby return ("UP"); 41989189827Snorby else 42089189827Snorby return ("DOWN"); 42189189827Snorby } 42289189827Snorby 42389189827Snorby #define TF_BUFS 8 42489189827Snorby #define TF_LEN 9 42589189827Snorby 42689189827Snorby const char * 42789189827Snorby fmt_timeframe(time_t t) 42889189827Snorby { 42989189827Snorby if (t == 0) 43089189827Snorby return ("Never"); 43189189827Snorby else 43289189827Snorby return (fmt_timeframe_core(time(NULL) - t)); 43389189827Snorby } 43489189827Snorby 43589189827Snorby const char * 43689189827Snorby fmt_timeframe_core(time_t t) 43789189827Snorby { 43889189827Snorby char *buf; 43989189827Snorby static char tfbuf[TF_BUFS][TF_LEN]; /* ring buffer */ 44089189827Snorby static int idx = 0; 441db93f2f1Sderaadt unsigned int sec, min, hrs, day, week; 44289189827Snorby 44389189827Snorby if (t == 0) 44489189827Snorby return ("Stopped"); 44589189827Snorby 44689189827Snorby buf = tfbuf[idx++]; 44789189827Snorby if (idx == TF_BUFS) 44889189827Snorby idx = 0; 44989189827Snorby 45089189827Snorby week = t; 45189189827Snorby 45289189827Snorby sec = week % 60; 45389189827Snorby week /= 60; 45489189827Snorby min = week % 60; 45589189827Snorby week /= 60; 45689189827Snorby hrs = week % 24; 45789189827Snorby week /= 24; 45889189827Snorby day = week % 7; 45989189827Snorby week /= 7; 46089189827Snorby 46189189827Snorby if (week > 0) 46289189827Snorby snprintf(buf, TF_LEN, "%02uw%01ud%02uh", week, day, hrs); 46389189827Snorby else if (day > 0) 46489189827Snorby snprintf(buf, TF_LEN, "%01ud%02uh%02um", day, hrs, min); 46589189827Snorby else 46689189827Snorby snprintf(buf, TF_LEN, "%02u:%02u:%02u", hrs, min, sec); 46789189827Snorby 46889189827Snorby return (buf); 46989189827Snorby } 47089189827Snorby 47189189827Snorby /* prototype defined in dvmrpd.h and shared with the kroute.c version */ 47289189827Snorby u_int8_t 47389189827Snorby mask2prefixlen(in_addr_t ina) 47489189827Snorby { 47589189827Snorby if (ina == 0) 47689189827Snorby return (0); 47789189827Snorby else 47889189827Snorby return (33 - ffs(ntohl(ina))); 47989189827Snorby } 48089189827Snorby 48189189827Snorby int 48289189827Snorby show_nbr_msg(struct imsg *imsg) 48389189827Snorby { 48489189827Snorby struct ctl_nbr *nbr; 48589189827Snorby 48689189827Snorby switch (imsg->hdr.type) { 48789189827Snorby case IMSG_CTL_SHOW_NBR: 48889189827Snorby nbr = imsg->data; 48989189827Snorby printf("%-15s %-10s %-10s", inet_ntoa(nbr->id), 49089189827Snorby print_nbr_state(nbr->state), 49189189827Snorby fmt_timeframe_core(nbr->dead_timer)); 49289189827Snorby printf("%-15s %-11s %s\n", inet_ntoa(nbr->addr), 49389189827Snorby nbr->name, fmt_timeframe_core(nbr->uptime)); 49489189827Snorby break; 49589189827Snorby case IMSG_CTL_END: 49689189827Snorby printf("\n"); 49789189827Snorby return (1); 49889189827Snorby default: 49989189827Snorby break; 50089189827Snorby } 50189189827Snorby 50289189827Snorby return (0); 50389189827Snorby } 50489189827Snorby 50589189827Snorby const char * 50689189827Snorby print_dvmrp_options(u_int8_t opts) 50789189827Snorby { 50889189827Snorby static char optbuf[32]; 50989189827Snorby 51089189827Snorby snprintf(optbuf, sizeof(optbuf), "*|*|%s|%s|%s|%s|%s|%s", 51189189827Snorby opts & DVMRP_CAP_NETMASK ? "N" : "-", 51289189827Snorby opts & DVMRP_CAP_SNMP ? "S" : "-", 51389189827Snorby opts & DVMRP_CAP_MTRACE ? "M" : "-", 51489189827Snorby opts & DVMRP_CAP_GENID ? "G" : "-", 51589189827Snorby opts & DVMRP_CAP_PRUNE ? "P" : "-", 51689189827Snorby opts & DVMRP_CAP_LEAF ? "L" : "-"); 51789189827Snorby return (optbuf); 51889189827Snorby } 51989189827Snorby 52089189827Snorby int 52189189827Snorby show_nbr_detail_msg(struct imsg *imsg) 52289189827Snorby { 52389189827Snorby struct ctl_nbr *nbr; 52489189827Snorby 52589189827Snorby switch (imsg->hdr.type) { 52689189827Snorby case IMSG_CTL_SHOW_NBR: 52789189827Snorby nbr = imsg->data; 52889189827Snorby break; 52989189827Snorby case IMSG_CTL_END: 53089189827Snorby printf("\n"); 53189189827Snorby return (1); 53289189827Snorby default: 53389189827Snorby break; 53489189827Snorby } 53589189827Snorby 53689189827Snorby return (0); 53789189827Snorby } 53889189827Snorby 53989189827Snorby int 54089189827Snorby show_rib_msg(struct imsg *imsg) 54189189827Snorby { 54289189827Snorby struct ctl_rt *rt; 54389189827Snorby char *dstnet; 54489189827Snorby 54589189827Snorby switch (imsg->hdr.type) { 54689189827Snorby case IMSG_CTL_SHOW_RIB: 54789189827Snorby rt = imsg->data; 54889189827Snorby if (asprintf(&dstnet, "%s/%d", inet_ntoa(rt->prefix), 54989189827Snorby rt->prefixlen) == -1) 55089189827Snorby err(1, NULL); 55189189827Snorby 55289189827Snorby printf("%-20s %-17s %-7d %-9s %9s\n", dstnet, 55389189827Snorby inet_ntoa(rt->nexthop), 55489189827Snorby rt->cost, rt->uptime == 0 ? "-" : 55589189827Snorby fmt_timeframe_core(rt->uptime), 55689189827Snorby rt->expire == 0 ? "00:00:00" : 55789189827Snorby fmt_timeframe_core(rt->expire)); 55889189827Snorby free(dstnet); 55989189827Snorby 56089189827Snorby break; 56189189827Snorby case IMSG_CTL_END: 56289189827Snorby printf("\n"); 56389189827Snorby return (1); 56489189827Snorby default: 56589189827Snorby break; 56689189827Snorby } 56789189827Snorby 56889189827Snorby return (0); 56989189827Snorby } 57089189827Snorby 57189189827Snorby int 57289189827Snorby show_rib_detail_msg(struct imsg *imsg) 57389189827Snorby { 57489189827Snorby 57589189827Snorby switch (imsg->hdr.type) { 57689189827Snorby case IMSG_CTL_SHOW_RIB: 57789189827Snorby break; 57889189827Snorby case IMSG_CTL_END: 57989189827Snorby printf("\n"); 58089189827Snorby return (1); 58189189827Snorby default: 58289189827Snorby break; 58389189827Snorby } 58489189827Snorby 58589189827Snorby return (0); 58689189827Snorby } 58789189827Snorby 58889189827Snorby int 58989189827Snorby show_mfc_msg(struct imsg *imsg) 59089189827Snorby { 59189189827Snorby char iname[IF_NAMESIZE]; 59289189827Snorby char oname[IF_NAMESIZE] = "-"; 59389189827Snorby struct ctl_mfc *mfc; 59489189827Snorby int i; 59589189827Snorby 59689189827Snorby 59789189827Snorby switch (imsg->hdr.type) { 59889189827Snorby case IMSG_CTL_SHOW_MFC: 59989189827Snorby mfc = imsg->data; 60089189827Snorby if_indextoname(mfc->ifindex, iname); 60189189827Snorby 60289189827Snorby /* search for first entry with ttl > 0 */ 60389189827Snorby for (i = 0; i < MAXVIFS; i++) { 60489189827Snorby if (mfc->ttls[i] > 0) { 60589189827Snorby if_indextoname(i, oname); 60689189827Snorby i++; 60789189827Snorby break; 60889189827Snorby } 60989189827Snorby } 61089189827Snorby 61189189827Snorby /* display first entry with uptime */ 61289189827Snorby printf("%-16s ", inet_ntoa(mfc->group)); 61389189827Snorby printf("%-16s %-9s %-9s %-4d %-10s %-10s\n", 61489189827Snorby inet_ntoa(mfc->origin), iname, oname, mfc->ttls[i - 1], 61589189827Snorby mfc->uptime == 0 ? "-" : fmt_timeframe_core(mfc->uptime), 61689189827Snorby mfc->expire == 0 ? "-" : fmt_timeframe_core(mfc->expire)); 61789189827Snorby 61889189827Snorby /* display remaining entries with ttl > 0 */ 61989189827Snorby for (; i < MAXVIFS; i++) { 62089189827Snorby if (mfc->ttls[i] > 0) { 62189189827Snorby if_indextoname(i, oname); 62289189827Snorby printf("%43s %-9s %-4d\n", " ", oname, 62389189827Snorby mfc->ttls[i]); 62489189827Snorby } 62589189827Snorby } 62689189827Snorby break; 62789189827Snorby case IMSG_CTL_END: 62889189827Snorby printf("\n"); 62989189827Snorby return (1); 63089189827Snorby default: 63189189827Snorby break; 63289189827Snorby } 63389189827Snorby 63489189827Snorby return (0); 63589189827Snorby } 63689189827Snorby 63789189827Snorby int 63889189827Snorby show_mfc_detail_msg(struct imsg *imsg) 63989189827Snorby { 64089189827Snorby 64189189827Snorby switch (imsg->hdr.type) { 64289189827Snorby case IMSG_CTL_SHOW_MFC: 64389189827Snorby break; 64489189827Snorby case IMSG_CTL_END: 64589189827Snorby printf("\n"); 64689189827Snorby return (1); 64789189827Snorby default: 64889189827Snorby break; 64989189827Snorby } 65089189827Snorby 65189189827Snorby return (0); 65289189827Snorby } 65389189827Snorby 654*0f617141Sclaudio const struct if_status_description 655*0f617141Sclaudio if_status_descriptions[] = LINK_STATE_DESCRIPTIONS; 65689189827Snorby 65789189827Snorby const char * 65889189827Snorby get_linkstate(int media_type, int link_state) 65989189827Snorby { 660*0f617141Sclaudio const struct if_status_description *p; 661*0f617141Sclaudio static char buf[8]; 66289189827Snorby 663*0f617141Sclaudio for (p = if_status_descriptions; p->ifs_string != NULL; p++) { 664*0f617141Sclaudio if (LINK_STATE_DESC_MATCH(p, media_type, link_state)) 665*0f617141Sclaudio return (p->ifs_string); 66689189827Snorby } 667*0f617141Sclaudio snprintf(buf, sizeof(buf), "[#%d]", link_state); 668*0f617141Sclaudio return (buf); 66989189827Snorby } 670