| File: | src/usr.sbin/ospfctl/output.c |
| Warning: | line 569, column 3 Value stored to 'off' is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* |
| 2 | * Copyright (c) 2005 Claudio Jeker <claudio@openbsd.org> |
| 3 | * Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org> |
| 4 | * Copyright (c) 2003 Henning Brauer <henning@openbsd.org> |
| 5 | * Copyright (c) 2020 Richard Chivers <r.chivers@zengenti.com> |
| 6 | * |
| 7 | * Permission to use, copy, modify, and distribute this software for any |
| 8 | * purpose with or without fee is hereby granted, provided that the above |
| 9 | * copyright notice and this permission notice appear in all copies. |
| 10 | * |
| 11 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| 12 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| 13 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| 14 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| 15 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| 16 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| 17 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| 18 | */ |
| 19 | |
| 20 | #include <sys/types.h> |
| 21 | #include <sys/socket.h> |
| 22 | #include <sys/un.h> |
| 23 | #include <netinet/in.h> |
| 24 | #include <arpa/inet.h> |
| 25 | #include <net/if_media.h> |
| 26 | #include <net/if_types.h> |
| 27 | |
| 28 | #include <err.h> |
| 29 | #include <errno(*__errno()).h> |
| 30 | #include <stdio.h> |
| 31 | #include <stdlib.h> |
| 32 | #include <string.h> |
| 33 | #include <unistd.h> |
| 34 | |
| 35 | #include "ospf.h" |
| 36 | #include "ospfd.h" |
| 37 | #include "ospfctl.h" |
| 38 | #include "ospfe.h" |
| 39 | #include "parser.h" |
| 40 | |
| 41 | static void |
| 42 | show_head(struct parse_result *res) |
| 43 | { |
| 44 | switch (res->action) { |
| 45 | case SHOW_IFACE: |
| 46 | printf("%-11s %-18s %-6s %-10s %-10s %-8s %3s %3s\n", |
| 47 | "Interface", "Address", "State", "HelloTimer", "Linkstate", |
| 48 | "Uptime", "nc", "ac"); |
| 49 | break; |
| 50 | case SHOW_FIB: |
| 51 | printf("flags: * = valid, O = OSPF, C = Connected, " |
| 52 | "S = Static\n"); |
| 53 | printf("%-6s %-4s %-20s %-17s\n", "Flags", "Prio", |
| 54 | "Destination", "Nexthop"); |
| 55 | break; |
| 56 | case SHOW_FIB_IFACE: |
| 57 | printf("%-15s%-15s%s\n", "Interface", "Flags", "Link state"); |
| 58 | break; |
| 59 | case SHOW_NBR: |
| 60 | printf("%-15s %-3s %-12s %-8s %-15s %-9s %s\n", "ID", "Pri", |
| 61 | "State", "DeadTime", "Address", "Iface","Uptime"); |
| 62 | break; |
| 63 | case SHOW_RIB: |
| 64 | printf("%-20s %-17s %-12s %-9s %-7s %-8s\n", "Destination", |
| 65 | "Nexthop", "Path Type", "Type", "Cost", "Uptime"); |
| 66 | break; |
| 67 | default: |
| 68 | break; |
| 69 | } |
| 70 | } |
| 71 | |
| 72 | static void |
| 73 | show_summary(struct ctl_sum *sum) |
| 74 | { |
| 75 | printf("Router ID: %s\n", inet_ntoa(sum->rtr_id)); |
| 76 | printf("Uptime: %s\n", fmt_timeframe_core(sum->uptime)); |
| 77 | printf("RFC1583 compatibility flag is "); |
| 78 | if (sum->rfc1583compat) |
| 79 | printf("enabled\n"); |
| 80 | else |
| 81 | printf("disabled\n"); |
| 82 | |
| 83 | printf("SPF delay is %d msec(s), hold time between two SPFs " |
| 84 | "is %d msec(s)\n", sum->spf_delay, sum->spf_hold_time); |
| 85 | printf("Number of external LSA(s) %d (Checksum sum 0x%x)\n", |
| 86 | sum->num_ext_lsa, sum->ext_lsa_cksum); |
| 87 | printf("Number of areas attached to this router: %d\n", |
| 88 | sum->num_area); |
| 89 | } |
| 90 | |
| 91 | static void |
| 92 | show_summary_area(struct ctl_sum_area *sumarea) |
| 93 | { |
| 94 | printf("\nArea ID: %s\n", inet_ntoa(sumarea->area)); |
| 95 | printf(" Number of interfaces in this area: %d\n", |
| 96 | sumarea->num_iface); |
| 97 | printf(" Number of fully adjacent neighbors in this " |
| 98 | "area: %d\n", sumarea->num_adj_nbr); |
| 99 | printf(" SPF algorithm executed %d time(s)\n", |
| 100 | sumarea->num_spf_calc); |
| 101 | printf(" Number LSA(s) %d (Checksum sum 0x%x)\n", |
| 102 | sumarea->num_lsa, sumarea->lsa_cksum); |
| 103 | } |
| 104 | |
| 105 | static void |
| 106 | show_rib_head(struct in_addr aid, u_int8_t d_type, u_int8_t p_type) |
| 107 | { |
| 108 | char *header, *format, *format2; |
| 109 | |
| 110 | switch (p_type) { |
| 111 | case PT_INTRA_AREA: |
| 112 | case PT_INTER_AREA: |
| 113 | switch (d_type) { |
| 114 | case DT_NET: |
| 115 | format = "Network Routing Table"; |
| 116 | format2 = ""; |
| 117 | break; |
| 118 | case DT_RTR: |
| 119 | format = "Router Routing Table"; |
| 120 | format2 = "Type"; |
| 121 | break; |
| 122 | default: |
| 123 | errx(1, "unknown route type"); |
| 124 | } |
| 125 | break; |
| 126 | case PT_TYPE1_EXT: |
| 127 | case PT_TYPE2_EXT: |
| 128 | format = NULL((void *)0); |
| 129 | format2 = "Cost 2"; |
| 130 | if ((header = strdup("External Routing Table")) == NULL((void *)0)) |
| 131 | err(1, NULL((void *)0)); |
| 132 | break; |
| 133 | default: |
| 134 | errx(1, "unknown route type"); |
| 135 | } |
| 136 | |
| 137 | if (p_type != PT_TYPE1_EXT && p_type != PT_TYPE2_EXT) |
| 138 | if (asprintf(&header, "%s (Area %s)", format, |
| 139 | inet_ntoa(aid)) == -1) |
| 140 | err(1, NULL((void *)0)); |
| 141 | |
| 142 | printf("\n%-18s %s\n", "", header); |
| 143 | free(header); |
| 144 | |
| 145 | printf("\n%-18s %-15s %-15s %-12s %-7s %-7s\n", "Destination", |
| 146 | "Nexthop", "Adv Router", "Path type", "Cost", format2); |
| 147 | } |
| 148 | |
| 149 | static void |
| 150 | show_interface(struct ctl_iface *iface, int detail) |
| 151 | { |
| 152 | char *netid; |
| 153 | |
| 154 | /* XXX This wasn't previously executed on detail call */ |
| 155 | if (asprintf(&netid, "%s/%d", inet_ntoa(iface->addr), |
| 156 | mask2prefixlen(iface->mask.s_addr)) == -1) |
| 157 | err(1, NULL((void *)0)); |
| 158 | |
| 159 | if (detail) { |
| 160 | printf("\n"); |
| 161 | printf("Interface %s, line protocol is %s\n", |
| 162 | iface->name, print_link(iface->flags)); |
| 163 | printf(" Internet address %s/%d, ", |
| 164 | inet_ntoa(iface->addr), |
| 165 | mask2prefixlen(iface->mask.s_addr)); |
| 166 | printf("Area %s\n", inet_ntoa(iface->area)); |
| 167 | printf(" Linkstate %s,", |
| 168 | get_linkstate(iface->if_type, iface->linkstate)); |
| 169 | printf(" mtu %d\n", iface->mtu); |
| 170 | printf(" Router ID %s, network type %s, cost: %d\n", |
| 171 | inet_ntoa(iface->rtr_id), |
| 172 | if_type_name(iface->type), iface->metric); |
| 173 | if (iface->dependon[0] != '\0') { |
| 174 | printf(" Depends on %s, %s\n", iface->dependon, |
| 175 | iface->depend_ok ? "up" : "down"); |
| 176 | } |
| 177 | printf(" Transmit delay is %d sec(s), state %s, priority %d\n", |
| 178 | iface->transmit_delay, if_state_name(iface->state), |
| 179 | iface->priority); |
| 180 | printf(" Designated Router (ID) %s, ", |
| 181 | inet_ntoa(iface->dr_id)); |
| 182 | printf("interface address %s\n", inet_ntoa(iface->dr_addr)); |
| 183 | printf(" Backup Designated Router (ID) %s, ", |
| 184 | inet_ntoa(iface->bdr_id)); |
| 185 | printf("interface address %s\n", inet_ntoa(iface->bdr_addr)); |
| 186 | if (iface->dead_interval == FAST_RTR_DEAD_TIME1) { |
| 187 | printf(" Timer intervals configured, " |
| 188 | "hello %d msec, dead %d, wait %d, retransmit %d\n", |
| 189 | iface->fast_hello_interval, iface->dead_interval, |
| 190 | iface->dead_interval, iface->rxmt_interval); |
| 191 | |
| 192 | } else { |
| 193 | printf(" Timer intervals configured, " |
| 194 | "hello %d, dead %d, wait %d, retransmit %d\n", |
| 195 | iface->hello_interval, iface->dead_interval, |
| 196 | iface->dead_interval, iface->rxmt_interval); |
| 197 | } |
| 198 | |
| 199 | if (iface->passive) |
| 200 | printf(" Passive interface (No Hellos)\n"); |
| 201 | else if (iface->hello_timer.tv_sec < 0) |
| 202 | printf(" Hello timer not running\n"); |
| 203 | else |
| 204 | printf(" Hello timer due in %s+%ldmsec\n", |
| 205 | fmt_timeframe_core(iface->hello_timer.tv_sec), |
| 206 | iface->hello_timer.tv_usec / 1000); |
| 207 | printf(" Uptime %s\n", fmt_timeframe_core(iface->uptime)); |
| 208 | printf(" Neighbor count is %d, adjacent neighbor count is " |
| 209 | "%d\n", iface->nbr_cnt, iface->adj_cnt); |
| 210 | |
| 211 | if (iface->auth_type > 0) { |
| 212 | switch (iface->auth_type) { |
| 213 | case AUTH_SIMPLE: |
| 214 | printf(" Simple password authentication " |
| 215 | "enabled\n"); |
| 216 | break; |
| 217 | case AUTH_CRYPT: |
| 218 | printf(" Message digest authentication " |
| 219 | "enabled\n"); |
| 220 | printf(" Primary key id is %d\n", |
| 221 | iface->auth_keyid); |
| 222 | break; |
| 223 | default: |
| 224 | break; |
| 225 | } |
| 226 | } |
| 227 | } else { |
| 228 | printf("%-11s %-18s %-6s %-10s %-10s %s %3d %3d\n", |
| 229 | iface->name, netid, if_state_name(iface->state), |
| 230 | iface->hello_timer.tv_sec < 0 ? "-" : |
| 231 | fmt_timeframe_core(iface->hello_timer.tv_sec), |
| 232 | get_linkstate(iface->if_type, iface->linkstate), |
| 233 | fmt_timeframe_core(iface->uptime), |
| 234 | iface->nbr_cnt, iface->adj_cnt); |
| 235 | } |
| 236 | free(netid); |
| 237 | } |
| 238 | |
| 239 | |
| 240 | static void |
| 241 | show_neighbor(struct ctl_nbr *nbr, int detail) |
| 242 | { |
| 243 | char *state; |
| 244 | |
| 245 | if (asprintf(&state, "%s/%s", nbr_state_name(nbr->nbr_state), |
| 246 | if_state_name(nbr->iface_state)) == -1) |
| 247 | err(1, NULL((void *)0)); |
| 248 | |
| 249 | if (detail) { |
| 250 | printf("\nNeighbor %s, ", inet_ntoa(nbr->id)); |
| 251 | printf("interface address %s\n", inet_ntoa(nbr->addr)); |
| 252 | printf(" Area %s, interface %s\n", inet_ntoa(nbr->area), |
| 253 | nbr->name); |
| 254 | printf(" Neighbor priority is %d, " |
| 255 | "State is %s, %d state changes\n", |
| 256 | nbr->priority, nbr_state_name(nbr->nbr_state), |
| 257 | nbr->state_chng_cnt); |
| 258 | printf(" DR is %s, ", inet_ntoa(nbr->dr)); |
| 259 | printf("BDR is %s\n", inet_ntoa(nbr->bdr)); |
| 260 | printf(" Options %s\n", print_ospf_options(nbr->options)); |
| 261 | printf(" Dead timer due in %s\n", |
| 262 | fmt_timeframe_core(nbr->dead_timer)); |
| 263 | printf(" Uptime %s\n", fmt_timeframe_core(nbr->uptime)); |
| 264 | printf(" Database Summary List %d\n", nbr->db_sum_lst_cnt); |
| 265 | printf(" Link State Request List %d\n", nbr->ls_req_lst_cnt); |
| 266 | printf(" Link State Retransmission List %d\n", |
| 267 | nbr->ls_retrans_lst_cnt); |
| 268 | } else { |
| 269 | printf("%-15s %-3d %-12s %-9s", inet_ntoa(nbr->id), |
| 270 | nbr->priority, state, fmt_timeframe_core(nbr->dead_timer)); |
| 271 | printf("%-15s %-9s %s\n", inet_ntoa(nbr->addr), nbr->name, |
| 272 | nbr->uptime == 0 ? "-" : fmt_timeframe_core(nbr->uptime)); |
| 273 | } |
| 274 | free(state); |
| 275 | } |
| 276 | |
| 277 | static void |
| 278 | show_rib(struct ctl_rt *rt, int detail) |
| 279 | { |
| 280 | char *dstnet; |
| 281 | static u_int8_t lasttype; |
| 282 | |
| 283 | if (detail) { |
| 284 | switch (rt->p_type) { |
| 285 | case PT_INTRA_AREA: |
| 286 | case PT_INTER_AREA: |
| 287 | switch (rt->d_type) { |
| 288 | case DT_NET: |
| 289 | if (lasttype != RIB_NET) |
| 290 | show_rib_head(rt->area, rt->d_type, |
| 291 | rt->p_type); |
| 292 | if (asprintf(&dstnet, "%s/%d", |
| 293 | inet_ntoa(rt->prefix), rt->prefixlen) == -1) |
| 294 | err(1, NULL((void *)0)); |
| 295 | lasttype = RIB_NET; |
| 296 | break; |
| 297 | case DT_RTR: |
| 298 | if (lasttype != RIB_RTR) |
| 299 | show_rib_head(rt->area, rt->d_type, |
| 300 | rt->p_type); |
| 301 | if (asprintf(&dstnet, "%s", |
| 302 | inet_ntoa(rt->prefix)) == -1) |
| 303 | err(1, NULL((void *)0)); |
| 304 | lasttype = RIB_RTR; |
| 305 | break; |
| 306 | default: |
| 307 | errx(1, "unknown route type"); |
| 308 | } |
| 309 | printf("%-18s %-15s ", dstnet, inet_ntoa(rt->nexthop)); |
| 310 | printf("%-15s %-12s %-7d", inet_ntoa(rt->adv_rtr), |
| 311 | path_type_name(rt->p_type), rt->cost); |
| 312 | free(dstnet); |
| 313 | |
| 314 | if (rt->d_type == DT_RTR) |
| 315 | printf(" %-7s", print_ospf_rtr_flags(rt->flags)); |
| 316 | |
| 317 | printf("\n"); |
| 318 | break; |
| 319 | case PT_TYPE1_EXT: |
| 320 | case PT_TYPE2_EXT: |
| 321 | if (lasttype != RIB_EXT) |
| 322 | show_rib_head(rt->area, rt->d_type, rt->p_type); |
| 323 | |
| 324 | if (asprintf(&dstnet, "%s/%d", inet_ntoa(rt->prefix), |
| 325 | rt->prefixlen) == -1) |
| 326 | err(1, NULL((void *)0)); |
| 327 | |
| 328 | printf("%-18s %-15s ", dstnet, inet_ntoa(rt->nexthop)); |
| 329 | printf("%-15s %-12s %-7d %-7d\n", inet_ntoa(rt->adv_rtr), |
| 330 | path_type_name(rt->p_type), rt->cost, rt->cost2); |
| 331 | |
| 332 | free(dstnet); |
| 333 | |
| 334 | lasttype = RIB_EXT; |
| 335 | break; |
| 336 | default: |
| 337 | errx(1, "unknown route type"); |
| 338 | } |
| 339 | } else { |
| 340 | switch (rt->d_type) { |
| 341 | case DT_NET: |
| 342 | if (asprintf(&dstnet, "%s/%d", inet_ntoa(rt->prefix), |
| 343 | rt->prefixlen) == -1) |
| 344 | err(1, NULL((void *)0)); |
| 345 | break; |
| 346 | case DT_RTR: |
| 347 | if (asprintf(&dstnet, "%s", |
| 348 | inet_ntoa(rt->prefix)) == -1) |
| 349 | err(1, NULL((void *)0)); |
| 350 | break; |
| 351 | default: |
| 352 | errx(1, "Invalid route type"); |
| 353 | } |
| 354 | |
| 355 | printf("%-20s %-16s%s %-12s %-9s %-7d %s\n", dstnet, |
| 356 | inet_ntoa(rt->nexthop), rt->connected ? "C" : " ", |
| 357 | path_type_name(rt->p_type), |
| 358 | dst_type_name(rt->d_type), rt->cost, |
| 359 | rt->uptime == 0 ? "-" : fmt_timeframe_core(rt->uptime)); |
| 360 | |
| 361 | free(dstnet); |
| 362 | } |
| 363 | } |
| 364 | |
| 365 | static void |
| 366 | show_fib(struct kroute *k) |
| 367 | { |
| 368 | char *p; |
| 369 | |
| 370 | if (k->flags & F_DOWN0x0020) |
| 371 | printf(" "); |
| 372 | else |
| 373 | printf("*"); |
| 374 | |
| 375 | if (!(k->flags & F_KERNEL0x0002)) |
| 376 | printf("O"); |
| 377 | else if (k->flags & F_CONNECTED0x0004) |
| 378 | printf("C"); |
| 379 | else if (k->flags & F_STATIC0x0008) |
| 380 | printf("S"); |
| 381 | else |
| 382 | printf(" "); |
| 383 | |
| 384 | printf(" "); |
| 385 | printf("%4d ", k->priority); |
| 386 | if (asprintf(&p, "%s/%u", inet_ntoa(k->prefix), k->prefixlen) == -1) |
| 387 | err(1, NULL((void *)0)); |
| 388 | |
| 389 | printf("%-20s ", p); |
| 390 | free(p); |
| 391 | |
| 392 | if (k->nexthop.s_addr) |
| 393 | printf("%s", inet_ntoa(k->nexthop)); |
| 394 | else if (k->flags & F_CONNECTED0x0004) |
| 395 | printf("link#%u", k->ifindex); |
| 396 | |
| 397 | printf("\n"); |
| 398 | } |
| 399 | |
| 400 | static void |
| 401 | show_fib_interface(struct kif *k) |
| 402 | { |
| 403 | uint64_t ifms_type; |
| 404 | |
| 405 | printf("%-15s", k->ifname); |
| 406 | printf("%-15s", k->flags & IFF_UP0x1 ? "UP" : ""); |
| 407 | ifms_type = get_ifms_type(k->if_type); |
| 408 | if (ifms_type) |
| 409 | printf("%s, ", get_media_descr(ifms_type)); |
| 410 | |
| 411 | printf("%s", get_linkstate(k->if_type, k->link_state)); |
| 412 | |
| 413 | if (k->link_state != LINK_STATE_DOWN2 && k->baudrate > 0) { |
| 414 | printf(", "); |
| 415 | printf("%s", print_baudrate(k->baudrate)); |
| 416 | } |
| 417 | printf("\n"); |
| 418 | } |
| 419 | |
| 420 | static void |
| 421 | show_database_head(struct in_addr aid, char *ifname, u_int8_t type) |
| 422 | { |
| 423 | char *header, *format; |
| 424 | int cleanup = 0; |
| 425 | |
| 426 | switch (type) { |
| 427 | case LSA_TYPE_ROUTER1: |
| 428 | format = "Router Link States"; |
| 429 | break; |
| 430 | case LSA_TYPE_NETWORK2: |
| 431 | format = "Net Link States"; |
| 432 | break; |
| 433 | case LSA_TYPE_SUM_NETWORK3: |
| 434 | format = "Summary Net Link States"; |
| 435 | break; |
| 436 | case LSA_TYPE_SUM_ROUTER4: |
| 437 | format = "Summary Router Link States"; |
| 438 | break; |
| 439 | case LSA_TYPE_EXTERNAL5: |
| 440 | format = NULL((void *)0); |
| 441 | if ((header = strdup("Type-5 AS External Link States")) == NULL((void *)0)) |
| 442 | err(1, NULL((void *)0)); |
| 443 | break; |
| 444 | case LSA_TYPE_LINK_OPAQ9: |
| 445 | format = "Type-9 Link Local Opaque Link States"; |
| 446 | break; |
| 447 | case LSA_TYPE_AREA_OPAQ10: |
| 448 | format = "Type-10 Area Local Opaque Link States"; |
| 449 | break; |
| 450 | case LSA_TYPE_AS_OPAQ11: |
| 451 | format = NULL((void *)0); |
| 452 | if ((header = strdup("Type-11 AS Wide Opaque Link States")) == |
| 453 | NULL((void *)0)) |
| 454 | err(1, NULL((void *)0)); |
| 455 | break; |
| 456 | default: |
| 457 | if (asprintf(&format, "LSA type %x", ntohs(type)(__uint16_t)(__builtin_constant_p(type) ? (__uint16_t)(((__uint16_t )(type) & 0xffU) << 8 | ((__uint16_t)(type) & 0xff00U ) >> 8) : __swap16md(type))) == -1) |
| 458 | err(1, NULL((void *)0)); |
| 459 | cleanup = 1; |
| 460 | break; |
| 461 | } |
| 462 | if (type == LSA_TYPE_LINK_OPAQ9) { |
| 463 | if (asprintf(&header, "%s (Area %s Interface %s)", format, |
| 464 | inet_ntoa(aid), ifname) == -1) |
| 465 | err(1, NULL((void *)0)); |
| 466 | } else if (type != LSA_TYPE_EXTERNAL5 && type != LSA_TYPE_AS_OPAQ11) |
| 467 | if (asprintf(&header, "%s (Area %s)", format, |
| 468 | inet_ntoa(aid)) == -1) |
| 469 | err(1, NULL((void *)0)); |
| 470 | |
| 471 | printf("\n%-15s %s\n\n", "", header); |
| 472 | free(header); |
| 473 | if (cleanup) |
| 474 | free(format); |
| 475 | } |
| 476 | |
| 477 | static void |
| 478 | show_db_hdr_msg_detail(struct lsa_hdr *lsa) |
| 479 | { |
| 480 | printf("LS age: %d\n", ntohs(lsa->age)(__uint16_t)(__builtin_constant_p(lsa->age) ? (__uint16_t) (((__uint16_t)(lsa->age) & 0xffU) << 8 | ((__uint16_t )(lsa->age) & 0xff00U) >> 8) : __swap16md(lsa-> age))); |
| 481 | printf("Options: %s\n", print_ospf_options(lsa->opts)); |
| 482 | printf("LS Type: %s\n", print_ls_type(lsa->type)); |
| 483 | |
| 484 | switch (lsa->type) { |
| 485 | case LSA_TYPE_ROUTER1: |
| 486 | printf("Link State ID: %s\n", log_id(lsa->ls_id)); |
| 487 | break; |
| 488 | case LSA_TYPE_NETWORK2: |
| 489 | printf("Link State ID: %s (address of Designated Router)\n", |
| 490 | log_id(lsa->ls_id)); |
| 491 | break; |
| 492 | case LSA_TYPE_SUM_NETWORK3: |
| 493 | printf("Link State ID: %s (Network ID)\n", log_id(lsa->ls_id)); |
| 494 | break; |
| 495 | case LSA_TYPE_SUM_ROUTER4: |
| 496 | printf("Link State ID: %s (ASBR Router ID)\n", |
| 497 | log_id(lsa->ls_id)); |
| 498 | break; |
| 499 | case LSA_TYPE_EXTERNAL5: |
| 500 | printf("Link State ID: %s (External Network Number)\n", |
| 501 | log_id(lsa->ls_id)); |
| 502 | break; |
| 503 | case LSA_TYPE_LINK_OPAQ9: |
| 504 | case LSA_TYPE_AREA_OPAQ10: |
| 505 | case LSA_TYPE_AS_OPAQ11: |
| 506 | printf("Link State ID: %s Type %d ID %d\n", log_id(lsa->ls_id), |
| 507 | LSA_24_GETHI(ntohl(lsa->ls_id))(((__uint32_t)(__builtin_constant_p(lsa->ls_id) ? (__uint32_t )(((__uint32_t)(lsa->ls_id) & 0xff) << 24 | ((__uint32_t )(lsa->ls_id) & 0xff00) << 8 | ((__uint32_t)(lsa ->ls_id) & 0xff0000) >> 8 | ((__uint32_t)(lsa-> ls_id) & 0xff000000) >> 24) : __swap32md(lsa->ls_id ))) >> 24), |
| 508 | LSA_24_GETLO(ntohl(lsa->ls_id))(((__uint32_t)(__builtin_constant_p(lsa->ls_id) ? (__uint32_t )(((__uint32_t)(lsa->ls_id) & 0xff) << 24 | ((__uint32_t )(lsa->ls_id) & 0xff00) << 8 | ((__uint32_t)(lsa ->ls_id) & 0xff0000) >> 8 | ((__uint32_t)(lsa-> ls_id) & 0xff000000) >> 24) : __swap32md(lsa->ls_id ))) & 0xffffff)); |
| 509 | break; |
| 510 | } |
| 511 | |
| 512 | printf("Advertising Router: %s\n", log_adv_rtr(lsa->adv_rtr)); |
| 513 | printf("LS Seq Number: 0x%08x\n", ntohl(lsa->seq_num)(__uint32_t)(__builtin_constant_p(lsa->seq_num) ? (__uint32_t )(((__uint32_t)(lsa->seq_num) & 0xff) << 24 | (( __uint32_t)(lsa->seq_num) & 0xff00) << 8 | ((__uint32_t )(lsa->seq_num) & 0xff0000) >> 8 | ((__uint32_t) (lsa->seq_num) & 0xff000000) >> 24) : __swap32md (lsa->seq_num))); |
| 514 | printf("Checksum: 0x%04x\n", ntohs(lsa->ls_chksum)(__uint16_t)(__builtin_constant_p(lsa->ls_chksum) ? (__uint16_t )(((__uint16_t)(lsa->ls_chksum) & 0xffU) << 8 | ( (__uint16_t)(lsa->ls_chksum) & 0xff00U) >> 8) : __swap16md (lsa->ls_chksum))); |
| 515 | printf("Length: %d\n", ntohs(lsa->len)(__uint16_t)(__builtin_constant_p(lsa->len) ? (__uint16_t) (((__uint16_t)(lsa->len) & 0xffU) << 8 | ((__uint16_t )(lsa->len) & 0xff00U) >> 8) : __swap16md(lsa-> len))); |
| 516 | } |
| 517 | |
| 518 | static void |
| 519 | show_db_simple(struct lsa_hdr *lsa, struct in_addr area_id, u_int8_t lasttype, |
| 520 | char *ifname) |
| 521 | { |
| 522 | if (lsa->type != lasttype) { |
| 523 | show_database_head(area_id, ifname, lsa->type); |
| 524 | printf("%-15s %-15s %-4s %-10s %-8s\n", "Link ID", |
| 525 | "Adv Router", "Age", "Seq#", "Checksum"); |
| 526 | } |
| 527 | printf("%-15s %-15s %-4d 0x%08x 0x%04x\n", |
| 528 | log_id(lsa->ls_id), log_adv_rtr(lsa->adv_rtr), |
| 529 | ntohs(lsa->age)(__uint16_t)(__builtin_constant_p(lsa->age) ? (__uint16_t) (((__uint16_t)(lsa->age) & 0xffU) << 8 | ((__uint16_t )(lsa->age) & 0xff00U) >> 8) : __swap16md(lsa-> age)), ntohl(lsa->seq_num)(__uint32_t)(__builtin_constant_p(lsa->seq_num) ? (__uint32_t )(((__uint32_t)(lsa->seq_num) & 0xff) << 24 | (( __uint32_t)(lsa->seq_num) & 0xff00) << 8 | ((__uint32_t )(lsa->seq_num) & 0xff0000) >> 8 | ((__uint32_t) (lsa->seq_num) & 0xff000000) >> 24) : __swap32md (lsa->seq_num)), |
| 530 | ntohs(lsa->ls_chksum)(__uint16_t)(__builtin_constant_p(lsa->ls_chksum) ? (__uint16_t )(((__uint16_t)(lsa->ls_chksum) & 0xffU) << 8 | ( (__uint16_t)(lsa->ls_chksum) & 0xff00U) >> 8) : __swap16md (lsa->ls_chksum))); |
| 531 | } |
| 532 | static void |
| 533 | show_db(struct lsa *lsa, struct in_addr area_id, u_int8_t lasttype, |
| 534 | char *ifname) |
| 535 | { |
| 536 | struct in_addr addr, data; |
| 537 | struct lsa_asext *asext; |
| 538 | struct lsa_rtr_link *rtr_link; |
| 539 | u_int16_t i, nlinks, off; |
| 540 | |
| 541 | if (lsa->hdr.type != lasttype) |
| 542 | show_database_head(area_id, ifname, lsa->hdr.type); |
| 543 | show_db_hdr_msg_detail(&lsa->hdr); |
| 544 | |
| 545 | switch (lsa->hdr.type) { |
| 546 | case LSA_TYPE_EXTERNAL5: |
| 547 | addr.s_addr = lsa->data.asext.mask; |
| 548 | printf("Network Mask: %s\n", inet_ntoa(addr)); |
| 549 | |
| 550 | asext = (struct lsa_asext *)((char *)lsa + sizeof(lsa->hdr)); |
| 551 | |
| 552 | printf(" Metric type: "); |
| 553 | if (ntohl(lsa->data.asext.metric)(__uint32_t)(__builtin_constant_p(lsa->data.asext.metric) ? (__uint32_t)(((__uint32_t)(lsa->data.asext.metric) & 0xff ) << 24 | ((__uint32_t)(lsa->data.asext.metric) & 0xff00) << 8 | ((__uint32_t)(lsa->data.asext.metric ) & 0xff0000) >> 8 | ((__uint32_t)(lsa->data.asext .metric) & 0xff000000) >> 24) : __swap32md(lsa-> data.asext.metric)) & LSA_ASEXT_E_FLAG0x80000000) |
| 554 | printf("2\n"); |
| 555 | else |
| 556 | printf("1\n"); |
| 557 | printf(" Metric: %d\n", ntohl(asext->metric)(__uint32_t)(__builtin_constant_p(asext->metric) ? (__uint32_t )(((__uint32_t)(asext->metric) & 0xff) << 24 | ( (__uint32_t)(asext->metric) & 0xff00) << 8 | ((__uint32_t )(asext->metric) & 0xff0000) >> 8 | ((__uint32_t )(asext->metric) & 0xff000000) >> 24) : __swap32md (asext->metric)) & |
| 558 | LSA_METRIC_MASK0x00ffffff); |
| 559 | addr.s_addr = asext->fw_addr; |
| 560 | printf(" Forwarding Address: %s\n", inet_ntoa(addr)); |
| 561 | printf(" External Route Tag: %d\n\n", ntohl(asext->ext_tag)(__uint32_t)(__builtin_constant_p(asext->ext_tag) ? (__uint32_t )(((__uint32_t)(asext->ext_tag) & 0xff) << 24 | ( (__uint32_t)(asext->ext_tag) & 0xff00) << 8 | (( __uint32_t)(asext->ext_tag) & 0xff0000) >> 8 | ( (__uint32_t)(asext->ext_tag) & 0xff000000) >> 24 ) : __swap32md(asext->ext_tag))); |
| 562 | break; |
| 563 | case LSA_TYPE_NETWORK2: |
| 564 | addr.s_addr = lsa->data.net.mask; |
| 565 | printf("Network Mask: %s\n", inet_ntoa(addr)); |
| 566 | |
| 567 | nlinks = (ntohs(lsa->hdr.len)(__uint16_t)(__builtin_constant_p(lsa->hdr.len) ? (__uint16_t )(((__uint16_t)(lsa->hdr.len) & 0xffU) << 8 | (( __uint16_t)(lsa->hdr.len) & 0xff00U) >> 8) : __swap16md (lsa->hdr.len)) - sizeof(struct lsa_hdr) |
| 568 | - sizeof(u_int32_t)) / sizeof(struct lsa_net_link); |
| 569 | off = sizeof(lsa->hdr) + sizeof(u_int32_t); |
Value stored to 'off' is never read | |
| 570 | printf("Number of Routers: %d\n", nlinks); |
| 571 | |
| 572 | for (i = 0; i < nlinks; i++) { |
| 573 | addr.s_addr = lsa->data.net.att_rtr[i]; |
| 574 | printf(" Attached Router: %s\n", inet_ntoa(addr)); |
| 575 | } |
| 576 | |
| 577 | printf("\n"); |
| 578 | break; |
| 579 | case LSA_TYPE_ROUTER1: |
| 580 | printf("Flags: %s\n", print_ospf_flags(lsa->data.rtr.flags)); |
| 581 | nlinks = ntohs(lsa->data.rtr.nlinks)(__uint16_t)(__builtin_constant_p(lsa->data.rtr.nlinks) ? ( __uint16_t)(((__uint16_t)(lsa->data.rtr.nlinks) & 0xffU ) << 8 | ((__uint16_t)(lsa->data.rtr.nlinks) & 0xff00U ) >> 8) : __swap16md(lsa->data.rtr.nlinks)); |
| 582 | printf("Number of Links: %d\n\n", nlinks); |
| 583 | |
| 584 | off = sizeof(lsa->hdr) + sizeof(struct lsa_rtr); |
| 585 | |
| 586 | for (i = 0; i < nlinks; i++) { |
| 587 | rtr_link = (struct lsa_rtr_link *)((char *)lsa + off); |
| 588 | |
| 589 | printf(" Link connected to: %s\n", |
| 590 | print_rtr_link_type(rtr_link->type)); |
| 591 | |
| 592 | addr.s_addr = rtr_link->id; |
| 593 | data.s_addr = rtr_link->data; |
| 594 | |
| 595 | switch (rtr_link->type) { |
| 596 | case LINK_TYPE_POINTTOPOINT1: |
| 597 | case LINK_TYPE_VIRTUAL4: |
| 598 | printf(" Link ID (Neighbors Router ID): " |
| 599 | "%s\n", inet_ntoa(addr)); |
| 600 | printf(" Link Data (Router Interface " |
| 601 | "address): %s\n", inet_ntoa(data)); |
| 602 | break; |
| 603 | case LINK_TYPE_TRANSIT_NET2: |
| 604 | printf(" Link ID (Designated Router " |
| 605 | "address): %s\n", inet_ntoa(addr)); |
| 606 | printf(" Link Data (Router Interface " |
| 607 | "address): %s\n", inet_ntoa(data)); |
| 608 | break; |
| 609 | case LINK_TYPE_STUB_NET3: |
| 610 | printf(" Link ID (Network ID): %s\n", |
| 611 | inet_ntoa(addr)); |
| 612 | printf(" Link Data (Network Mask): %s\n", |
| 613 | inet_ntoa(data)); |
| 614 | break; |
| 615 | default: |
| 616 | printf(" Link ID (Unknown): %s\n", |
| 617 | inet_ntoa(addr)); |
| 618 | printf(" Link Data (Unknown): %s\n", |
| 619 | inet_ntoa(data)); |
| 620 | break; |
| 621 | } |
| 622 | |
| 623 | printf(" Metric: %d\n\n", ntohs(rtr_link->metric)(__uint16_t)(__builtin_constant_p(rtr_link->metric) ? (__uint16_t )(((__uint16_t)(rtr_link->metric) & 0xffU) << 8 | ((__uint16_t)(rtr_link->metric) & 0xff00U) >> 8 ) : __swap16md(rtr_link->metric))); |
| 624 | |
| 625 | off += sizeof(struct lsa_rtr_link) + |
| 626 | rtr_link->num_tos * sizeof(u_int32_t); |
| 627 | } |
| 628 | break; |
| 629 | case LSA_TYPE_SUM_ROUTER4: |
| 630 | if (lsa->hdr.type != lasttype) |
| 631 | show_database_head(area_id, ifname, lsa->hdr.type); |
| 632 | |
| 633 | show_db_hdr_msg_detail(&lsa->hdr); |
| 634 | addr.s_addr = lsa->data.sum.mask; |
| 635 | printf("Network Mask: %s\n", inet_ntoa(addr)); |
| 636 | printf("Metric: %d\n\n", ntohl(lsa->data.sum.metric)(__uint32_t)(__builtin_constant_p(lsa->data.sum.metric) ? ( __uint32_t)(((__uint32_t)(lsa->data.sum.metric) & 0xff ) << 24 | ((__uint32_t)(lsa->data.sum.metric) & 0xff00 ) << 8 | ((__uint32_t)(lsa->data.sum.metric) & 0xff0000 ) >> 8 | ((__uint32_t)(lsa->data.sum.metric) & 0xff000000 ) >> 24) : __swap32md(lsa->data.sum.metric)) & |
| 637 | LSA_METRIC_MASK0x00ffffff); |
| 638 | break; |
| 639 | case LSA_TYPE_LINK_OPAQ9: |
| 640 | case LSA_TYPE_AREA_OPAQ10: |
| 641 | case LSA_TYPE_AS_OPAQ11: |
| 642 | if (lsa->hdr.type != lasttype) |
| 643 | show_database_head(area_id, ifname, lsa->hdr.type); |
| 644 | |
| 645 | show_db_hdr_msg_detail(&lsa->hdr); |
| 646 | break; |
| 647 | } |
| 648 | } |
| 649 | |
| 650 | static void |
| 651 | show_tail(void) |
| 652 | { |
| 653 | /* nothing */ |
| 654 | } |
| 655 | |
| 656 | const struct output show_output = { |
| 657 | .head = show_head, |
| 658 | .summary = show_summary, |
| 659 | .summary_area = show_summary_area, |
| 660 | .interface = show_interface, |
| 661 | .neighbor = show_neighbor, |
| 662 | .rib = show_rib, |
| 663 | .fib = show_fib, |
| 664 | .fib_interface = show_fib_interface, |
| 665 | .db = show_db, |
| 666 | .db_simple = show_db_simple, |
| 667 | .tail = show_tail |
| 668 | }; |