1dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* 2dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Copyright (C)2006 USAGI/WIDE Project 3dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 4dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * This program is free software; you can redistribute it and/or modify 5dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * it under the terms of the GNU General Public License as published by 6dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * the Free Software Foundation; either version 2 of the License, or 7dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * (at your option) any later version. 8dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 9dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * This program is distributed in the hope that it will be useful, 10dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * but WITHOUT ANY WARRANTY; without even the implied warranty of 11dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * GNU General Public License for more details. 13dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 14dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * You should have received a copy of the GNU General Public License 15dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * along with this program; if not, write to the Free Software 16dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */ 18dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* 19dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * based on ipneigh.c 20dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */ 21dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* 22dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Authors: 23dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Masahide NAKAMURA @USAGI 24dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */ 25dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 26dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdio.h> 27dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdlib.h> 28dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <string.h> 29dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <sys/time.h> 30dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <time.h> 31dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 32dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "utils.h" 33dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "ip_common.h" 34dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 35dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic struct 36dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 37dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int family; 38dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int index; 39dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define NONE_DEV (-1) 40dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char name[1024]; 41dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} filter; 42dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 43dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void usage(void) __attribute__((noreturn)); 44dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 45dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void usage(void) 46dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 47dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, 48dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "Usage: ip ntable change name NAME [ dev DEV ]\n" 49dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat " [ thresh1 VAL ] [ thresh2 VAL ] [ thresh3 VAL ] [ gc_int MSEC ]\n" 50dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat " [ PARMS ]\n" 51dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "Usage: ip ntable show [ dev DEV ] [ name NAME ]\n" 52dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 53dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "PARMS := [ base_reachable MSEC ] [ retrans MSEC ] [ gc_stale MSEC ]\n" 54dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat " [ delay_probe MSEC ] [ queue LEN ]\n" 55dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat " [ app_probs VAL ] [ ucast_probes VAL ] [ mcast_probes VAL ]\n" 56dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat " [ anycast_delay MSEC ] [ proxy_delay MSEC ] [ proxy_queue LEN ]\n" 57dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat " [ locktime MSEC ]\n" 58dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ); 59dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 60dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat exit(-1); 61dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 62dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 63dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int ipntable_modify(int cmd, int flags, int argc, char **argv) 64dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 65dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct { 66dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct nlmsghdr n; 67dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct ndtmsg ndtm; 68dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char buf[1024]; 69dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } req; 70dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char *namep = NULL; 71dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char *threshsp = NULL; 72dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char *gc_intp = NULL; 73dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char parms_buf[1024]; 74dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct rtattr *parms_rta = (struct rtattr *)parms_buf; 75dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int parms_change = 0; 76dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 77dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat memset(&req, 0, sizeof(req)); 78dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 79dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndtmsg)); 80dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat req.n.nlmsg_flags = NLM_F_REQUEST|flags; 81dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat req.n.nlmsg_type = cmd; 82dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 83dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat req.ndtm.ndtm_family = preferred_family; 84dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat req.ndtm.ndtm_pad1 = 0; 85dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat req.ndtm.ndtm_pad2 = 0; 86dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 87dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat memset(&parms_buf, 0, sizeof(parms_buf)); 88dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 89dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_rta->rta_type = NDTA_PARMS; 90dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_rta->rta_len = RTA_LENGTH(0); 91dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 92dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat while (argc > 0) { 93dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "name") == 0) { 94dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int len; 95dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 96dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 97dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (namep) 98dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat duparg("NAME", *argv); 99dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 100dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat namep = *argv; 101dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat len = strlen(namep) + 1; 102dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr_l(&req.n, sizeof(req), NDTA_NAME, namep, len); 103dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "thresh1") == 0) { 104dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 thresh1; 105dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 106dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 107dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat threshsp = *argv; 108dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 109dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u32(&thresh1, *argv, 0)) 110dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"thresh1\" value is invalid", *argv); 111dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 112dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr32(&req.n, sizeof(req), NDTA_THRESH1, thresh1); 113dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "thresh2") == 0) { 114dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 thresh2; 115dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 116dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 117dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat threshsp = *argv; 118dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 119dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u32(&thresh2, *argv, 0)) 120dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"thresh2\" value is invalid", *argv); 121dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 122dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr32(&req.n, sizeof(req), NDTA_THRESH2, thresh2); 123dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "thresh3") == 0) { 124dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 thresh3; 125dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 126dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 127dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat threshsp = *argv; 128dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 129dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u32(&thresh3, *argv, 0)) 130dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"thresh3\" value is invalid", *argv); 131dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 132dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr32(&req.n, sizeof(req), NDTA_THRESH3, thresh3); 133dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "gc_int") == 0) { 134dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 gc_int; 135dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 136dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 137dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat gc_intp = *argv; 138dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 139dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u64(&gc_int, *argv, 0)) 140dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"gc_int\" value is invalid", *argv); 141dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 142dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr_l(&req.n, sizeof(req), NDTA_GC_INTERVAL, 143dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat &gc_int, sizeof(gc_int)); 144dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "dev") == 0) { 145dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 ifindex; 146dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 147dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 148dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ifindex = ll_name_to_index(*argv); 149dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (ifindex == 0) { 150dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Cannot find device \"%s\"\n", *argv); 151dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 152dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 153dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 154dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat rta_addattr32(parms_rta, sizeof(parms_buf), 155dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NDTPA_IFINDEX, ifindex); 156dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "base_reachable") == 0) { 157dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 breachable; 158dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 159dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 160dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 161dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u64(&breachable, *argv, 0)) 162dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"base_reachable\" value is invalid", *argv); 163dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 164dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat rta_addattr_l(parms_rta, sizeof(parms_buf), 165dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NDTPA_BASE_REACHABLE_TIME, 166dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat &breachable, sizeof(breachable)); 167dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_change = 1; 168dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "retrans") == 0) { 169dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 retrans; 170dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 171dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 172dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 173dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u64(&retrans, *argv, 0)) 174dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"retrans\" value is invalid", *argv); 175dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 176dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat rta_addattr_l(parms_rta, sizeof(parms_buf), 177dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NDTPA_RETRANS_TIME, 178dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat &retrans, sizeof(retrans)); 179dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_change = 1; 180dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "gc_stale") == 0) { 181dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 gc_stale; 182dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 183dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 184dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 185dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u64(&gc_stale, *argv, 0)) 186dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"gc_stale\" value is invalid", *argv); 187dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 188dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat rta_addattr_l(parms_rta, sizeof(parms_buf), 189dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NDTPA_GC_STALETIME, 190dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat &gc_stale, sizeof(gc_stale)); 191dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_change = 1; 192dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "delay_probe") == 0) { 193dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 delay_probe; 194dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 195dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 196dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 197dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u64(&delay_probe, *argv, 0)) 198dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"delay_probe\" value is invalid", *argv); 199dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 200dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat rta_addattr_l(parms_rta, sizeof(parms_buf), 201dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NDTPA_DELAY_PROBE_TIME, 202dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat &delay_probe, sizeof(delay_probe)); 203dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_change = 1; 204dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "queue") == 0) { 205dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 queue; 206dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 207dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 208dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 209dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u32(&queue, *argv, 0)) 210dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"queue\" value is invalid", *argv); 211dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 212dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (!parms_rta) 213dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_rta = (struct rtattr *)&parms_buf; 214dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat rta_addattr32(parms_rta, sizeof(parms_buf), 215dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NDTPA_QUEUE_LEN, queue); 216dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_change = 1; 217dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "app_probes") == 0) { 218dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 aprobe; 219dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 220dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 221dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 222dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u32(&aprobe, *argv, 0)) 223dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"app_probes\" value is invalid", *argv); 224dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 225dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat rta_addattr32(parms_rta, sizeof(parms_buf), 226dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NDTPA_APP_PROBES, aprobe); 227dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_change = 1; 228dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "ucast_probes") == 0) { 229dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 uprobe; 230dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 231dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 232dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 233dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u32(&uprobe, *argv, 0)) 234dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"ucast_probes\" value is invalid", *argv); 235dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 236dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat rta_addattr32(parms_rta, sizeof(parms_buf), 237dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NDTPA_UCAST_PROBES, uprobe); 238dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_change = 1; 239dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "mcast_probes") == 0) { 240dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 mprobe; 241dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 242dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 243dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 244dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u32(&mprobe, *argv, 0)) 245dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"mcast_probes\" value is invalid", *argv); 246dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 247dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat rta_addattr32(parms_rta, sizeof(parms_buf), 248dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NDTPA_MCAST_PROBES, mprobe); 249dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_change = 1; 250dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "anycast_delay") == 0) { 251dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 anycast_delay; 252dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 253dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 254dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 255dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u64(&anycast_delay, *argv, 0)) 256dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"anycast_delay\" value is invalid", *argv); 257dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 258dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat rta_addattr_l(parms_rta, sizeof(parms_buf), 259dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NDTPA_ANYCAST_DELAY, 260dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat &anycast_delay, sizeof(anycast_delay)); 261dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_change = 1; 262dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "proxy_delay") == 0) { 263dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 proxy_delay; 264dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 265dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 266dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 267dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u64(&proxy_delay, *argv, 0)) 268dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"proxy_delay\" value is invalid", *argv); 269dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 270dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat rta_addattr_l(parms_rta, sizeof(parms_buf), 271dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NDTPA_PROXY_DELAY, 272dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat &proxy_delay, sizeof(proxy_delay)); 273dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_change = 1; 274dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "proxy_queue") == 0) { 275dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 pqueue; 276dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 277dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 278dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 279dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u32(&pqueue, *argv, 0)) 280dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"proxy_queue\" value is invalid", *argv); 281dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 282dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat rta_addattr32(parms_rta, sizeof(parms_buf), 283dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NDTPA_PROXY_QLEN, pqueue); 284dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_change = 1; 285dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "locktime") == 0) { 286dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 locktime; 287dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 288dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 289dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 290dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u64(&locktime, *argv, 0)) 291dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"locktime\" value is invalid", *argv); 292dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 293dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat rta_addattr_l(parms_rta, sizeof(parms_buf), 294dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NDTPA_LOCKTIME, 295dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat &locktime, sizeof(locktime)); 296dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parms_change = 1; 297dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 298dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("unknown", *argv); 299dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 300dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 301dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argc--; argv++; 302dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 303dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 304dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (!namep) 305dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat missarg("NAME"); 306dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (!threshsp && !gc_intp && !parms_change) { 307dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Not enough information: changable attributes required.\n"); 308dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat exit(-1); 309dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 310dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 311dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (parms_rta->rta_len > RTA_LENGTH(0)) { 312dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr_l(&req.n, sizeof(req), NDTA_PARMS, RTA_DATA(parms_rta), 313dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat RTA_PAYLOAD(parms_rta)); 314dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 315dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 316dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL) < 0) 317dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat exit(2); 318dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 319dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 320dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 321dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 322dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic const char *ntable_strtime_delta(__u32 msec) 323dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 324dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat static char str[32]; 325dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct timeval now; 326dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat time_t t; 327dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct tm *tp; 328dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 329dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (msec == 0) 330dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto error; 331dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 332dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat memset(&now, 0, sizeof(now)); 333dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 334dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (gettimeofday(&now, NULL) < 0) { 335dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat perror("gettimeofday"); 336dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto error; 337dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 338dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 339dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat t = now.tv_sec - (msec / 1000); 340dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tp = localtime(&t); 341dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (!tp) 342dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto error; 343dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 344dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat strftime(str, sizeof(str), "%Y-%m-%d %T", tp); 345dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 346dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return str; 347dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat error: 348dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat strcpy(str, "(error)"); 349dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return str; 350dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 351dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 352dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatint print_ntable(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) 353dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 354dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat FILE *fp = (FILE*)arg; 355dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct ndtmsg *ndtm = NLMSG_DATA(n); 356dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int len = n->nlmsg_len; 357dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct rtattr *tb[NDTA_MAX+1]; 358dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct rtattr *tpb[NDTPA_MAX+1]; 359dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int ret; 360dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 361dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (n->nlmsg_type != RTM_NEWNEIGHTBL) { 362dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Not NEIGHTBL: %08x %08x %08x\n", 363dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat n->nlmsg_len, n->nlmsg_type, n->nlmsg_flags); 364dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 365dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 366dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat len -= NLMSG_LENGTH(sizeof(*ndtm)); 367dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (len < 0) { 368dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "BUG: wrong nlmsg len %d\n", len); 369dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 370dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 371dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 372dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (preferred_family && preferred_family != ndtm->ndtm_family) 373dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 374dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 375dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parse_rtattr(tb, NDTA_MAX, NDTA_RTA(ndtm), 376dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat n->nlmsg_len - NLMSG_LENGTH(sizeof(*ndtm))); 377dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 378dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[NDTA_NAME]) { 379dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char *name = RTA_DATA(tb[NDTA_NAME]); 380dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 381dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strlen(filter.name) > 0 && strcmp(filter.name, name)) 382dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 383dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 384dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[NDTA_PARMS]) { 385dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parse_rtattr(tpb, NDTPA_MAX, RTA_DATA(tb[NDTA_PARMS]), 386dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat RTA_PAYLOAD(tb[NDTA_PARMS])); 387dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 388dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_IFINDEX]) { 389dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 ifindex = *(__u32 *)RTA_DATA(tpb[NDTPA_IFINDEX]); 390dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 391dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (filter.index && filter.index != ifindex) 392dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 393dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 394dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (filter.index && filter.index != NONE_DEV) 395dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 396dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 397dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 398dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 399dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (ndtm->ndtm_family == AF_INET) 400dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "inet "); 401dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else if (ndtm->ndtm_family == AF_INET6) 402dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "inet6 "); 403dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else if (ndtm->ndtm_family == AF_DECnet) 404dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "dnet "); 405dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else 406dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "(%d) ", ndtm->ndtm_family); 407dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 408dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[NDTA_NAME]) { 409dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char *name = RTA_DATA(tb[NDTA_NAME]); 410dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s ", name); 411dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 412dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 413dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s", _SL_); 414dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 415dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ret = (tb[NDTA_THRESH1] || tb[NDTA_THRESH2] || tb[NDTA_THRESH3] || 416dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tb[NDTA_GC_INTERVAL]); 417dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (ret) 418dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, " "); 419dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 420dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[NDTA_THRESH1]) { 421dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 thresh1 = *(__u32 *)RTA_DATA(tb[NDTA_THRESH1]); 422dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "thresh1 %u ", thresh1); 423dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 424dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[NDTA_THRESH2]) { 425dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 thresh2 = *(__u32 *)RTA_DATA(tb[NDTA_THRESH2]); 426dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "thresh2 %u ", thresh2); 427dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 428dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[NDTA_THRESH3]) { 429dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 thresh3 = *(__u32 *)RTA_DATA(tb[NDTA_THRESH3]); 430dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "thresh3 %u ", thresh3); 431dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 432dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[NDTA_GC_INTERVAL]) { 433dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 gc_int = *(__u64 *)RTA_DATA(tb[NDTA_GC_INTERVAL]); 434dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "gc_int %llu ", gc_int); 435dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 436dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 437dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (ret) 438dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s", _SL_); 439dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 440dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[NDTA_CONFIG] && show_stats) { 441dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct ndt_config *ndtc = RTA_DATA(tb[NDTA_CONFIG]); 442dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 443dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, " "); 444dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "config "); 445dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 446dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "key_len %u ", ndtc->ndtc_key_len); 447dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "entry_size %u ", ndtc->ndtc_entry_size); 448dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "entries %u ", ndtc->ndtc_entries); 449dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 450dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s", _SL_); 451dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, " "); 452dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 453dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "last_flush %s ", 454dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ntable_strtime_delta(ndtc->ndtc_last_flush)); 455dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "last_rand %s ", 456dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ntable_strtime_delta(ndtc->ndtc_last_rand)); 457dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 458dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s", _SL_); 459dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, " "); 460dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 461dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "hash_rnd %u ", ndtc->ndtc_hash_rnd); 462dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "hash_mask %08x ", ndtc->ndtc_hash_mask); 463dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 464dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "hash_chain_gc %u ", ndtc->ndtc_hash_chain_gc); 465dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "proxy_qlen %u ", ndtc->ndtc_proxy_qlen); 466dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 467dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s", _SL_); 468dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 469dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 470dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[NDTA_PARMS]) { 471dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_IFINDEX]) { 472dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 ifindex = *(__u32 *)RTA_DATA(tpb[NDTPA_IFINDEX]); 473dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 474dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, " "); 475dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "dev %s ", ll_index_to_name(ifindex)); 476dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s", _SL_); 477dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 478dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 479dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, " "); 480dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 481dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_REFCNT]) { 482dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 refcnt = *(__u32 *)RTA_DATA(tpb[NDTPA_REFCNT]); 483dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "refcnt %u ", refcnt); 484dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 485dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_REACHABLE_TIME]) { 486dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 reachable = *(__u64 *)RTA_DATA(tpb[NDTPA_REACHABLE_TIME]); 487dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "reachable %llu ", reachable); 488dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 489dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_BASE_REACHABLE_TIME]) { 490dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 breachable = *(__u64 *)RTA_DATA(tpb[NDTPA_BASE_REACHABLE_TIME]); 491dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "base_reachable %llu ", breachable); 492dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 493dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_RETRANS_TIME]) { 494dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 retrans = *(__u64 *)RTA_DATA(tpb[NDTPA_RETRANS_TIME]); 495dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "retrans %llu ", retrans); 496dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 497dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 498dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s", _SL_); 499dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 500dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, " "); 501dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 502dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_GC_STALETIME]) { 503dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 gc_stale = *(__u64 *)RTA_DATA(tpb[NDTPA_GC_STALETIME]); 504dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "gc_stale %llu ", gc_stale); 505dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 506dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_DELAY_PROBE_TIME]) { 507dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 delay_probe = *(__u64 *)RTA_DATA(tpb[NDTPA_DELAY_PROBE_TIME]); 508dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "delay_probe %llu ", delay_probe); 509dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 510dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_QUEUE_LEN]) { 511dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 queue = *(__u32 *)RTA_DATA(tpb[NDTPA_QUEUE_LEN]); 512dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "queue %u ", queue); 513dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 514dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 515dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s", _SL_); 516dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 517dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, " "); 518dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 519dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_APP_PROBES]) { 520dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 aprobe = *(__u32 *)RTA_DATA(tpb[NDTPA_APP_PROBES]); 521dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "app_probes %u ", aprobe); 522dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 523dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_UCAST_PROBES]) { 524dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 uprobe = *(__u32 *)RTA_DATA(tpb[NDTPA_UCAST_PROBES]); 525dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "ucast_probes %u ", uprobe); 526dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 527dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_MCAST_PROBES]) { 528dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 mprobe = *(__u32 *)RTA_DATA(tpb[NDTPA_MCAST_PROBES]); 529dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "mcast_probes %u ", mprobe); 530dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 531dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 532dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s", _SL_); 533dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 534dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, " "); 535dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 536dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_ANYCAST_DELAY]) { 537dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 anycast_delay = *(__u64 *)RTA_DATA(tpb[NDTPA_ANYCAST_DELAY]); 538dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "anycast_delay %llu ", anycast_delay); 539dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 540dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_PROXY_DELAY]) { 541dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 proxy_delay = *(__u64 *)RTA_DATA(tpb[NDTPA_PROXY_DELAY]); 542dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "proxy_delay %llu ", proxy_delay); 543dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 544dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_PROXY_QLEN]) { 545dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 pqueue = *(__u32 *)RTA_DATA(tpb[NDTPA_PROXY_QLEN]); 546dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "proxy_queue %u ", pqueue); 547dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 548dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tpb[NDTPA_LOCKTIME]) { 549dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u64 locktime = *(__u64 *)RTA_DATA(tpb[NDTPA_LOCKTIME]); 550dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "locktime %llu ", locktime); 551dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 552dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 553dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s", _SL_); 554dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 555dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 556dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[NDTA_STATS] && show_stats) { 557dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct ndt_stats *ndts = RTA_DATA(tb[NDTA_STATS]); 558dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 559dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, " "); 560dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "stats "); 561dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 562dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "allocs %llu ", ndts->ndts_allocs); 563dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "destroys %llu ", ndts->ndts_destroys); 564dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "hash_grows %llu ", ndts->ndts_hash_grows); 565dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 566dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s", _SL_); 567dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, " "); 568dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 569dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "res_failed %llu ", ndts->ndts_res_failed); 570dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "lookups %llu ", ndts->ndts_lookups); 571dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "hits %llu ", ndts->ndts_hits); 572dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 573dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s", _SL_); 574dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, " "); 575dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 576dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "rcv_probes_mcast %llu ", ndts->ndts_rcv_probes_mcast); 577dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "rcv_probes_ucast %llu ", ndts->ndts_rcv_probes_ucast); 578dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 579dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s", _SL_); 580dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, " "); 581dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 582dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "periodic_gc_runs %llu ", ndts->ndts_periodic_gc_runs); 583dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "forced_gc_runs %llu ", ndts->ndts_forced_gc_runs); 584dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 585dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "%s", _SL_); 586dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 587dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 588dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(fp, "\n"); 589dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 590dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fflush(fp); 591dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 592dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 593dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 594dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatvoid ipntable_reset_filter(void) 595dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 596dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat memset(&filter, 0, sizeof(filter)); 597dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 598dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 599dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int ipntable_show(int argc, char **argv) 600dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 601dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ipntable_reset_filter(); 602dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 603dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat filter.family = preferred_family; 604dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 605dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat while (argc > 0) { 606dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "dev") == 0) { 607dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 608dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 609dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp("none", *argv) == 0) 610dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat filter.index = NONE_DEV; 611dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else if ((filter.index = ll_name_to_index(*argv)) == 0) 612dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("\"DEV\" is invalid", *argv); 613dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "name") == 0) { 614dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 615dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 616dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat strncpy(filter.name, *argv, sizeof(filter.name)); 617dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else 618dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat invarg("unknown", *argv); 619dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 620dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argc--; argv++; 621dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 622dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 623dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (rtnl_wilddump_request(&rth, preferred_family, RTM_GETNEIGHTBL) < 0) { 624dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat perror("Cannot send dump request"); 625dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat exit(1); 626dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 627dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 628dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (rtnl_dump_filter(&rth, print_ntable, stdout, NULL, NULL) < 0) { 629dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Dump terminated\n"); 630dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat exit(1); 631dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 632dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 633dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 634dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 635dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 636dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatint do_ipntable(int argc, char **argv) 637dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 638dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ll_init_map(&rth); 639dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 640dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (argc > 0) { 641dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (matches(*argv, "change") == 0 || 642dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat matches(*argv, "chg") == 0) 643dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return ipntable_modify(RTM_SETNEIGHTBL, 644dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NLM_F_REPLACE, 645dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argc-1, argv+1); 646dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (matches(*argv, "show") == 0 || 647dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat matches(*argv, "lst") == 0 || 648dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat matches(*argv, "list") == 0) 649dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return ipntable_show(argc-1, argv+1); 650dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (matches(*argv, "help") == 0) 651dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat usage(); 652dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else 653dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return ipntable_show(0, NULL); 654dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 655dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Command \"%s\" is unknown, try \"ip ntable help\".\n", *argv); 656dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat exit(-1); 657dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 658