1 /* 2 * ipaddress.c "ip address". 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 7 * 2 of the License, or (at your option) any later version. 8 * 9 * Authors: Alexey Kuznetsov, <kuznet (at) ms2.inr.ac.ru> 10 * 11 */ 12 13 #include <stdio.h> 14 #include <stdlib.h> 15 #include <unistd.h> 16 #include <syslog.h> 17 #include <inttypes.h> 18 #include <fcntl.h> 19 #include <sys/ioctl.h> 20 #include <sys/socket.h> 21 #include <sys/ioctl.h> 22 #include <errno.h> 23 #include <netinet/in.h> 24 #include <arpa/inet.h> 25 #include <string.h> 26 #include <fnmatch.h> 27 28 #include <linux/netdevice.h> 29 #include <linux/if_arp.h> 30 #include <linux/sockios.h> 31 #include <linux/net_namespace.h> 32 33 #include "rt_names.h" 34 #include "utils.h" 35 #include "ll_map.h" 36 #include "ip_common.h" 37 #include "color.h" 38 39 enum { 40 IPADD_LIST, 41 IPADD_FLUSH, 42 IPADD_SAVE, 43 }; 44 45 static struct 46 { 47 int ifindex; 48 int family; 49 int oneline; 50 int showqueue; 51 inet_prefix pfx; 52 int scope, scopemask; 53 int flags, flagmask; 54 int up; 55 char *label; 56 int flushed; 57 char *flushb; 58 int flushp; 59 int flushe; 60 int group; 61 int master; 62 char *kind; 63 } filter; 64 65 static int do_link; 66 67 static void usage(void) __attribute__((noreturn)); 68 69 static void usage(void) 70 { 71 if (do_link) { 72 iplink_usage(); 73 } 74 fprintf(stderr, "Usage: ip address {add|change|replace} IFADDR dev IFNAME [ LIFETIME ]\n"); 75 fprintf(stderr, " [ CONFFLAG-LIST ]\n"); 76 fprintf(stderr, " ip address del IFADDR dev IFNAME [mngtmpaddr]\n"); 77 fprintf(stderr, " ip address {show|save|flush} [ dev IFNAME ] [ scope SCOPE-ID ]\n"); 78 fprintf(stderr, " [ to PREFIX ] [ FLAG-LIST ] [ label LABEL ] [up]\n"); 79 fprintf(stderr, " ip address {showdump|restore}\n"); 80 fprintf(stderr, "IFADDR := PREFIX | ADDR peer PREFIX\n"); 81 fprintf(stderr, " [ broadcast ADDR ] [ anycast ADDR ]\n"); 82 fprintf(stderr, " [ label IFNAME ] [ scope SCOPE-ID ]\n"); 83 fprintf(stderr, "SCOPE-ID := [ host | link | global | NUMBER ]\n"); 84 fprintf(stderr, "FLAG-LIST := [ FLAG-LIST ] FLAG\n"); 85 fprintf(stderr, "FLAG := [ permanent | dynamic | secondary | primary |\n"); 86 fprintf(stderr, " [-]tentative | [-]deprecated | [-]dadfailed | temporary |\n"); 87 fprintf(stderr, " CONFFLAG-LIST ]\n"); 88 fprintf(stderr, "CONFFLAG-LIST := [ CONFFLAG-LIST ] CONFFLAG\n"); 89 fprintf(stderr, "CONFFLAG := [ home | nodad | mngtmpaddr | noprefixroute | autojoin ]\n"); 90 fprintf(stderr, "LIFETIME := [ valid_lft LFT ] [ preferred_lft LFT ]\n"); 91 fprintf(stderr, "LFT := forever | SECONDS\n"); 92 93 exit(-1); 94 } 95 96 static void print_link_flags(FILE *fp, unsigned flags, unsigned mdown) 97 { 98 fprintf(fp, "<"); 99 if (flags & IFF_UP && !(flags & IFF_RUNNING)) 100 fprintf(fp, "NO-CARRIER%s", flags ? "," : ""); 101 flags &= ~IFF_RUNNING; 102 #define _PF(f) if (flags&IFF_##f) { \ 103 flags &= ~IFF_##f ; \ 104 fprintf(fp, #f "%s", flags ? "," : ""); } 105 _PF(LOOPBACK); 106 _PF(BROADCAST); 107 _PF(POINTOPOINT); 108 _PF(MULTICAST); 109 _PF(NOARP); 110 _PF(ALLMULTI); 111 _PF(PROMISC); 112 _PF(MASTER); 113 _PF(SLAVE); 114 _PF(DEBUG); 115 _PF(DYNAMIC); 116 _PF(AUTOMEDIA); 117 _PF(PORTSEL); 118 _PF(NOTRAILERS); 119 _PF(UP); 120 _PF(LOWER_UP); 121 _PF(DORMANT); 122 _PF(ECHO); 123 #undef _PF 124 if (flags) 125 fprintf(fp, "%x", flags); 126 if (mdown) 127 fprintf(fp, ",M-DOWN"); 128 fprintf(fp, "> "); 129 } 130 131 static const char *oper_states[] = { 132 "UNKNOWN", "NOTPRESENT", "DOWN", "LOWERLAYERDOWN", 133 "TESTING", "DORMANT", "UP" 134 }; 135 136 static void print_operstate(FILE *f, __u8 state) 137 { 138 if (state >= sizeof(oper_states)/sizeof(oper_states[0])) 139 fprintf(f, "state %#x ", state); 140 else { 141 if (brief) { 142 if (strcmp(oper_states[state], "UP") == 0) 143 color_fprintf(f, COLOR_OPERSTATE_UP, "%-14s ", oper_states[state]); 144 else if (strcmp(oper_states[state], "DOWN") == 0) 145 color_fprintf(f, COLOR_OPERSTATE_DOWN, "%-14s ", oper_states[state]); 146 else 147 fprintf(f, "%-14s ", oper_states[state]); 148 } else { 149 fprintf(f, "state "); 150 if (strcmp(oper_states[state], "UP") == 0) 151 color_fprintf(f, COLOR_OPERSTATE_UP, "%s ", oper_states[state]); 152 else if (strcmp(oper_states[state], "DOWN") == 0) 153 color_fprintf(f, COLOR_OPERSTATE_DOWN, "%s ", oper_states[state]); 154 else 155 fprintf(f, "%s ", oper_states[state]); 156 } 157 } 158 } 159 160 int get_operstate(const char *name) 161 { 162 int i; 163 164 for (i = 0; i < sizeof(oper_states)/sizeof(oper_states[0]); i++) 165 if (strcasecmp(name, oper_states[i]) == 0) 166 return i; 167 return -1; 168 } 169 170 static void print_queuelen(FILE *f, struct rtattr *tb[IFLA_MAX + 1]) 171 { 172 int qlen; 173 174 if (tb[IFLA_TXQLEN]) 175 qlen = *(int *)RTA_DATA(tb[IFLA_TXQLEN]); 176 else { 177 struct ifreq ifr; 178 int s = socket(AF_INET, SOCK_STREAM, 0); 179 180 if (s < 0) 181 return; 182 183 memset(&ifr, 0, sizeof(ifr)); 184 strcpy(ifr.ifr_name, rta_getattr_str(tb[IFLA_IFNAME])); 185 if (ioctl(s, SIOCGIFTXQLEN, &ifr) < 0) { 186 fprintf(f, "ioctl(SIOCGIFTXQLEN) failed: %s\n", strerror(errno)); 187 close(s); 188 return; 189 } 190 close(s); 191 qlen = ifr.ifr_qlen; 192 } 193 if (qlen) 194 fprintf(f, "qlen %d", qlen); 195 } 196 197 static const char *link_modes[] = { 198 "DEFAULT", "DORMANT" 199 }; 200 201 static void print_linkmode(FILE *f, struct rtattr *tb) 202 { 203 unsigned int mode = rta_getattr_u8(tb); 204 205 if (mode >= sizeof(link_modes) / sizeof(link_modes[0])) 206 fprintf(f, "mode %d ", mode); 207 else 208 fprintf(f, "mode %s ", link_modes[mode]); 209 } 210 211 static char *parse_link_kind(struct rtattr *tb) 212 { 213 struct rtattr *linkinfo[IFLA_INFO_MAX+1]; 214 215 parse_rtattr_nested(linkinfo, IFLA_INFO_MAX, tb); 216 217 if (linkinfo[IFLA_INFO_KIND]) 218 return RTA_DATA(linkinfo[IFLA_INFO_KIND]); 219 220 return ""; 221 } 222 223 static void print_linktype(FILE *fp, struct rtattr *tb) 224 { 225 struct rtattr *linkinfo[IFLA_INFO_MAX+1]; 226 struct link_util *lu; 227 struct link_util *slave_lu; 228 char *kind; 229 char *slave_kind; 230 231 parse_rtattr_nested(linkinfo, IFLA_INFO_MAX, tb); 232 233 if (linkinfo[IFLA_INFO_KIND]) { 234 kind = RTA_DATA(linkinfo[IFLA_INFO_KIND]); 235 236 fprintf(fp, "%s", _SL_); 237 fprintf(fp, " %s ", kind); 238 239 lu = get_link_kind(kind); 240 if (lu && lu->print_opt) { 241 struct rtattr *attr[lu->maxattr+1], **data = NULL; 242 243 if (linkinfo[IFLA_INFO_DATA]) { 244 parse_rtattr_nested(attr, lu->maxattr, 245 linkinfo[IFLA_INFO_DATA]); 246 data = attr; 247 } 248 lu->print_opt(lu, fp, data); 249 250 if (linkinfo[IFLA_INFO_XSTATS] && show_stats && 251 lu->print_xstats) 252 lu->print_xstats(lu, fp, linkinfo[IFLA_INFO_XSTATS]); 253 } 254 } 255 256 if (linkinfo[IFLA_INFO_SLAVE_KIND]) { 257 slave_kind = RTA_DATA(linkinfo[IFLA_INFO_SLAVE_KIND]); 258 259 fprintf(fp, "%s", _SL_); 260 fprintf(fp, " %s_slave ", slave_kind); 261 262 slave_lu = get_link_slave_kind(slave_kind); 263 if (slave_lu && slave_lu->print_opt) { 264 struct rtattr *attr[slave_lu->maxattr+1], **data = NULL; 265 266 if (linkinfo[IFLA_INFO_SLAVE_DATA]) { 267 parse_rtattr_nested(attr, slave_lu->maxattr, 268 linkinfo[IFLA_INFO_SLAVE_DATA]); 269 data = attr; 270 } 271 slave_lu->print_opt(slave_lu, fp, data); 272 } 273 } 274 } 275 276 static void print_af_spec(FILE *fp, struct rtattr *af_spec_attr) 277 { 278 struct rtattr *inet6_attr; 279 struct rtattr *tb[IFLA_INET6_MAX + 1]; 280 281 inet6_attr = parse_rtattr_one_nested(AF_INET6, af_spec_attr); 282 if (!inet6_attr) 283 return; 284 285 parse_rtattr_nested(tb, IFLA_INET6_MAX, inet6_attr); 286 287 if (tb[IFLA_INET6_ADDR_GEN_MODE]) { 288 __u8 mode = rta_getattr_u8(tb[IFLA_INET6_ADDR_GEN_MODE]); 289 switch (mode) { 290 case IN6_ADDR_GEN_MODE_EUI64: 291 fprintf(fp, "addrgenmode eui64 "); 292 break; 293 case IN6_ADDR_GEN_MODE_NONE: 294 fprintf(fp, "addrgenmode none "); 295 break; 296 case IN6_ADDR_GEN_MODE_STABLE_PRIVACY: 297 fprintf(fp, "addrgenmode stable_secret "); 298 break; 299 case IN6_ADDR_GEN_MODE_RANDOM: 300 fprintf(fp, "addrgenmode random "); 301 break; 302 default: 303 fprintf(fp, "addrgenmode %#.2hhx ", mode); 304 break; 305 } 306 } 307 } 308 309 static void print_vf_stats64(FILE *fp, struct rtattr *vfstats); 310 311 static void print_vfinfo(FILE *fp, struct rtattr *vfinfo) 312 { 313 struct ifla_vf_mac *vf_mac; 314 struct ifla_vf_vlan *vf_vlan; 315 struct ifla_vf_tx_rate *vf_tx_rate; 316 struct ifla_vf_spoofchk *vf_spoofchk; 317 struct ifla_vf_link_state *vf_linkstate; 318 struct rtattr *vf[IFLA_VF_MAX + 1] = {}; 319 struct rtattr *tmp; 320 SPRINT_BUF(b1); 321 322 if (vfinfo->rta_type != IFLA_VF_INFO) { 323 fprintf(stderr, "BUG: rta type is %d\n", vfinfo->rta_type); 324 return; 325 } 326 327 parse_rtattr_nested(vf, IFLA_VF_MAX, vfinfo); 328 329 vf_mac = RTA_DATA(vf[IFLA_VF_MAC]); 330 vf_vlan = RTA_DATA(vf[IFLA_VF_VLAN]); 331 vf_tx_rate = RTA_DATA(vf[IFLA_VF_TX_RATE]); 332 333 /* Check if the spoof checking vf info type is supported by 334 * this kernel. 335 */ 336 tmp = (struct rtattr *)((char *)vf[IFLA_VF_TX_RATE] + 337 vf[IFLA_VF_TX_RATE]->rta_len); 338 339 if (tmp->rta_type != IFLA_VF_SPOOFCHK) 340 vf_spoofchk = NULL; 341 else 342 vf_spoofchk = RTA_DATA(vf[IFLA_VF_SPOOFCHK]); 343 344 if (vf_spoofchk) { 345 /* Check if the link state vf info type is supported by 346 * this kernel. 347 */ 348 tmp = (struct rtattr *)((char *)vf[IFLA_VF_SPOOFCHK] + 349 vf[IFLA_VF_SPOOFCHK]->rta_len); 350 351 if (tmp->rta_type != IFLA_VF_LINK_STATE) 352 vf_linkstate = NULL; 353 else 354 vf_linkstate = RTA_DATA(vf[IFLA_VF_LINK_STATE]); 355 } else 356 vf_linkstate = NULL; 357 358 fprintf(fp, "%s vf %d MAC %s", _SL_, vf_mac->vf, 359 ll_addr_n2a((unsigned char *)&vf_mac->mac, 360 ETH_ALEN, 0, b1, sizeof(b1))); 361 if (vf_vlan->vlan) 362 fprintf(fp, ", vlan %d", vf_vlan->vlan); 363 if (vf_vlan->qos) 364 fprintf(fp, ", qos %d", vf_vlan->qos); 365 if (vf_tx_rate->rate) 366 fprintf(fp, ", tx rate %d (Mbps)", vf_tx_rate->rate); 367 368 if (vf[IFLA_VF_RATE]) { 369 struct ifla_vf_rate *vf_rate = RTA_DATA(vf[IFLA_VF_RATE]); 370 371 if (vf_rate->max_tx_rate) 372 fprintf(fp, ", max_tx_rate %dMbps", vf_rate->max_tx_rate); 373 if (vf_rate->min_tx_rate) 374 fprintf(fp, ", min_tx_rate %dMbps", vf_rate->min_tx_rate); 375 } 376 377 if (vf_spoofchk && vf_spoofchk->setting != -1) { 378 if (vf_spoofchk->setting) 379 fprintf(fp, ", spoof checking on"); 380 else 381 fprintf(fp, ", spoof checking off"); 382 } 383 if (vf_linkstate) { 384 if (vf_linkstate->link_state == IFLA_VF_LINK_STATE_AUTO) 385 fprintf(fp, ", link-state auto"); 386 else if (vf_linkstate->link_state == IFLA_VF_LINK_STATE_ENABLE) 387 fprintf(fp, ", link-state enable"); 388 else 389 fprintf(fp, ", link-state disable"); 390 } 391 if (vf[IFLA_VF_STATS] && show_stats) 392 print_vf_stats64(fp, vf[IFLA_VF_STATS]); 393 } 394 395 static void print_num(FILE *fp, unsigned width, uint64_t count) 396 { 397 const char *prefix = "kMGTPE"; 398 const unsigned int base = use_iec ? 1024 : 1000; 399 uint64_t powi = 1; 400 uint16_t powj = 1; 401 uint8_t precision = 2; 402 char buf[64]; 403 404 if (!human_readable || count < base) { 405 fprintf(fp, "%-*"PRIu64" ", width, count); 406 return; 407 } 408 409 /* increase value by a factor of 1000/1024 and print 410 * if result is something a human can read */ 411 for(;;) { 412 powi *= base; 413 if (count / base < powi) 414 break; 415 416 if (!prefix[1]) 417 break; 418 ++prefix; 419 } 420 421 /* try to guess a good number of digits for precision */ 422 for (; precision > 0; precision--) { 423 powj *= 10; 424 if (count / powi < powj) 425 break; 426 } 427 428 snprintf(buf, sizeof(buf), "%.*f%c%s", precision, 429 (double) count / powi, *prefix, use_iec ? "i" : ""); 430 431 fprintf(fp, "%-*s ", width, buf); 432 } 433 434 static void print_vf_stats64(FILE *fp, struct rtattr *vfstats) 435 { 436 struct rtattr *vf[IFLA_VF_STATS_MAX + 1] = {}; 437 438 if (vfstats->rta_type != IFLA_VF_STATS) { 439 fprintf(stderr, "BUG: rta type is %d\n", vfstats->rta_type); 440 return; 441 } 442 443 parse_rtattr_nested(vf, IFLA_VF_MAX, vfstats); 444 445 /* RX stats */ 446 fprintf(fp, "%s", _SL_); 447 fprintf(fp, " RX: bytes packets mcast bcast %s", _SL_); 448 fprintf(fp, " "); 449 450 print_num(fp, 10, *(__u64 *)RTA_DATA(vf[IFLA_VF_STATS_RX_BYTES])); 451 print_num(fp, 8, *(__u64 *)RTA_DATA(vf[IFLA_VF_STATS_RX_PACKETS])); 452 print_num(fp, 7, *(__u64 *)RTA_DATA(vf[IFLA_VF_STATS_MULTICAST])); 453 print_num(fp, 7, *(__u64 *)RTA_DATA(vf[IFLA_VF_STATS_BROADCAST])); 454 455 /* TX stats */ 456 fprintf(fp, "%s", _SL_); 457 fprintf(fp, " TX: bytes packets %s", _SL_); 458 fprintf(fp, " "); 459 460 print_num(fp, 10, *(__u64 *)RTA_DATA(vf[IFLA_VF_STATS_TX_BYTES])); 461 print_num(fp, 8, *(__u64 *)RTA_DATA(vf[IFLA_VF_STATS_TX_PACKETS])); 462 } 463 464 static void print_link_stats64(FILE *fp, const struct rtnl_link_stats64 *s, 465 const struct rtattr *carrier_changes) 466 { 467 /* RX stats */ 468 fprintf(fp, " RX: bytes packets errors dropped overrun mcast %s%s", 469 s->rx_compressed ? "compressed" : "", _SL_); 470 471 fprintf(fp, " "); 472 print_num(fp, 10, s->rx_bytes); 473 print_num(fp, 8, s->rx_packets); 474 print_num(fp, 7, s->rx_errors); 475 print_num(fp, 7, s->rx_dropped); 476 print_num(fp, 7, s->rx_over_errors); 477 print_num(fp, 7, s->multicast); 478 if (s->rx_compressed) 479 print_num(fp, 7, s->rx_compressed); 480 481 /* RX error stats */ 482 if (show_stats > 1) { 483 fprintf(fp, "%s", _SL_); 484 fprintf(fp, " RX errors: length crc frame fifo missed%s", _SL_); 485 486 fprintf(fp, " "); 487 print_num(fp, 8, s->rx_length_errors); 488 print_num(fp, 7, s->rx_crc_errors); 489 print_num(fp, 7, s->rx_frame_errors); 490 print_num(fp, 7, s->rx_fifo_errors); 491 print_num(fp, 7, s->rx_missed_errors); 492 } 493 fprintf(fp, "%s", _SL_); 494 495 /* TX stats */ 496 fprintf(fp, " TX: bytes packets errors dropped carrier collsns %s%s", 497 s->tx_compressed ? "compressed" : "", _SL_); 498 499 500 fprintf(fp, " "); 501 print_num(fp, 10, s->tx_bytes); 502 print_num(fp, 8, s->tx_packets); 503 print_num(fp, 7, s->tx_errors); 504 print_num(fp, 7, s->tx_dropped); 505 print_num(fp, 7, s->tx_carrier_errors); 506 print_num(fp, 7, s->collisions); 507 if (s->tx_compressed) 508 print_num(fp, 7, s->tx_compressed); 509 510 /* TX error stats */ 511 if (show_stats > 1) { 512 fprintf(fp, "%s", _SL_); 513 fprintf(fp, " TX errors: aborted fifo window heartbeat"); 514 if (carrier_changes) 515 fprintf(fp, " transns"); 516 fprintf(fp, "%s", _SL_); 517 518 fprintf(fp, " "); 519 print_num(fp, 8, s->tx_aborted_errors); 520 print_num(fp, 7, s->tx_fifo_errors); 521 print_num(fp, 7, s->tx_window_errors); 522 print_num(fp, 7, s->tx_heartbeat_errors); 523 if (carrier_changes) 524 print_num(fp, 7, *(uint32_t*)RTA_DATA(carrier_changes)); 525 } 526 } 527 528 static void print_link_stats32(FILE *fp, const struct rtnl_link_stats *s, 529 const struct rtattr *carrier_changes) 530 { 531 /* RX stats */ 532 fprintf(fp, " RX: bytes packets errors dropped overrun mcast %s%s", 533 s->rx_compressed ? "compressed" : "", _SL_); 534 535 536 fprintf(fp, " "); 537 print_num(fp, 10, s->rx_bytes); 538 print_num(fp, 8, s->rx_packets); 539 print_num(fp, 7, s->rx_errors); 540 print_num(fp, 7, s->rx_dropped); 541 print_num(fp, 7, s->rx_over_errors); 542 print_num(fp, 7, s->multicast); 543 if (s->rx_compressed) 544 print_num(fp, 7, s->rx_compressed); 545 546 /* RX error stats */ 547 if (show_stats > 1) { 548 fprintf(fp, "%s", _SL_); 549 fprintf(fp, " RX errors: length crc frame fifo missed%s", _SL_); 550 fprintf(fp, " "); 551 print_num(fp, 8, s->rx_length_errors); 552 print_num(fp, 7, s->rx_crc_errors); 553 print_num(fp, 7, s->rx_frame_errors); 554 print_num(fp, 7, s->rx_fifo_errors); 555 print_num(fp, 7, s->rx_missed_errors); 556 } 557 fprintf(fp, "%s", _SL_); 558 559 /* TX stats */ 560 fprintf(fp, " TX: bytes packets errors dropped carrier collsns %s%s", 561 s->tx_compressed ? "compressed" : "", _SL_); 562 563 fprintf(fp, " "); 564 print_num(fp, 10, s->tx_bytes); 565 print_num(fp, 8, s->tx_packets); 566 print_num(fp, 7, s->tx_errors); 567 print_num(fp, 7, s->tx_dropped); 568 print_num(fp, 7, s->tx_carrier_errors); 569 print_num(fp, 7, s->collisions); 570 if (s->tx_compressed) 571 print_num(fp, 7, s->tx_compressed); 572 573 /* TX error stats */ 574 if (show_stats > 1) { 575 fprintf(fp, "%s", _SL_); 576 fprintf(fp, " TX errors: aborted fifo window heartbeat"); 577 if (carrier_changes) 578 fprintf(fp, " transns"); 579 fprintf(fp, "%s", _SL_); 580 581 fprintf(fp, " "); 582 print_num(fp, 8, s->tx_aborted_errors); 583 print_num(fp, 7, s->tx_fifo_errors); 584 print_num(fp, 7, s->tx_window_errors); 585 print_num(fp, 7, s->tx_heartbeat_errors); 586 if (carrier_changes) 587 print_num(fp, 7, *(uint32_t*)RTA_DATA(carrier_changes)); 588 } 589 } 590 591 static void __print_link_stats(FILE *fp, struct rtattr **tb) 592 { 593 if (tb[IFLA_STATS64]) 594 print_link_stats64(fp, RTA_DATA(tb[IFLA_STATS64]), 595 tb[IFLA_CARRIER_CHANGES]); 596 else if (tb[IFLA_STATS]) 597 print_link_stats32(fp, RTA_DATA(tb[IFLA_STATS]), 598 tb[IFLA_CARRIER_CHANGES]); 599 } 600 601 static void print_link_stats(FILE *fp, struct nlmsghdr *n) 602 { 603 struct ifinfomsg *ifi = NLMSG_DATA(n); 604 struct rtattr * tb[IFLA_MAX+1]; 605 606 parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), 607 n->nlmsg_len - NLMSG_LENGTH(sizeof(*ifi))); 608 __print_link_stats(fp, tb); 609 fprintf(fp, "%s", _SL_); 610 } 611 612 int print_linkinfo_brief(const struct sockaddr_nl *who, 613 struct nlmsghdr *n, void *arg) 614 { 615 FILE *fp = (FILE*)arg; 616 struct ifinfomsg *ifi = NLMSG_DATA(n); 617 struct rtattr * tb[IFLA_MAX+1]; 618 int len = n->nlmsg_len; 619 char *name; 620 char buf[32] = { 0, }; 621 unsigned m_flag = 0; 622 623 if (n->nlmsg_type != RTM_NEWLINK && n->nlmsg_type != RTM_DELLINK) 624 return -1; 625 626 len -= NLMSG_LENGTH(sizeof(*ifi)); 627 if (len < 0) 628 return -1; 629 630 if (filter.ifindex && ifi->ifi_index != filter.ifindex) 631 return -1; 632 if (filter.up && !(ifi->ifi_flags&IFF_UP)) 633 return -1; 634 635 parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len); 636 if (tb[IFLA_IFNAME] == NULL) { 637 fprintf(stderr, "BUG: device with ifindex %d has nil ifname\n", ifi->ifi_index); 638 } 639 if (filter.label && 640 (!filter.family || filter.family == AF_PACKET) && 641 fnmatch(filter.label, RTA_DATA(tb[IFLA_IFNAME]), 0)) 642 return -1; 643 644 if (tb[IFLA_GROUP]) { 645 int group = *(int*)RTA_DATA(tb[IFLA_GROUP]); 646 if (filter.group != -1 && group != filter.group) 647 return -1; 648 } 649 650 if (tb[IFLA_MASTER]) { 651 int master = *(int*)RTA_DATA(tb[IFLA_MASTER]); 652 if (filter.master > 0 && master != filter.master) 653 return -1; 654 } 655 else if (filter.master > 0) 656 return -1; 657 658 if (filter.kind) { 659 if (tb[IFLA_LINKINFO]) { 660 char *kind = parse_link_kind(tb[IFLA_LINKINFO]); 661 662 if (strcmp(kind, filter.kind)) 663 return -1; 664 } else { 665 return -1; 666 } 667 } 668 669 if (n->nlmsg_type == RTM_DELLINK) 670 fprintf(fp, "Deleted "); 671 672 name = (char *)(tb[IFLA_IFNAME] ? rta_getattr_str(tb[IFLA_IFNAME]) : "<nil>"); 673 674 if (tb[IFLA_LINK]) { 675 SPRINT_BUF(b1); 676 int iflink = *(int*)RTA_DATA(tb[IFLA_LINK]); 677 if (iflink == 0) 678 snprintf(buf, sizeof(buf), "%s@NONE", name); 679 else { 680 snprintf(buf, sizeof(buf), 681 "%s@%s", name, ll_idx_n2a(iflink, b1)); 682 m_flag = ll_index_to_flags(iflink); 683 m_flag = !(m_flag & IFF_UP); 684 } 685 } else 686 snprintf(buf, sizeof(buf), "%s", name); 687 688 fprintf(fp, "%-16s ", buf); 689 690 if (tb[IFLA_OPERSTATE]) 691 print_operstate(fp, rta_getattr_u8(tb[IFLA_OPERSTATE])); 692 693 if (filter.family == AF_PACKET) { 694 SPRINT_BUF(b1); 695 if (tb[IFLA_ADDRESS]) { 696 color_fprintf(fp, COLOR_MAC, "%s ", 697 ll_addr_n2a(RTA_DATA(tb[IFLA_ADDRESS]), 698 RTA_PAYLOAD(tb[IFLA_ADDRESS]), 699 ifi->ifi_type, 700 b1, sizeof(b1))); 701 } 702 } 703 704 if (filter.family == AF_PACKET) 705 print_link_flags(fp, ifi->ifi_flags, m_flag); 706 707 if (filter.family == AF_PACKET) 708 fprintf(fp, "\n"); 709 fflush(fp); 710 return 0; 711 } 712 713 int print_linkinfo(const struct sockaddr_nl *who, 714 struct nlmsghdr *n, void *arg) 715 { 716 FILE *fp = (FILE*)arg; 717 struct ifinfomsg *ifi = NLMSG_DATA(n); 718 struct rtattr * tb[IFLA_MAX+1]; 719 int len = n->nlmsg_len; 720 unsigned m_flag = 0; 721 722 if (n->nlmsg_type != RTM_NEWLINK && n->nlmsg_type != RTM_DELLINK) 723 return 0; 724 725 len -= NLMSG_LENGTH(sizeof(*ifi)); 726 if (len < 0) 727 return -1; 728 729 if (filter.ifindex && ifi->ifi_index != filter.ifindex) 730 return 0; 731 if (filter.up && !(ifi->ifi_flags&IFF_UP)) 732 return 0; 733 734 parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len); 735 if (tb[IFLA_IFNAME] == NULL) { 736 fprintf(stderr, "BUG: device with ifindex %d has nil ifname\n", ifi->ifi_index); 737 } 738 if (filter.label && 739 (!filter.family || filter.family == AF_PACKET) && 740 fnmatch(filter.label, RTA_DATA(tb[IFLA_IFNAME]), 0)) 741 return 0; 742 743 if (tb[IFLA_GROUP]) { 744 int group = *(int*)RTA_DATA(tb[IFLA_GROUP]); 745 if (filter.group != -1 && group != filter.group) 746 return -1; 747 } 748 749 if (tb[IFLA_MASTER]) { 750 int master = *(int*)RTA_DATA(tb[IFLA_MASTER]); 751 if (filter.master > 0 && master != filter.master) 752 return -1; 753 } 754 else if (filter.master > 0) 755 return -1; 756 757 if (filter.kind) { 758 if (tb[IFLA_LINKINFO]) { 759 char *kind = parse_link_kind(tb[IFLA_LINKINFO]); 760 761 if (strcmp(kind, filter.kind)) 762 return -1; 763 } else { 764 return -1; 765 } 766 } 767 768 if (n->nlmsg_type == RTM_DELLINK) 769 fprintf(fp, "Deleted "); 770 771 fprintf(fp, "%d: ", ifi->ifi_index); 772 color_fprintf(fp, COLOR_IFNAME, "%s", 773 tb[IFLA_IFNAME] ? rta_getattr_str(tb[IFLA_IFNAME]) : "<nil>"); 774 775 if (tb[IFLA_LINK]) { 776 SPRINT_BUF(b1); 777 int iflink = *(int*)RTA_DATA(tb[IFLA_LINK]); 778 if (iflink == 0) 779 fprintf(fp, "@NONE: "); 780 else { 781 if (tb[IFLA_LINK_NETNSID]) 782 fprintf(fp, "@if%d: ", iflink); 783 else { 784 fprintf(fp, "@%s: ", ll_idx_n2a(iflink, b1)); 785 m_flag = ll_index_to_flags(iflink); 786 m_flag = !(m_flag & IFF_UP); 787 } 788 } 789 } else { 790 fprintf(fp, ": "); 791 } 792 print_link_flags(fp, ifi->ifi_flags, m_flag); 793 794 if (tb[IFLA_MTU]) 795 fprintf(fp, "mtu %u ", *(int*)RTA_DATA(tb[IFLA_MTU])); 796 if (tb[IFLA_QDISC]) 797 fprintf(fp, "qdisc %s ", rta_getattr_str(tb[IFLA_QDISC])); 798 if (tb[IFLA_MASTER]) { 799 SPRINT_BUF(b1); 800 fprintf(fp, "master %s ", ll_idx_n2a(*(int*)RTA_DATA(tb[IFLA_MASTER]), b1)); 801 } 802 803 if (tb[IFLA_PHYS_PORT_ID]) { 804 SPRINT_BUF(b1); 805 fprintf(fp, "portid %s ", 806 hexstring_n2a(RTA_DATA(tb[IFLA_PHYS_PORT_ID]), 807 RTA_PAYLOAD(tb[IFLA_PHYS_PORT_ID]), 808 b1, sizeof(b1))); 809 } 810 811 if (tb[IFLA_PHYS_SWITCH_ID]) { 812 SPRINT_BUF(b1); 813 fprintf(fp, "switchid %s ", 814 hexstring_n2a(RTA_DATA(tb[IFLA_PHYS_SWITCH_ID]), 815 RTA_PAYLOAD(tb[IFLA_PHYS_SWITCH_ID]), 816 b1, sizeof(b1))); 817 } 818 819 if (tb[IFLA_OPERSTATE]) 820 print_operstate(fp, rta_getattr_u8(tb[IFLA_OPERSTATE])); 821 822 if (do_link && tb[IFLA_LINKMODE]) 823 print_linkmode(fp, tb[IFLA_LINKMODE]); 824 825 if (tb[IFLA_GROUP]) { 826 SPRINT_BUF(b1); 827 int group = *(int*)RTA_DATA(tb[IFLA_GROUP]); 828 fprintf(fp, "group %s ", rtnl_group_n2a(group, b1, sizeof(b1))); 829 } 830 831 if (filter.showqueue) 832 print_queuelen(fp, tb); 833 834 if (!filter.family || filter.family == AF_PACKET || show_details) { 835 SPRINT_BUF(b1); 836 fprintf(fp, "%s", _SL_); 837 fprintf(fp, " link/%s ", ll_type_n2a(ifi->ifi_type, b1, sizeof(b1))); 838 839 if (tb[IFLA_ADDRESS]) { 840 color_fprintf(fp, COLOR_MAC, "%s", 841 ll_addr_n2a(RTA_DATA(tb[IFLA_ADDRESS]), 842 RTA_PAYLOAD(tb[IFLA_ADDRESS]), 843 ifi->ifi_type, 844 b1, sizeof(b1))); 845 } 846 if (tb[IFLA_BROADCAST]) { 847 if (ifi->ifi_flags&IFF_POINTOPOINT) 848 fprintf(fp, " peer "); 849 else 850 fprintf(fp, " brd "); 851 fprintf(fp, "%s", ll_addr_n2a(RTA_DATA(tb[IFLA_BROADCAST]), 852 RTA_PAYLOAD(tb[IFLA_BROADCAST]), 853 ifi->ifi_type, 854 b1, sizeof(b1))); 855 } 856 } 857 858 if (tb[IFLA_LINK_NETNSID]) { 859 int id = *(int*)RTA_DATA(tb[IFLA_LINK_NETNSID]); 860 861 if (id >= 0) 862 fprintf(fp, " link-netnsid %d", id); 863 else 864 fprintf(fp, " link-netnsid unknown"); 865 } 866 867 if (tb[IFLA_PROTO_DOWN]) { 868 if (rta_getattr_u8(tb[IFLA_PROTO_DOWN])) 869 fprintf(fp, " protodown on "); 870 } 871 872 if (tb[IFLA_PROMISCUITY] && show_details) 873 fprintf(fp, " promiscuity %u ", 874 *(int*)RTA_DATA(tb[IFLA_PROMISCUITY])); 875 876 if (tb[IFLA_LINKINFO] && show_details) 877 print_linktype(fp, tb[IFLA_LINKINFO]); 878 879 if (do_link && tb[IFLA_AF_SPEC] && show_details) 880 print_af_spec(fp, tb[IFLA_AF_SPEC]); 881 882 if ((do_link || show_details) && tb[IFLA_IFALIAS]) { 883 fprintf(fp, "%s alias %s", _SL_, 884 rta_getattr_str(tb[IFLA_IFALIAS])); 885 } 886 887 if (do_link && show_stats) { 888 fprintf(fp, "%s", _SL_); 889 __print_link_stats(fp, tb); 890 } 891 892 if ((do_link || show_details) && tb[IFLA_VFINFO_LIST] && tb[IFLA_NUM_VF]) { 893 struct rtattr *i, *vflist = tb[IFLA_VFINFO_LIST]; 894 int rem = RTA_PAYLOAD(vflist); 895 for (i = RTA_DATA(vflist); RTA_OK(i, rem); i = RTA_NEXT(i, rem)) 896 print_vfinfo(fp, i); 897 } 898 899 fprintf(fp, "\n"); 900 fflush(fp); 901 return 1; 902 } 903 904 static int flush_update(void) 905 { 906 907 /* 908 * Note that the kernel may delete multiple addresses for one 909 * delete request (e.g. if ipv4 address promotion is disabled). 910 * Since a flush operation is really a series of delete requests 911 * its possible that we may request an address delete that has 912 * already been done by the kernel. Therefore, ignore EADDRNOTAVAIL 913 * errors returned from a flush request 914 */ 915 if ((rtnl_send_check(&rth, filter.flushb, filter.flushp) < 0) && 916 (errno != EADDRNOTAVAIL)) { 917 perror("Failed to send flush request"); 918 return -1; 919 } 920 filter.flushp = 0; 921 return 0; 922 } 923 924 static int set_lifetime(unsigned int *lifetime, char *argv) 925 { 926 if (strcmp(argv, "forever") == 0) 927 *lifetime = INFINITY_LIFE_TIME; 928 else if (get_u32(lifetime, argv, 0)) 929 return -1; 930 931 return 0; 932 } 933 934 static unsigned int get_ifa_flags(struct ifaddrmsg *ifa, 935 struct rtattr *ifa_flags_attr) 936 { 937 return ifa_flags_attr ? rta_getattr_u32(ifa_flags_attr) : 938 ifa->ifa_flags; 939 } 940 941 int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n, 942 void *arg) 943 { 944 FILE *fp = arg; 945 struct ifaddrmsg *ifa = NLMSG_DATA(n); 946 int len = n->nlmsg_len; 947 int deprecated = 0; 948 /* Use local copy of ifa_flags to not interfere with filtering code */ 949 unsigned int ifa_flags; 950 struct rtattr * rta_tb[IFA_MAX+1]; 951 char abuf[256]; 952 SPRINT_BUF(b1); 953 954 if (n->nlmsg_type != RTM_NEWADDR && n->nlmsg_type != RTM_DELADDR) 955 return 0; 956 len -= NLMSG_LENGTH(sizeof(*ifa)); 957 if (len < 0) { 958 fprintf(stderr, "BUG: wrong nlmsg len %d\n", len); 959 return -1; 960 } 961 962 if (filter.flushb && n->nlmsg_type != RTM_NEWADDR) 963 return 0; 964 965 parse_rtattr(rta_tb, IFA_MAX, IFA_RTA(ifa), 966 n->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa))); 967 968 ifa_flags = get_ifa_flags(ifa, rta_tb[IFA_FLAGS]); 969 970 if (!rta_tb[IFA_LOCAL]) 971 rta_tb[IFA_LOCAL] = rta_tb[IFA_ADDRESS]; 972 if (!rta_tb[IFA_ADDRESS]) 973 rta_tb[IFA_ADDRESS] = rta_tb[IFA_LOCAL]; 974 975 if (filter.ifindex && filter.ifindex != ifa->ifa_index) 976 return 0; 977 if ((filter.scope^ifa->ifa_scope)&filter.scopemask) 978 return 0; 979 if ((filter.flags ^ ifa_flags) & filter.flagmask) 980 return 0; 981 if (filter.label) { 982 SPRINT_BUF(b1); 983 const char *label; 984 if (rta_tb[IFA_LABEL]) 985 label = RTA_DATA(rta_tb[IFA_LABEL]); 986 else 987 label = ll_idx_n2a(ifa->ifa_index, b1); 988 if (fnmatch(filter.label, label, 0) != 0) 989 return 0; 990 } 991 if (filter.pfx.family) { 992 if (rta_tb[IFA_LOCAL]) { 993 inet_prefix dst; 994 memset(&dst, 0, sizeof(dst)); 995 dst.family = ifa->ifa_family; 996 memcpy(&dst.data, RTA_DATA(rta_tb[IFA_LOCAL]), RTA_PAYLOAD(rta_tb[IFA_LOCAL])); 997 if (inet_addr_match(&dst, &filter.pfx, filter.pfx.bitlen)) 998 return 0; 999 } 1000 } 1001 1002 if (filter.family && filter.family != ifa->ifa_family) 1003 return 0; 1004 1005 if (filter.flushb) { 1006 struct nlmsghdr *fn; 1007 if (NLMSG_ALIGN(filter.flushp) + n->nlmsg_len > filter.flushe) { 1008 if (flush_update()) 1009 return -1; 1010 } 1011 fn = (struct nlmsghdr*)(filter.flushb + NLMSG_ALIGN(filter.flushp)); 1012 memcpy(fn, n, n->nlmsg_len); 1013 fn->nlmsg_type = RTM_DELADDR; 1014 fn->nlmsg_flags = NLM_F_REQUEST; 1015 fn->nlmsg_seq = ++rth.seq; 1016 filter.flushp = (((char*)fn) + n->nlmsg_len) - filter.flushb; 1017 filter.flushed++; 1018 if (show_stats < 2) 1019 return 0; 1020 } 1021 1022 if (n->nlmsg_type == RTM_DELADDR) 1023 fprintf(fp, "Deleted "); 1024 1025 if (!brief) { 1026 if (filter.oneline || filter.flushb) 1027 fprintf(fp, "%u: %s", ifa->ifa_index, ll_index_to_name(ifa->ifa_index)); 1028 if (ifa->ifa_family == AF_INET) 1029 fprintf(fp, " inet "); 1030 else if (ifa->ifa_family == AF_INET6) 1031 fprintf(fp, " inet6 "); 1032 else if (ifa->ifa_family == AF_DECnet) 1033 fprintf(fp, " dnet "); 1034 else if (ifa->ifa_family == AF_IPX) 1035 fprintf(fp, " ipx "); 1036 else 1037 fprintf(fp, " family %d ", ifa->ifa_family); 1038 } 1039 1040 if (rta_tb[IFA_LOCAL]) { 1041 if (ifa->ifa_family == AF_INET) 1042 color_fprintf(fp, COLOR_INET, "%s", format_host(ifa->ifa_family, 1043 RTA_PAYLOAD(rta_tb[IFA_LOCAL]), 1044 RTA_DATA(rta_tb[IFA_LOCAL]), 1045 abuf, sizeof(abuf))); 1046 else if (ifa->ifa_family == AF_INET6) 1047 color_fprintf(fp, COLOR_INET6, "%s", format_host(ifa->ifa_family, 1048 RTA_PAYLOAD(rta_tb[IFA_LOCAL]), 1049 RTA_DATA(rta_tb[IFA_LOCAL]), 1050 abuf, sizeof(abuf))); 1051 else 1052 fprintf(fp, "%s", format_host(ifa->ifa_family, 1053 RTA_PAYLOAD(rta_tb[IFA_LOCAL]), 1054 RTA_DATA(rta_tb[IFA_LOCAL]), 1055 abuf, sizeof(abuf))); 1056 1057 if (rta_tb[IFA_ADDRESS] == NULL || 1058 memcmp(RTA_DATA(rta_tb[IFA_ADDRESS]), RTA_DATA(rta_tb[IFA_LOCAL]), 1059 ifa->ifa_family == AF_INET ? 4 : 16) == 0) { 1060 fprintf(fp, "/%d ", ifa->ifa_prefixlen); 1061 } else { 1062 fprintf(fp, " peer %s/%d ", 1063 format_host(ifa->ifa_family, 1064 RTA_PAYLOAD(rta_tb[IFA_ADDRESS]), 1065 RTA_DATA(rta_tb[IFA_ADDRESS]), 1066 abuf, sizeof(abuf)), 1067 ifa->ifa_prefixlen); 1068 } 1069 } 1070 1071 if (brief) 1072 goto brief_exit; 1073 1074 if (rta_tb[IFA_BROADCAST]) { 1075 fprintf(fp, "brd %s ", 1076 format_host(ifa->ifa_family, 1077 RTA_PAYLOAD(rta_tb[IFA_BROADCAST]), 1078 RTA_DATA(rta_tb[IFA_BROADCAST]), 1079 abuf, sizeof(abuf))); 1080 } 1081 if (rta_tb[IFA_ANYCAST]) { 1082 fprintf(fp, "any %s ", 1083 format_host(ifa->ifa_family, 1084 RTA_PAYLOAD(rta_tb[IFA_ANYCAST]), 1085 RTA_DATA(rta_tb[IFA_ANYCAST]), 1086 abuf, sizeof(abuf))); 1087 } 1088 fprintf(fp, "scope %s ", rtnl_rtscope_n2a(ifa->ifa_scope, b1, sizeof(b1))); 1089 if (ifa_flags & IFA_F_SECONDARY) { 1090 ifa_flags &= ~IFA_F_SECONDARY; 1091 if (ifa->ifa_family == AF_INET6) 1092 fprintf(fp, "temporary "); 1093 else 1094 fprintf(fp, "secondary "); 1095 } 1096 if (ifa_flags & IFA_F_TENTATIVE) { 1097 ifa_flags &= ~IFA_F_TENTATIVE; 1098 fprintf(fp, "tentative "); 1099 } 1100 if (ifa_flags & IFA_F_DEPRECATED) { 1101 ifa_flags &= ~IFA_F_DEPRECATED; 1102 deprecated = 1; 1103 fprintf(fp, "deprecated "); 1104 } 1105 if (ifa_flags & IFA_F_HOMEADDRESS) { 1106 ifa_flags &= ~IFA_F_HOMEADDRESS; 1107 fprintf(fp, "home "); 1108 } 1109 if (ifa_flags & IFA_F_NODAD) { 1110 ifa_flags &= ~IFA_F_NODAD; 1111 fprintf(fp, "nodad "); 1112 } 1113 if (ifa_flags & IFA_F_MANAGETEMPADDR) { 1114 ifa_flags &= ~IFA_F_MANAGETEMPADDR; 1115 fprintf(fp, "mngtmpaddr "); 1116 } 1117 if (ifa_flags & IFA_F_NOPREFIXROUTE) { 1118 ifa_flags &= ~IFA_F_NOPREFIXROUTE; 1119 fprintf(fp, "noprefixroute "); 1120 } 1121 if (ifa_flags & IFA_F_MCAUTOJOIN) { 1122 ifa_flags &= ~IFA_F_MCAUTOJOIN; 1123 fprintf(fp, "autojoin "); 1124 } 1125 if (!(ifa_flags & IFA_F_PERMANENT)) { 1126 fprintf(fp, "dynamic "); 1127 } else 1128 ifa_flags &= ~IFA_F_PERMANENT; 1129 if (ifa_flags & IFA_F_DADFAILED) { 1130 ifa_flags &= ~IFA_F_DADFAILED; 1131 fprintf(fp, "dadfailed "); 1132 } 1133 if (ifa_flags) 1134 fprintf(fp, "flags %02x ", ifa_flags); 1135 if (rta_tb[IFA_LABEL]) 1136 fprintf(fp, "%s", rta_getattr_str(rta_tb[IFA_LABEL])); 1137 if (rta_tb[IFA_CACHEINFO]) { 1138 struct ifa_cacheinfo *ci = RTA_DATA(rta_tb[IFA_CACHEINFO]); 1139 fprintf(fp, "%s", _SL_); 1140 fprintf(fp, " valid_lft "); 1141 if (ci->ifa_valid == INFINITY_LIFE_TIME) 1142 fprintf(fp, "forever"); 1143 else 1144 fprintf(fp, "%usec", ci->ifa_valid); 1145 fprintf(fp, " preferred_lft "); 1146 if (ci->ifa_prefered == INFINITY_LIFE_TIME) 1147 fprintf(fp, "forever"); 1148 else { 1149 if (deprecated) 1150 fprintf(fp, "%dsec", ci->ifa_prefered); 1151 else 1152 fprintf(fp, "%usec", ci->ifa_prefered); 1153 } 1154 } 1155 fprintf(fp, "\n"); 1156 brief_exit: 1157 fflush(fp); 1158 return 0; 1159 } 1160 1161 struct nlmsg_list 1162 { 1163 struct nlmsg_list *next; 1164 struct nlmsghdr h; 1165 }; 1166 1167 struct nlmsg_chain 1168 { 1169 struct nlmsg_list *head; 1170 struct nlmsg_list *tail; 1171 }; 1172 1173 static int print_selected_addrinfo(struct ifinfomsg *ifi, 1174 struct nlmsg_list *ainfo, FILE *fp) 1175 { 1176 for ( ;ainfo ; ainfo = ainfo->next) { 1177 struct nlmsghdr *n = &ainfo->h; 1178 struct ifaddrmsg *ifa = NLMSG_DATA(n); 1179 1180 if (n->nlmsg_type != RTM_NEWADDR) 1181 continue; 1182 1183 if (n->nlmsg_len < NLMSG_LENGTH(sizeof(ifa))) 1184 return -1; 1185 1186 if (ifa->ifa_index != ifi->ifi_index || 1187 (filter.family && filter.family != ifa->ifa_family)) 1188 continue; 1189 1190 if (filter.up && !(ifi->ifi_flags&IFF_UP)) 1191 continue; 1192 1193 print_addrinfo(NULL, n, fp); 1194 } 1195 if (brief) { 1196 fprintf(fp, "\n"); 1197 fflush(fp); 1198 } 1199 return 0; 1200 } 1201 1202 1203 static int store_nlmsg(const struct sockaddr_nl *who, struct nlmsghdr *n, 1204 void *arg) 1205 { 1206 struct nlmsg_chain *lchain = (struct nlmsg_chain *)arg; 1207 struct nlmsg_list *h; 1208 1209 h = malloc(n->nlmsg_len+sizeof(void*)); 1210 if (h == NULL) 1211 return -1; 1212 1213 memcpy(&h->h, n, n->nlmsg_len); 1214 h->next = NULL; 1215 1216 if (lchain->tail) 1217 lchain->tail->next = h; 1218 else 1219 lchain->head = h; 1220 lchain->tail = h; 1221 1222 ll_remember_index(who, n, NULL); 1223 return 0; 1224 } 1225 1226 static __u32 ipadd_dump_magic = 0x47361222; 1227 1228 static int ipadd_save_prep(void) 1229 { 1230 int ret; 1231 1232 if (isatty(STDOUT_FILENO)) { 1233 fprintf(stderr, "Not sending a binary stream to stdout\n"); 1234 return -1; 1235 } 1236 1237 ret = write(STDOUT_FILENO, &ipadd_dump_magic, sizeof(ipadd_dump_magic)); 1238 if (ret != sizeof(ipadd_dump_magic)) { 1239 fprintf(stderr, "Can't write magic to dump file\n"); 1240 return -1; 1241 } 1242 1243 return 0; 1244 } 1245 1246 static int ipadd_dump_check_magic(void) 1247 { 1248 int ret; 1249 __u32 magic = 0; 1250 1251 if (isatty(STDIN_FILENO)) { 1252 fprintf(stderr, "Can't restore address dump from a terminal\n"); 1253 return -1; 1254 } 1255 1256 ret = fread(&magic, sizeof(magic), 1, stdin); 1257 if (magic != ipadd_dump_magic) { 1258 fprintf(stderr, "Magic mismatch (%d elems, %x magic)\n", ret, magic); 1259 return -1; 1260 } 1261 1262 return 0; 1263 } 1264 1265 static int save_nlmsg(const struct sockaddr_nl *who, struct nlmsghdr *n, 1266 void *arg) 1267 { 1268 int ret; 1269 1270 ret = write(STDOUT_FILENO, n, n->nlmsg_len); 1271 if ((ret > 0) && (ret != n->nlmsg_len)) { 1272 fprintf(stderr, "Short write while saving nlmsg\n"); 1273 ret = -EIO; 1274 } 1275 1276 return ret == n->nlmsg_len ? 0 : ret; 1277 } 1278 1279 static int show_handler(const struct sockaddr_nl *nl, 1280 struct rtnl_ctrl_data *ctrl, 1281 struct nlmsghdr *n, void *arg) 1282 { 1283 struct ifaddrmsg *ifa = NLMSG_DATA(n); 1284 1285 printf("if%d:\n", ifa->ifa_index); 1286 print_addrinfo(NULL, n, stdout); 1287 return 0; 1288 } 1289 1290 static int ipaddr_showdump(void) 1291 { 1292 if (ipadd_dump_check_magic()) 1293 exit(-1); 1294 1295 exit(rtnl_from_file(stdin, &show_handler, NULL)); 1296 } 1297 1298 static int restore_handler(const struct sockaddr_nl *nl, 1299 struct rtnl_ctrl_data *ctrl, 1300 struct nlmsghdr *n, void *arg) 1301 { 1302 int ret; 1303 1304 n->nlmsg_flags |= NLM_F_REQUEST | NLM_F_CREATE | NLM_F_ACK; 1305 1306 ll_init_map(&rth); 1307 1308 ret = rtnl_talk(&rth, n, n, sizeof(*n)); 1309 if ((ret < 0) && (errno == EEXIST)) 1310 ret = 0; 1311 1312 return ret; 1313 } 1314 1315 static int ipaddr_restore(void) 1316 { 1317 if (ipadd_dump_check_magic()) 1318 exit(-1); 1319 1320 exit(rtnl_from_file(stdin, &restore_handler, NULL)); 1321 } 1322 1323 static void free_nlmsg_chain(struct nlmsg_chain *info) 1324 { 1325 struct nlmsg_list *l, *n; 1326 1327 for (l = info->head; l; l = n) { 1328 n = l->next; 1329 free(l); 1330 } 1331 } 1332 1333 static void ipaddr_filter(struct nlmsg_chain *linfo, struct nlmsg_chain *ainfo) 1334 { 1335 struct nlmsg_list *l, **lp; 1336 1337 lp = &linfo->head; 1338 while ( (l = *lp) != NULL) { 1339 int ok = 0; 1340 int missing_net_address = 1; 1341 struct ifinfomsg *ifi = NLMSG_DATA(&l->h); 1342 struct nlmsg_list *a; 1343 1344 for (a = ainfo->head; a; a = a->next) { 1345 struct nlmsghdr *n = &a->h; 1346 struct ifaddrmsg *ifa = NLMSG_DATA(n); 1347 struct rtattr *tb[IFA_MAX + 1]; 1348 unsigned int ifa_flags; 1349 1350 if (ifa->ifa_index != ifi->ifi_index) 1351 continue; 1352 missing_net_address = 0; 1353 if (filter.family && filter.family != ifa->ifa_family) 1354 continue; 1355 if ((filter.scope^ifa->ifa_scope)&filter.scopemask) 1356 continue; 1357 1358 parse_rtattr(tb, IFA_MAX, IFA_RTA(ifa), IFA_PAYLOAD(n)); 1359 ifa_flags = get_ifa_flags(ifa, tb[IFA_FLAGS]); 1360 1361 if ((filter.flags ^ ifa_flags) & filter.flagmask) 1362 continue; 1363 if (filter.pfx.family || filter.label) { 1364 if (!tb[IFA_LOCAL]) 1365 tb[IFA_LOCAL] = tb[IFA_ADDRESS]; 1366 1367 if (filter.pfx.family && tb[IFA_LOCAL]) { 1368 inet_prefix dst; 1369 memset(&dst, 0, sizeof(dst)); 1370 dst.family = ifa->ifa_family; 1371 memcpy(&dst.data, RTA_DATA(tb[IFA_LOCAL]), RTA_PAYLOAD(tb[IFA_LOCAL])); 1372 if (inet_addr_match(&dst, &filter.pfx, filter.pfx.bitlen)) 1373 continue; 1374 } 1375 if (filter.label) { 1376 SPRINT_BUF(b1); 1377 const char *label; 1378 if (tb[IFA_LABEL]) 1379 label = RTA_DATA(tb[IFA_LABEL]); 1380 else 1381 label = ll_idx_n2a(ifa->ifa_index, b1); 1382 if (fnmatch(filter.label, label, 0) != 0) 1383 continue; 1384 } 1385 } 1386 1387 ok = 1; 1388 break; 1389 } 1390 if (missing_net_address && 1391 (filter.family == AF_UNSPEC || filter.family == AF_PACKET)) 1392 ok = 1; 1393 if (!ok) { 1394 *lp = l->next; 1395 free(l); 1396 } else 1397 lp = &l->next; 1398 } 1399 } 1400 1401 static int ipaddr_flush(void) 1402 { 1403 int round = 0; 1404 char flushb[4096-512]; 1405 1406 filter.flushb = flushb; 1407 filter.flushp = 0; 1408 filter.flushe = sizeof(flushb); 1409 1410 while ((max_flush_loops == 0) || (round < max_flush_loops)) { 1411 if (rtnl_wilddump_request(&rth, filter.family, RTM_GETADDR) < 0) { 1412 perror("Cannot send dump request"); 1413 exit(1); 1414 } 1415 filter.flushed = 0; 1416 if (rtnl_dump_filter_nc(&rth, print_addrinfo, 1417 stdout, NLM_F_DUMP_INTR) < 0) { 1418 fprintf(stderr, "Flush terminated\n"); 1419 exit(1); 1420 } 1421 if (filter.flushed == 0) { 1422 flush_done: 1423 if (show_stats) { 1424 if (round == 0) 1425 printf("Nothing to flush.\n"); 1426 else 1427 printf("*** Flush is complete after %d round%s ***\n", round, round>1?"s":""); 1428 } 1429 fflush(stdout); 1430 return 0; 1431 } 1432 round++; 1433 if (flush_update() < 0) 1434 return 1; 1435 1436 if (show_stats) { 1437 printf("\n*** Round %d, deleting %d addresses ***\n", round, filter.flushed); 1438 fflush(stdout); 1439 } 1440 1441 /* If we are flushing, and specifying primary, then we 1442 * want to flush only a single round. Otherwise, we'll 1443 * start flushing secondaries that were promoted to 1444 * primaries. 1445 */ 1446 if (!(filter.flags & IFA_F_SECONDARY) && (filter.flagmask & IFA_F_SECONDARY)) 1447 goto flush_done; 1448 } 1449 fprintf(stderr, "*** Flush remains incomplete after %d rounds. ***\n", max_flush_loops); 1450 fflush(stderr); 1451 return 1; 1452 } 1453 1454 static int ipaddr_list_flush_or_save(int argc, char **argv, int action) 1455 { 1456 struct nlmsg_chain linfo = { NULL, NULL}; 1457 struct nlmsg_chain ainfo = { NULL, NULL}; 1458 struct nlmsg_list *l; 1459 char *filter_dev = NULL; 1460 int no_link = 0; 1461 1462 ipaddr_reset_filter(oneline, 0); 1463 filter.showqueue = 1; 1464 filter.family = preferred_family; 1465 filter.group = -1; 1466 1467 if (action == IPADD_FLUSH) { 1468 if (argc <= 0) { 1469 fprintf(stderr, "Flush requires arguments.\n"); 1470 1471 return -1; 1472 } 1473 if (filter.family == AF_PACKET) { 1474 fprintf(stderr, "Cannot flush link addresses.\n"); 1475 return -1; 1476 } 1477 } 1478 1479 while (argc > 0) { 1480 if (strcmp(*argv, "to") == 0) { 1481 NEXT_ARG(); 1482 get_prefix(&filter.pfx, *argv, filter.family); 1483 if (filter.family == AF_UNSPEC) 1484 filter.family = filter.pfx.family; 1485 } else if (strcmp(*argv, "scope") == 0) { 1486 unsigned scope = 0; 1487 NEXT_ARG(); 1488 filter.scopemask = -1; 1489 if (rtnl_rtscope_a2n(&scope, *argv)) { 1490 if (strcmp(*argv, "all") != 0) 1491 invarg("invalid \"scope\"\n", *argv); 1492 scope = RT_SCOPE_NOWHERE; 1493 filter.scopemask = 0; 1494 } 1495 filter.scope = scope; 1496 } else if (strcmp(*argv, "up") == 0) { 1497 filter.up = 1; 1498 } else if (strcmp(*argv, "dynamic") == 0) { 1499 filter.flags &= ~IFA_F_PERMANENT; 1500 filter.flagmask |= IFA_F_PERMANENT; 1501 } else if (strcmp(*argv, "permanent") == 0) { 1502 filter.flags |= IFA_F_PERMANENT; 1503 filter.flagmask |= IFA_F_PERMANENT; 1504 } else if (strcmp(*argv, "secondary") == 0 || 1505 strcmp(*argv, "temporary") == 0) { 1506 filter.flags |= IFA_F_SECONDARY; 1507 filter.flagmask |= IFA_F_SECONDARY; 1508 } else if (strcmp(*argv, "primary") == 0) { 1509 filter.flags &= ~IFA_F_SECONDARY; 1510 filter.flagmask |= IFA_F_SECONDARY; 1511 } else if (strcmp(*argv, "tentative") == 0) { 1512 filter.flags |= IFA_F_TENTATIVE; 1513 filter.flagmask |= IFA_F_TENTATIVE; 1514 } else if (strcmp(*argv, "-tentative") == 0) { 1515 filter.flags &= ~IFA_F_TENTATIVE; 1516 filter.flagmask |= IFA_F_TENTATIVE; 1517 } else if (strcmp(*argv, "deprecated") == 0) { 1518 filter.flags |= IFA_F_DEPRECATED; 1519 filter.flagmask |= IFA_F_DEPRECATED; 1520 } else if (strcmp(*argv, "-deprecated") == 0) { 1521 filter.flags &= ~IFA_F_DEPRECATED; 1522 filter.flagmask |= IFA_F_DEPRECATED; 1523 } else if (strcmp(*argv, "home") == 0) { 1524 filter.flags |= IFA_F_HOMEADDRESS; 1525 filter.flagmask |= IFA_F_HOMEADDRESS; 1526 } else if (strcmp(*argv, "nodad") == 0) { 1527 filter.flags |= IFA_F_NODAD; 1528 filter.flagmask |= IFA_F_NODAD; 1529 } else if (strcmp(*argv, "mngtmpaddr") == 0) { 1530 filter.flags |= IFA_F_MANAGETEMPADDR; 1531 filter.flagmask |= IFA_F_MANAGETEMPADDR; 1532 } else if (strcmp(*argv, "noprefixroute") == 0) { 1533 filter.flags |= IFA_F_NOPREFIXROUTE; 1534 filter.flagmask |= IFA_F_NOPREFIXROUTE; 1535 } else if (strcmp(*argv, "autojoin") == 0) { 1536 filter.flags |= IFA_F_MCAUTOJOIN; 1537 filter.flagmask |= IFA_F_MCAUTOJOIN; 1538 } else if (strcmp(*argv, "dadfailed") == 0) { 1539 filter.flags |= IFA_F_DADFAILED; 1540 filter.flagmask |= IFA_F_DADFAILED; 1541 } else if (strcmp(*argv, "-dadfailed") == 0) { 1542 filter.flags &= ~IFA_F_DADFAILED; 1543 filter.flagmask |= IFA_F_DADFAILED; 1544 } else if (strcmp(*argv, "label") == 0) { 1545 NEXT_ARG(); 1546 filter.label = *argv; 1547 } else if (strcmp(*argv, "group") == 0) { 1548 NEXT_ARG(); 1549 if (rtnl_group_a2n(&filter.group, *argv)) 1550 invarg("Invalid \"group\" value\n", *argv); 1551 } else if (strcmp(*argv, "master") == 0) { 1552 int ifindex; 1553 NEXT_ARG(); 1554 ifindex = ll_name_to_index(*argv); 1555 if (!ifindex) 1556 invarg("Device does not exist\n", *argv); 1557 filter.master = ifindex; 1558 } else if (do_link && strcmp(*argv, "type") == 0) { 1559 NEXT_ARG(); 1560 filter.kind = *argv; 1561 } else { 1562 if (strcmp(*argv, "dev") == 0) { 1563 NEXT_ARG(); 1564 } 1565 else if (matches(*argv, "help") == 0) 1566 usage(); 1567 if (filter_dev) 1568 duparg2("dev", *argv); 1569 filter_dev = *argv; 1570 } 1571 argv++; argc--; 1572 } 1573 1574 if (filter_dev) { 1575 filter.ifindex = ll_name_to_index(filter_dev); 1576 if (filter.ifindex <= 0) { 1577 fprintf(stderr, "Device \"%s\" does not exist.\n", filter_dev); 1578 return -1; 1579 } 1580 } 1581 1582 if (action == IPADD_FLUSH) 1583 return ipaddr_flush(); 1584 1585 if (action == IPADD_SAVE) { 1586 if (ipadd_save_prep()) 1587 exit(1); 1588 1589 if (rtnl_wilddump_request(&rth, preferred_family, RTM_GETADDR) < 0) { 1590 perror("Cannot send dump request"); 1591 exit(1); 1592 } 1593 1594 if (rtnl_dump_filter(&rth, save_nlmsg, stdout) < 0) { 1595 fprintf(stderr, "Save terminated\n"); 1596 exit(1); 1597 } 1598 1599 exit(0); 1600 } 1601 1602 /* 1603 * If only filter_dev present and none of the other 1604 * link filters are present, use RTM_GETLINK to get 1605 * the link device 1606 */ 1607 if (filter_dev && filter.group == -1 && do_link == 1) { 1608 if (iplink_get(0, filter_dev, RTEXT_FILTER_VF) < 0) { 1609 perror("Cannot send link get request"); 1610 exit(1); 1611 } 1612 exit(0); 1613 } 1614 1615 if (rtnl_wilddump_request(&rth, preferred_family, RTM_GETLINK) < 0) { 1616 perror("Cannot send dump request"); 1617 exit(1); 1618 } 1619 1620 if (rtnl_dump_filter(&rth, store_nlmsg, &linfo) < 0) { 1621 fprintf(stderr, "Dump terminated\n"); 1622 exit(1); 1623 } 1624 1625 if (filter.family != AF_PACKET) { 1626 if (filter.oneline) 1627 no_link = 1; 1628 1629 if (rtnl_wilddump_request(&rth, filter.family, RTM_GETADDR) < 0) { 1630 perror("Cannot send dump request"); 1631 exit(1); 1632 } 1633 1634 if (rtnl_dump_filter(&rth, store_nlmsg, &ainfo) < 0) { 1635 fprintf(stderr, "Dump terminated\n"); 1636 exit(1); 1637 } 1638 1639 ipaddr_filter(&linfo, &ainfo); 1640 } 1641 1642 for (l = linfo.head; l; l = l->next) { 1643 int res = 0; 1644 struct ifinfomsg *ifi = NLMSG_DATA(&l->h); 1645 1646 if (brief) { 1647 if (print_linkinfo_brief(NULL, &l->h, stdout) == 0) 1648 if (filter.family != AF_PACKET) 1649 print_selected_addrinfo(ifi, 1650 ainfo.head, 1651 stdout); 1652 } else if (no_link || 1653 (res = print_linkinfo(NULL, &l->h, stdout)) >= 0) { 1654 if (filter.family != AF_PACKET) 1655 print_selected_addrinfo(ifi, 1656 ainfo.head, stdout); 1657 if (res > 0 && !do_link && show_stats) 1658 print_link_stats(stdout, &l->h); 1659 } 1660 } 1661 fflush(stdout); 1662 1663 free_nlmsg_chain(&ainfo); 1664 free_nlmsg_chain(&linfo); 1665 1666 return 0; 1667 } 1668 1669 static void 1670 ipaddr_loop_each_vf(struct rtattr *tb[], int vfnum, int *min, int *max) 1671 { 1672 struct rtattr *vflist = tb[IFLA_VFINFO_LIST]; 1673 struct rtattr *i, *vf[IFLA_VF_MAX+1]; 1674 struct ifla_vf_rate *vf_rate; 1675 int rem; 1676 1677 rem = RTA_PAYLOAD(vflist); 1678 1679 for (i = RTA_DATA(vflist); RTA_OK(i, rem); i = RTA_NEXT(i, rem)) { 1680 parse_rtattr_nested(vf, IFLA_VF_MAX, i); 1681 vf_rate = RTA_DATA(vf[IFLA_VF_RATE]); 1682 if (vf_rate->vf == vfnum) { 1683 *min = vf_rate->min_tx_rate; 1684 *max = vf_rate->max_tx_rate; 1685 return; 1686 } 1687 } 1688 fprintf(stderr, "Cannot find VF %d\n", vfnum); 1689 exit(1); 1690 } 1691 1692 void ipaddr_get_vf_rate(int vfnum, int *min, int *max, int idx) 1693 { 1694 struct nlmsg_chain linfo = { NULL, NULL}; 1695 struct rtattr *tb[IFLA_MAX+1]; 1696 struct ifinfomsg *ifi; 1697 struct nlmsg_list *l; 1698 struct nlmsghdr *n; 1699 int len; 1700 1701 if (rtnl_wilddump_request(&rth, AF_UNSPEC, RTM_GETLINK) < 0) { 1702 perror("Cannot send dump request"); 1703 exit(1); 1704 } 1705 if (rtnl_dump_filter(&rth, store_nlmsg, &linfo) < 0) { 1706 fprintf(stderr, "Dump terminated\n"); 1707 exit(1); 1708 } 1709 for (l = linfo.head; l; l = l->next) { 1710 n = &l->h; 1711 ifi = NLMSG_DATA(n); 1712 1713 len = n->nlmsg_len - NLMSG_LENGTH(sizeof(*ifi)); 1714 if (len < 0 || (idx && idx != ifi->ifi_index)) 1715 continue; 1716 1717 parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len); 1718 1719 if ((tb[IFLA_VFINFO_LIST] && tb[IFLA_NUM_VF])) { 1720 ipaddr_loop_each_vf(tb, vfnum, min, max); 1721 return; 1722 } 1723 } 1724 } 1725 1726 int ipaddr_list_link(int argc, char **argv) 1727 { 1728 preferred_family = AF_PACKET; 1729 do_link = 1; 1730 return ipaddr_list_flush_or_save(argc, argv, IPADD_LIST); 1731 } 1732 1733 void ipaddr_reset_filter(int oneline, int ifindex) 1734 { 1735 memset(&filter, 0, sizeof(filter)); 1736 filter.oneline = oneline; 1737 filter.ifindex = ifindex; 1738 } 1739 1740 static int default_scope(inet_prefix *lcl) 1741 { 1742 if (lcl->family == AF_INET) { 1743 if (lcl->bytelen >= 1 && *(__u8*)&lcl->data == 127) 1744 return RT_SCOPE_HOST; 1745 } 1746 return 0; 1747 } 1748 1749 static bool ipaddr_is_multicast(inet_prefix *a) 1750 { 1751 if (a->family == AF_INET) 1752 return IN_MULTICAST(ntohl(a->data[0])); 1753 else if (a->family == AF_INET6) 1754 return IN6_IS_ADDR_MULTICAST(a->data); 1755 else 1756 return false; 1757 } 1758 1759 static int ipaddr_modify(int cmd, int flags, int argc, char **argv) 1760 { 1761 struct { 1762 struct nlmsghdr n; 1763 struct ifaddrmsg ifa; 1764 char buf[256]; 1765 } req; 1766 char *d = NULL; 1767 char *l = NULL; 1768 char *lcl_arg = NULL; 1769 char *valid_lftp = NULL; 1770 char *preferred_lftp = NULL; 1771 inet_prefix lcl; 1772 inet_prefix peer; 1773 int local_len = 0; 1774 int peer_len = 0; 1775 int brd_len = 0; 1776 int any_len = 0; 1777 int scoped = 0; 1778 __u32 preferred_lft = INFINITY_LIFE_TIME; 1779 __u32 valid_lft = INFINITY_LIFE_TIME; 1780 struct ifa_cacheinfo cinfo; 1781 unsigned int ifa_flags = 0; 1782 1783 memset(&req, 0, sizeof(req)); 1784 1785 req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg)); 1786 req.n.nlmsg_flags = NLM_F_REQUEST | flags; 1787 req.n.nlmsg_type = cmd; 1788 req.ifa.ifa_family = preferred_family; 1789 1790 while (argc > 0) { 1791 if (strcmp(*argv, "peer") == 0 || 1792 strcmp(*argv, "remote") == 0) { 1793 NEXT_ARG(); 1794 1795 if (peer_len) 1796 duparg("peer", *argv); 1797 get_prefix(&peer, *argv, req.ifa.ifa_family); 1798 peer_len = peer.bytelen; 1799 if (req.ifa.ifa_family == AF_UNSPEC) 1800 req.ifa.ifa_family = peer.family; 1801 addattr_l(&req.n, sizeof(req), IFA_ADDRESS, &peer.data, peer.bytelen); 1802 req.ifa.ifa_prefixlen = peer.bitlen; 1803 } else if (matches(*argv, "broadcast") == 0 || 1804 strcmp(*argv, "brd") == 0) { 1805 inet_prefix addr; 1806 NEXT_ARG(); 1807 if (brd_len) 1808 duparg("broadcast", *argv); 1809 if (strcmp(*argv, "+") == 0) 1810 brd_len = -1; 1811 else if (strcmp(*argv, "-") == 0) 1812 brd_len = -2; 1813 else { 1814 get_addr(&addr, *argv, req.ifa.ifa_family); 1815 if (req.ifa.ifa_family == AF_UNSPEC) 1816 req.ifa.ifa_family = addr.family; 1817 addattr_l(&req.n, sizeof(req), IFA_BROADCAST, &addr.data, addr.bytelen); 1818 brd_len = addr.bytelen; 1819 } 1820 } else if (strcmp(*argv, "anycast") == 0) { 1821 inet_prefix addr; 1822 NEXT_ARG(); 1823 if (any_len) 1824 duparg("anycast", *argv); 1825 get_addr(&addr, *argv, req.ifa.ifa_family); 1826 if (req.ifa.ifa_family == AF_UNSPEC) 1827 req.ifa.ifa_family = addr.family; 1828 addattr_l(&req.n, sizeof(req), IFA_ANYCAST, &addr.data, addr.bytelen); 1829 any_len = addr.bytelen; 1830 } else if (strcmp(*argv, "scope") == 0) { 1831 unsigned scope = 0; 1832 NEXT_ARG(); 1833 if (rtnl_rtscope_a2n(&scope, *argv)) 1834 invarg("invalid scope value.", *argv); 1835 req.ifa.ifa_scope = scope; 1836 scoped = 1; 1837 } else if (strcmp(*argv, "dev") == 0) { 1838 NEXT_ARG(); 1839 d = *argv; 1840 } else if (strcmp(*argv, "label") == 0) { 1841 NEXT_ARG(); 1842 l = *argv; 1843 addattr_l(&req.n, sizeof(req), IFA_LABEL, l, strlen(l)+1); 1844 } else if (matches(*argv, "valid_lft") == 0) { 1845 if (valid_lftp) 1846 duparg("valid_lft", *argv); 1847 NEXT_ARG(); 1848 valid_lftp = *argv; 1849 if (set_lifetime(&valid_lft, *argv)) 1850 invarg("valid_lft value", *argv); 1851 } else if (matches(*argv, "preferred_lft") == 0) { 1852 if (preferred_lftp) 1853 duparg("preferred_lft", *argv); 1854 NEXT_ARG(); 1855 preferred_lftp = *argv; 1856 if (set_lifetime(&preferred_lft, *argv)) 1857 invarg("preferred_lft value", *argv); 1858 } else if (strcmp(*argv, "home") == 0) { 1859 ifa_flags |= IFA_F_HOMEADDRESS; 1860 } else if (strcmp(*argv, "nodad") == 0) { 1861 ifa_flags |= IFA_F_NODAD; 1862 } else if (strcmp(*argv, "mngtmpaddr") == 0) { 1863 ifa_flags |= IFA_F_MANAGETEMPADDR; 1864 } else if (strcmp(*argv, "noprefixroute") == 0) { 1865 ifa_flags |= IFA_F_NOPREFIXROUTE; 1866 } else if (strcmp(*argv, "autojoin") == 0) { 1867 ifa_flags |= IFA_F_MCAUTOJOIN; 1868 } else { 1869 if (strcmp(*argv, "local") == 0) { 1870 NEXT_ARG(); 1871 } 1872 if (matches(*argv, "help") == 0) 1873 usage(); 1874 if (local_len) 1875 duparg2("local", *argv); 1876 lcl_arg = *argv; 1877 get_prefix(&lcl, *argv, req.ifa.ifa_family); 1878 if (req.ifa.ifa_family == AF_UNSPEC) 1879 req.ifa.ifa_family = lcl.family; 1880 addattr_l(&req.n, sizeof(req), IFA_LOCAL, &lcl.data, lcl.bytelen); 1881 local_len = lcl.bytelen; 1882 } 1883 argc--; argv++; 1884 } 1885 if (ifa_flags <= 0xff) 1886 req.ifa.ifa_flags = ifa_flags; 1887 else 1888 addattr32(&req.n, sizeof(req), IFA_FLAGS, ifa_flags); 1889 1890 if (d == NULL) { 1891 fprintf(stderr, "Not enough information: \"dev\" argument is required.\n"); 1892 return -1; 1893 } 1894 if (l && matches(d, l) != 0) { 1895 fprintf(stderr, "\"dev\" (%s) must match \"label\" (%s).\n", d, l); 1896 return -1; 1897 } 1898 1899 if (peer_len == 0 && local_len) { 1900 if (cmd == RTM_DELADDR && lcl.family == AF_INET && !(lcl.flags & PREFIXLEN_SPECIFIED)) { 1901 fprintf(stderr, 1902 "Warning: Executing wildcard deletion to stay compatible with old scripts.\n" \ 1903 " Explicitly specify the prefix length (%s/%d) to avoid this warning.\n" \ 1904 " This special behaviour is likely to disappear in further releases,\n" \ 1905 " fix your scripts!\n", lcl_arg, local_len*8); 1906 } else { 1907 peer = lcl; 1908 addattr_l(&req.n, sizeof(req), IFA_ADDRESS, &lcl.data, lcl.bytelen); 1909 } 1910 } 1911 if (req.ifa.ifa_prefixlen == 0) 1912 req.ifa.ifa_prefixlen = lcl.bitlen; 1913 1914 if (brd_len < 0 && cmd != RTM_DELADDR) { 1915 inet_prefix brd; 1916 int i; 1917 if (req.ifa.ifa_family != AF_INET) { 1918 fprintf(stderr, "Broadcast can be set only for IPv4 addresses\n"); 1919 return -1; 1920 } 1921 brd = peer; 1922 if (brd.bitlen <= 30) { 1923 for (i = 31; i >= brd.bitlen; i--) { 1924 if (brd_len == -1) 1925 brd.data[0] |= htonl(1<<(31-i)); 1926 else 1927 brd.data[0] &= ~htonl(1<<(31-i)); 1928 } 1929 addattr_l(&req.n, sizeof(req), IFA_BROADCAST, &brd.data, brd.bytelen); 1930 brd_len = brd.bytelen; 1931 } 1932 } 1933 if (!scoped && cmd != RTM_DELADDR) 1934 req.ifa.ifa_scope = default_scope(&lcl); 1935 1936 if ((req.ifa.ifa_index = ll_name_to_index(d)) == 0) { 1937 fprintf(stderr, "Cannot find device \"%s\"\n", d); 1938 return -1; 1939 } 1940 1941 if (valid_lftp || preferred_lftp) { 1942 if (!valid_lft) { 1943 fprintf(stderr, "valid_lft is zero\n"); 1944 return -1; 1945 } 1946 if (valid_lft < preferred_lft) { 1947 fprintf(stderr, "preferred_lft is greater than valid_lft\n"); 1948 return -1; 1949 } 1950 1951 memset(&cinfo, 0, sizeof(cinfo)); 1952 cinfo.ifa_prefered = preferred_lft; 1953 cinfo.ifa_valid = valid_lft; 1954 addattr_l(&req.n, sizeof(req), IFA_CACHEINFO, &cinfo, 1955 sizeof(cinfo)); 1956 } 1957 1958 if ((ifa_flags & IFA_F_MCAUTOJOIN) && !ipaddr_is_multicast(&lcl)) { 1959 fprintf(stderr, "autojoin needs multicast address\n"); 1960 return -1; 1961 } 1962 1963 if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) 1964 return -2; 1965 1966 return 0; 1967 } 1968 1969 int do_ipaddr(int argc, char **argv) 1970 { 1971 if (argc < 1) 1972 return ipaddr_list_flush_or_save(0, NULL, IPADD_LIST); 1973 if (matches(*argv, "add") == 0) 1974 return ipaddr_modify(RTM_NEWADDR, NLM_F_CREATE|NLM_F_EXCL, argc-1, argv+1); 1975 if (matches(*argv, "change") == 0 || 1976 strcmp(*argv, "chg") == 0) 1977 return ipaddr_modify(RTM_NEWADDR, NLM_F_REPLACE, argc-1, argv+1); 1978 if (matches(*argv, "replace") == 0) 1979 return ipaddr_modify(RTM_NEWADDR, NLM_F_CREATE|NLM_F_REPLACE, argc-1, argv+1); 1980 if (matches(*argv, "delete") == 0) 1981 return ipaddr_modify(RTM_DELADDR, 0, argc-1, argv+1); 1982 if (matches(*argv, "list") == 0 || matches(*argv, "show") == 0 1983 || matches(*argv, "lst") == 0) 1984 return ipaddr_list_flush_or_save(argc-1, argv+1, IPADD_LIST); 1985 if (matches(*argv, "flush") == 0) 1986 return ipaddr_list_flush_or_save(argc-1, argv+1, IPADD_FLUSH); 1987 if (matches(*argv, "save") == 0) 1988 return ipaddr_list_flush_or_save(argc-1, argv+1, IPADD_SAVE); 1989 if (matches(*argv, "showdump") == 0) 1990 return ipaddr_showdump(); 1991 if (matches(*argv, "restore") == 0) 1992 return ipaddr_restore(); 1993 if (matches(*argv, "help") == 0) 1994 usage(); 1995 fprintf(stderr, "Command \"%s\" is unknown, try \"ip address help\".\n", *argv); 1996 exit(-1); 1997 } 1998