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