1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger/* 2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * ipneigh.c "ip neigh". 3aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 4aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * This program is free software; you can redistribute it and/or 5aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * modify it under the terms of the GNU General Public License 6aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * as published by the Free Software Foundation; either version 7aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 2 of the License, or (at your option) any later version. 8aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 9aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 10aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 11aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger */ 12aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 13aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <stdio.h> 14aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <stdlib.h> 15aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <unistd.h> 16aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <syslog.h> 17aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <fcntl.h> 18aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <string.h> 19aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/time.h> 20aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/socket.h> 21aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <netinet/in.h> 22aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <netinet/ip.h> 23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "rt_names.h" 25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "utils.h" 26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "ip_common.h" 27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 28aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define NUD_VALID (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_STALE|NUD_DELAY) 29660818498d0f5a3f52c05355a3e82c23f670fcc1shemminger#define MAX_ROUNDS 10 30aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 31aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic struct 32aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 33aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int family; 34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int index; 35aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int state; 36aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int unused_only; 37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger inet_prefix pfx; 38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int flushed; 39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *flushb; 40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int flushp; 41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int flushe; 42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} filter; 43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void usage(void) __attribute__((noreturn)); 45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void usage(void) 47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Usage: ip neigh { add | del | change | replace } { ADDR [ lladdr LLADDR ]\n" 49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger " [ nud { permanent | noarp | stale | reachable } ]\n" 50aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger " | proxy ADDR } [ dev DEV ]\n"); 51aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, " ip neigh {show|flush} [ to PREFIX ] [ dev DEV ] [ nud STATE ]\n"); 52aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger exit(-1); 53aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 54aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 55aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint nud_state_a2n(unsigned *state, char *arg) 56aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 57aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(arg, "permanent") == 0) 58aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *state = NUD_PERMANENT; 59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (matches(arg, "reachable") == 0) 60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *state = NUD_REACHABLE; 61aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcmp(arg, "noarp") == 0) 62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *state = NUD_NOARP; 63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcmp(arg, "none") == 0) 64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *state = NUD_NONE; 65aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcmp(arg, "stale") == 0) 66aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *state = NUD_STALE; 67aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcmp(arg, "incomplete") == 0) 68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *state = NUD_INCOMPLETE; 69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcmp(arg, "delay") == 0) 70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *state = NUD_DELAY; 71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcmp(arg, "probe") == 0) 72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *state = NUD_PROBE; 73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (matches(arg, "failed") == 0) 74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *state = NUD_FAILED; 75aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else { 76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_unsigned(state, arg, 0)) 77aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 78aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*state>=0x100 || (*state&((*state)-1))) 79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 81aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 82aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int flush_update(void) 85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 86f31a37f79d1f33d4d0d6a18f3768bfee27e8b6ccStephen Hemminger if (rtnl_send_check(&rth, filter.flushb, filter.flushp) < 0) { 871fb0a998e1a8cb26a1f7fe1f79e2e3654aafdc93Stephen Hemminger perror("Failed to send flush request"); 88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.flushp = 0; 91aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int ipneigh_modify(int cmd, int flags, int argc, char **argv) 96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct { 98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct nlmsghdr n; 99aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct ndmsg ndm; 100aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char buf[256]; 101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } req; 102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *d = NULL; 103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int dst_ok = 0; 104aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int lladdr_ok = 0; 105aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char * lla = NULL; 106aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger inet_prefix dst; 107aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 108aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(&req, 0, sizeof(req)); 109aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 110aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg)); 111aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.n.nlmsg_flags = NLM_F_REQUEST|flags; 112aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.n.nlmsg_type = cmd; 113aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.ndm.ndm_family = preferred_family; 114aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.ndm.ndm_state = NUD_PERMANENT; 115aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 116aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger while (argc > 0) { 117aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "lladdr") == 0) { 118aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 119aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (lladdr_ok) 120aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger duparg("lladdr", *argv); 121aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger lla = *argv; 122aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger lladdr_ok = 1; 123aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "nud") == 0) { 124aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger unsigned state; 125aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 126aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (nud_state_a2n(&state, *argv)) 127aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger invarg("nud state is bad", *argv); 128aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.ndm.ndm_state = state; 129aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "proxy") == 0) { 130aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 131aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "help") == 0) 132aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger usage(); 133aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (dst_ok) 134aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger duparg("address", *argv); 135aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger get_addr(&dst, *argv, preferred_family); 136aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger dst_ok = 1; 137aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.ndm.ndm_flags |= NTF_PROXY; 138aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "dev") == 0) { 139aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 140aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger d = *argv; 141aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else { 142aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "to") == 0) { 143aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 144aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 145aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "help") == 0) { 146aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 147aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 148aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (dst_ok) 149aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger duparg2("to", *argv); 150aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger get_addr(&dst, *argv, preferred_family); 151aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger dst_ok = 1; 152aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 153aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 154aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 155aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (d == NULL || !dst_ok || dst.family == AF_UNSPEC) { 156aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Device and destination are required arguments.\n"); 157aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger exit(-1); 158aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 159aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.ndm.ndm_family = dst.family; 160aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger addattr_l(&req.n, sizeof(req), NDA_DST, &dst.data, dst.bytelen); 161aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 162aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (lla && strcmp(lla, "null")) { 1637b5657545dc246ae37690d660597e8fa37040205shemminger char llabuf[20]; 164aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int l; 165aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 166aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger l = ll_addr_a2n(llabuf, sizeof(llabuf), lla); 167aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger addattr_l(&req.n, sizeof(req), NDA_LLADDR, llabuf, l); 168aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 169aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 170aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ll_init_map(&rth); 171aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 172aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if ((req.ndm.ndm_ifindex = ll_name_to_index(d)) == 0) { 173aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Cannot find device \"%s\"\n", d); 174aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 175aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 176aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 177cd70f3f522e04b4d2fa80ae10292379bf223a53bStephen Hemminger if (rtnl_talk(&rth, &req.n, 0, 0, NULL) < 0) 178aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger exit(2); 179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 180351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger return 0; 181aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 183aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 18450772dc51ac02239958e1ebcdb21277fcdf133a7osdl.net!shemmingerint print_neigh(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) 185aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 186aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger FILE *fp = (FILE*)arg; 187aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct ndmsg *r = NLMSG_DATA(n); 188aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int len = n->nlmsg_len; 189aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct rtattr * tb[NDA_MAX+1]; 190aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char abuf[256]; 191aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 192aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (n->nlmsg_type != RTM_NEWNEIGH && n->nlmsg_type != RTM_DELNEIGH) { 193aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Not RTM_NEWNEIGH: %08x %08x %08x\n", 194aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger n->nlmsg_len, n->nlmsg_type, n->nlmsg_flags); 195ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger 196aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 197aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 198aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger len -= NLMSG_LENGTH(sizeof(*r)); 199aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (len < 0) { 200aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "BUG: wrong nlmsg len %d\n", len); 201aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 202aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 203aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 204aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter.flushb && n->nlmsg_type != RTM_NEWNEIGH) 205aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 206aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 207aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter.family && filter.family != r->ndm_family) 208aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter.index && filter.index != r->ndm_ifindex) 210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 211aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!(filter.state&r->ndm_state) && 2121dac7817b44f0dea2828c2b897c7b3c81550e057Tony Zelenoff !(r->ndm_flags & NTF_PROXY) && 213aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger (r->ndm_state || !(filter.state&0x100)) && 214aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger (r->ndm_family != AF_DECnet)) 215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger parse_rtattr(tb, NDA_MAX, NDA_RTA(r), n->nlmsg_len - NLMSG_LENGTH(sizeof(*r))); 218aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 219aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[NDA_DST]) { 220aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter.pfx.family) { 221aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger inet_prefix dst; 222aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(&dst, 0, sizeof(dst)); 223aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger dst.family = r->ndm_family; 224aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memcpy(&dst.data, RTA_DATA(tb[NDA_DST]), RTA_PAYLOAD(tb[NDA_DST])); 225aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (inet_addr_match(&dst, &filter.pfx, filter.pfx.bitlen)) 226aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 227aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 228aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 229aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter.unused_only && tb[NDA_CACHEINFO]) { 230aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct nda_cacheinfo *ci = RTA_DATA(tb[NDA_CACHEINFO]); 231aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (ci->ndm_refcnt) 232aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 233aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 234aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 235aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter.flushb) { 236aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct nlmsghdr *fn; 237aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (NLMSG_ALIGN(filter.flushp) + n->nlmsg_len > filter.flushe) { 238aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (flush_update()) 239aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 240aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 241aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fn = (struct nlmsghdr*)(filter.flushb + NLMSG_ALIGN(filter.flushp)); 242aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memcpy(fn, n, n->nlmsg_len); 243aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fn->nlmsg_type = RTM_DELNEIGH; 244aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fn->nlmsg_flags = NLM_F_REQUEST; 245351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger fn->nlmsg_seq = ++rth.seq; 246aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.flushp = (((char*)fn) + n->nlmsg_len) - filter.flushb; 247aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.flushed++; 248aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (show_stats < 2) 249aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 250aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 251aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 252aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[NDA_DST]) { 253ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger fprintf(fp, "%s ", 254aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger format_host(r->ndm_family, 255aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger RTA_PAYLOAD(tb[NDA_DST]), 256aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger RTA_DATA(tb[NDA_DST]), 257aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger abuf, sizeof(abuf))); 258aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 259aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!filter.index && r->ndm_ifindex) 260aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(fp, "dev %s ", ll_index_to_name(r->ndm_ifindex)); 261aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[NDA_LLADDR]) { 262aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger SPRINT_BUF(b1); 263aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(fp, "lladdr %s", ll_addr_n2a(RTA_DATA(tb[NDA_LLADDR]), 264aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger RTA_PAYLOAD(tb[NDA_LLADDR]), 265aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ll_index_to_type(r->ndm_ifindex), 266aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger b1, sizeof(b1))); 267aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 268aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (r->ndm_flags & NTF_ROUTER) { 269aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(fp, " router"); 270aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 2711dac7817b44f0dea2828c2b897c7b3c81550e057Tony Zelenoff if (r->ndm_flags & NTF_PROXY) { 2721dac7817b44f0dea2828c2b897c7b3c81550e057Tony Zelenoff fprintf(fp, " proxy"); 2731dac7817b44f0dea2828c2b897c7b3c81550e057Tony Zelenoff } 274aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[NDA_CACHEINFO] && show_stats) { 275aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct nda_cacheinfo *ci = RTA_DATA(tb[NDA_CACHEINFO]); 2766a34d291449fc799048d2d56edcbeaedf1483fb1Stephen Hemminger int hz = get_user_hz(); 2776a34d291449fc799048d2d56edcbeaedf1483fb1Stephen Hemminger 278aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (ci->ndm_refcnt) 279aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger printf(" ref %d", ci->ndm_refcnt); 280aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(fp, " used %d/%d/%d", ci->ndm_used/hz, 281aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ci->ndm_confirmed/hz, ci->ndm_updated/hz); 282aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 283aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 28469410a496b57c59b3353713dfe8ba57eaea90b79net[shemminger]!shemminger if (tb[NDA_PROBES] && show_stats) { 285ff24746cca1ef0c92d46614158e6672acd6b63d3Stephen Hemminger __u32 p = rta_getattr_u32(tb[NDA_PROBES]); 28669410a496b57c59b3353713dfe8ba57eaea90b79net[shemminger]!shemminger fprintf(fp, " probes %u", p); 28769410a496b57c59b3353713dfe8ba57eaea90b79net[shemminger]!shemminger } 28869410a496b57c59b3353713dfe8ba57eaea90b79net[shemminger]!shemminger 289aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (r->ndm_state) { 290435ac6b8b58f6eba8ba4c04f3a335a86f367a853ch[shemminger]!tgraf int nud = r->ndm_state; 291435ac6b8b58f6eba8ba4c04f3a335a86f367a853ch[shemminger]!tgraf fprintf(fp, " "); 292435ac6b8b58f6eba8ba4c04f3a335a86f367a853ch[shemminger]!tgraf 293435ac6b8b58f6eba8ba4c04f3a335a86f367a853ch[shemminger]!tgraf#define PRINT_FLAG(f) if (nud & NUD_##f) { \ 294435ac6b8b58f6eba8ba4c04f3a335a86f367a853ch[shemminger]!tgraf nud &= ~NUD_##f; fprintf(fp, #f "%s", nud ? "," : ""); } 295435ac6b8b58f6eba8ba4c04f3a335a86f367a853ch[shemminger]!tgraf PRINT_FLAG(INCOMPLETE); 296435ac6b8b58f6eba8ba4c04f3a335a86f367a853ch[shemminger]!tgraf PRINT_FLAG(REACHABLE); 297435ac6b8b58f6eba8ba4c04f3a335a86f367a853ch[shemminger]!tgraf PRINT_FLAG(STALE); 298435ac6b8b58f6eba8ba4c04f3a335a86f367a853ch[shemminger]!tgraf PRINT_FLAG(DELAY); 299435ac6b8b58f6eba8ba4c04f3a335a86f367a853ch[shemminger]!tgraf PRINT_FLAG(PROBE); 300435ac6b8b58f6eba8ba4c04f3a335a86f367a853ch[shemminger]!tgraf PRINT_FLAG(FAILED); 301435ac6b8b58f6eba8ba4c04f3a335a86f367a853ch[shemminger]!tgraf PRINT_FLAG(NOARP); 302435ac6b8b58f6eba8ba4c04f3a335a86f367a853ch[shemminger]!tgraf PRINT_FLAG(PERMANENT); 303435ac6b8b58f6eba8ba4c04f3a335a86f367a853ch[shemminger]!tgraf#undef PRINT_FLAG 304aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 305aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(fp, "\n"); 306aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 307aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fflush(fp); 308aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 309aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 310aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 311aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid ipneigh_reset_filter() 312aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 313aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(&filter, 0, sizeof(filter)); 314aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.state = ~0; 315aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 316aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 317aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint do_show_or_flush(int argc, char **argv, int flush) 318aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 319aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *filter_dev = NULL; 320aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int state_given = 0; 3211dac7817b44f0dea2828c2b897c7b3c81550e057Tony Zelenoff struct ndmsg ndm = { 0 }; 322aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 323aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ipneigh_reset_filter(); 324aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 325aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!filter.family) 326aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.family = preferred_family; 327aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 328aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (flush) { 329aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc <= 0) { 330aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Flush requires arguments.\n"); 331aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 332aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 333aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.state = ~(NUD_PERMANENT|NUD_NOARP); 334aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else 335aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.state = 0xFF & ~NUD_NOARP; 336aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 337aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger while (argc > 0) { 338aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "dev") == 0) { 339aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 340aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter_dev) 341aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger duparg("dev", *argv); 342aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter_dev = *argv; 343aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "unused") == 0) { 344aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.unused_only = 1; 345aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "nud") == 0) { 346aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger unsigned state; 347aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 348aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!state_given) { 349aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger state_given = 1; 350aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.state = 0; 351aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 352aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (nud_state_a2n(&state, *argv)) { 353aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "all") != 0) 354aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger invarg("nud state is bad", *argv); 355aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger state = ~0; 356aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (flush) 357aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger state &= ~NUD_NOARP; 358aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 359aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (state == 0) 360aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger state = 0x100; 361aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.state |= state; 3621dac7817b44f0dea2828c2b897c7b3c81550e057Tony Zelenoff } else if (strcmp(*argv, "proxy") == 0) 3631dac7817b44f0dea2828c2b897c7b3c81550e057Tony Zelenoff ndm.ndm_flags = NTF_PROXY; 3641dac7817b44f0dea2828c2b897c7b3c81550e057Tony Zelenoff else { 365aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "to") == 0) { 366aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 367aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 368aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "help") == 0) 369aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger usage(); 370aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger get_prefix(&filter.pfx, *argv, filter.family); 371aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter.family == AF_UNSPEC) 372aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.family = filter.pfx.family; 373aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 374aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 375aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 376aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 377aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ll_init_map(&rth); 378aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 379aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter_dev) { 380aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if ((filter.index = ll_name_to_index(filter_dev)) == 0) { 381aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Cannot find device \"%s\"\n", filter_dev); 382aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 383aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 384aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 385aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 386aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (flush) { 387aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int round = 0; 388aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char flushb[4096-512]; 389aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 390aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.flushb = flushb; 391aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.flushp = 0; 392aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.flushe = sizeof(flushb); 393aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.state &= ~NUD_FAILED; 394aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 395660818498d0f5a3f52c05355a3e82c23f670fcc1shemminger while (round < MAX_ROUNDS) { 396aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (rtnl_wilddump_request(&rth, filter.family, RTM_GETNEIGH) < 0) { 397aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger perror("Cannot send dump request"); 398aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger exit(1); 399aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 400aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter.flushed = 0; 401cd70f3f522e04b4d2fa80ae10292379bf223a53bStephen Hemminger if (rtnl_dump_filter(&rth, print_neigh, stdout) < 0) { 402aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Flush terminated\n"); 403aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger exit(1); 404aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 405aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter.flushed == 0) { 406f0b34d2d98ffcd135c92dcba563d4bc47632333cAndreas Henriksson if (show_stats) { 407f0b34d2d98ffcd135c92dcba563d4bc47632333cAndreas Henriksson if (round == 0) 408f0b34d2d98ffcd135c92dcba563d4bc47632333cAndreas Henriksson printf("Nothing to flush.\n"); 409f0b34d2d98ffcd135c92dcba563d4bc47632333cAndreas Henriksson else 410f0b34d2d98ffcd135c92dcba563d4bc47632333cAndreas Henriksson printf("*** Flush is complete after %d round%s ***\n", round, round>1?"s":""); 411f0b34d2d98ffcd135c92dcba563d4bc47632333cAndreas Henriksson } 412aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fflush(stdout); 413aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 414aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 415aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger round++; 416aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (flush_update() < 0) 417aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger exit(1); 418aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (show_stats) { 419aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger printf("\n*** Round %d, deleting %d entries ***\n", round, filter.flushed); 420aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fflush(stdout); 421aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 422aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 423660818498d0f5a3f52c05355a3e82c23f670fcc1shemminger printf("*** Flush not complete bailing out after %d rounds\n", 424660818498d0f5a3f52c05355a3e82c23f670fcc1shemminger MAX_ROUNDS); 425660818498d0f5a3f52c05355a3e82c23f670fcc1shemminger return 1; 426aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 427aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 4281dac7817b44f0dea2828c2b897c7b3c81550e057Tony Zelenoff ndm.ndm_family = filter.family; 4291dac7817b44f0dea2828c2b897c7b3c81550e057Tony Zelenoff 4301dac7817b44f0dea2828c2b897c7b3c81550e057Tony Zelenoff if (rtnl_dump_request(&rth, RTM_GETNEIGH, &ndm, sizeof(struct ndmsg)) < 0) { 431aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger perror("Cannot send dump request"); 432aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger exit(1); 433aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 434aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 435cd70f3f522e04b4d2fa80ae10292379bf223a53bStephen Hemminger if (rtnl_dump_filter(&rth, print_neigh, stdout) < 0) { 436aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Dump terminated\n"); 437aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger exit(1); 438aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 439aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 440aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 441aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 442aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 443aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint do_ipneigh(int argc, char **argv) 444aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 445aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc > 0) { 446aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "add") == 0) 447aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return ipneigh_modify(RTM_NEWNEIGH, NLM_F_CREATE|NLM_F_EXCL, argc-1, argv+1); 448aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "change") == 0 || 449aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcmp(*argv, "chg") == 0) 450aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return ipneigh_modify(RTM_NEWNEIGH, NLM_F_REPLACE, argc-1, argv+1); 451aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "replace") == 0) 452aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return ipneigh_modify(RTM_NEWNEIGH, NLM_F_CREATE|NLM_F_REPLACE, argc-1, argv+1); 453aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "delete") == 0) 454aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return ipneigh_modify(RTM_DELNEIGH, 0, argc-1, argv+1); 455aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "get") == 0) { 456aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Sorry, \"neigh get\" is not implemented :-(\n"); 457aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 458aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 459aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "show") == 0 || 460aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger matches(*argv, "lst") == 0 || 461aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger matches(*argv, "list") == 0) 462aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return do_show_or_flush(argc-1, argv+1, 0); 463aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "flush") == 0) 464aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return do_show_or_flush(argc-1, argv+1, 1); 465aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "help") == 0) 466aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger usage(); 467aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else 468aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return do_show_or_flush(0, NULL, 0); 469aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 470aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Command \"%s\" is unknown, try \"ip neigh help\".\n", *argv); 471aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger exit(-1); 472aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 473