143
144
#endif /* ! IPLINK_IOCTL_COMPAT */
152
int iplink_parse(int argc, char **argv, struct iplink_req *req,
153
char **name, char **type, char **link, char **dev)
163
if (strcmp(*argv, "up") == 0) {
164
req->i.ifi_change |= IFF_UP;
165
req->i.ifi_flags |= IFF_UP;
166
} else if (strcmp(*argv, "down") == 0) {
167
req->i.ifi_change |= IFF_UP;
168
req->i.ifi_flags &= ~IFF_UP;
169
} else if (strcmp(*argv, "name") == 0) {
172
} else if (matches(*argv, "link") == 0) {
175
} else if (matches(*argv, "address") == 0) {
177
len = ll_addr_a2n(abuf, sizeof(abuf), *argv);
178
addattr_l(&req->n, sizeof(*req), IFLA_ADDRESS, abuf, len);
179
} else if (matches(*argv, "broadcast") == 0 ||
180
strcmp(*argv, "brd") == 0) {
182
len = ll_addr_a2n(abuf, sizeof(abuf), *argv);
183
addattr_l(&req->n, sizeof(*req), IFLA_BROADCAST, abuf, len);
184
} else if (matches(*argv, "txqueuelen") == 0 ||
185
strcmp(*argv, "qlen") == 0 ||
186
matches(*argv, "txqlen") == 0) {
189
duparg("txqueuelen", *argv);
190
if (get_integer(&qlen, *argv, 0))
191
invarg("Invalid \"txqueuelen\" value\n", *argv);
192
addattr_l(&req->n, sizeof(*req), IFLA_TXQLEN, &qlen, 4);
193
} else if (strcmp(*argv, "mtu") == 0) {
196
duparg("mtu", *argv);
197
if (get_integer(&mtu, *argv, 0))
198
invarg("Invalid \"mtu\" value\n", *argv);
199
addattr_l(&req->n, sizeof(*req), IFLA_MTU, &mtu, 4);
200
} else if (strcmp(*argv, "multicast") == 0) {
202
req->i.ifi_change |= IFF_MULTICAST;
203
if (strcmp(*argv, "on") == 0) {
204
req->i.ifi_flags |= IFF_MULTICAST;
205
} else if (strcmp(*argv, "off") == 0) {
206
req->i.ifi_flags &= ~IFF_MULTICAST;
208
return on_off("multicast");
209
} else if (strcmp(*argv, "allmulticast") == 0) {
211
req->i.ifi_change |= IFF_ALLMULTI;
212
if (strcmp(*argv, "on") == 0) {
213
req->i.ifi_flags |= IFF_ALLMULTI;
214
} else if (strcmp(*argv, "off") == 0) {
215
req->i.ifi_flags &= ~IFF_ALLMULTI;
217
return on_off("allmulticast");
218
} else if (strcmp(*argv, "promisc") == 0) {
220
req->i.ifi_change |= IFF_PROMISC;
221
if (strcmp(*argv, "on") == 0) {
222
req->i.ifi_flags |= IFF_PROMISC;
223
} else if (strcmp(*argv, "off") == 0) {
224
req->i.ifi_flags &= ~IFF_PROMISC;
226
return on_off("promisc");
227
} else if (strcmp(*argv, "trailers") == 0) {
229
req->i.ifi_change |= IFF_NOTRAILERS;
230
if (strcmp(*argv, "off") == 0) {
231
req->i.ifi_flags |= IFF_NOTRAILERS;
232
} else if (strcmp(*argv, "on") == 0) {
233
req->i.ifi_flags &= ~IFF_NOTRAILERS;
235
return on_off("trailers");
236
} else if (strcmp(*argv, "arp") == 0) {
238
req->i.ifi_change |= IFF_NOARP;
239
if (strcmp(*argv, "on") == 0) {
240
req->i.ifi_flags &= ~IFF_NOARP;
241
} else if (strcmp(*argv, "off") == 0) {
242
req->i.ifi_flags |= IFF_NOARP;
244
return on_off("noarp");
246
} else if (matches(*argv, "dynamic") == 0) {
248
req->i.ifi_change |= IFF_DYNAMIC;
249
if (strcmp(*argv, "on") == 0) {
250
req->i.ifi_flags |= IFF_DYNAMIC;
251
} else if (strcmp(*argv, "off") == 0) {
252
req->i.ifi_flags &= ~IFF_DYNAMIC;
254
return on_off("dynamic");
256
} else if (matches(*argv, "type") == 0) {
262
if (strcmp(*argv, "dev") == 0) {
266
duparg2("dev", *argv);
145
275
static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
151
278
char *dev = NULL;
152
279
char *name = NULL;
153
280
char *link = NULL;
154
281
char *type = NULL;
155
282
struct link_util *lu = NULL;
283
struct iplink_req req;
162
286
memset(&req, 0, sizeof(req));
166
290
req.n.nlmsg_type = cmd;
167
291
req.i.ifi_family = preferred_family;
170
if (strcmp(*argv, "up") == 0) {
171
req.i.ifi_change |= IFF_UP;
172
req.i.ifi_flags |= IFF_UP;
173
} else if (strcmp(*argv, "down") == 0) {
174
req.i.ifi_change |= IFF_UP;
175
req.i.ifi_flags &= ~IFF_UP;
176
} else if (strcmp(*argv, "name") == 0) {
179
} else if (matches(*argv, "link") == 0) {
182
} else if (matches(*argv, "address") == 0) {
184
len = ll_addr_a2n(abuf, sizeof(abuf), *argv);
185
addattr_l(&req.n, sizeof(req), IFLA_ADDRESS, abuf, len);
186
} else if (matches(*argv, "broadcast") == 0 ||
187
strcmp(*argv, "brd") == 0) {
189
len = ll_addr_a2n(abuf, sizeof(abuf), *argv);
190
addattr_l(&req.n, sizeof(req), IFLA_BROADCAST, abuf, len);
191
} else if (matches(*argv, "txqueuelen") == 0 ||
192
strcmp(*argv, "qlen") == 0 ||
193
matches(*argv, "txqlen") == 0) {
196
duparg("txqueuelen", *argv);
197
if (get_integer(&qlen, *argv, 0))
198
invarg("Invalid \"txqueuelen\" value\n", *argv);
199
addattr_l(&req.n, sizeof(req), IFLA_TXQLEN, &qlen, 4);
200
} else if (strcmp(*argv, "mtu") == 0) {
203
duparg("mtu", *argv);
204
if (get_integer(&mtu, *argv, 0))
205
invarg("Invalid \"mtu\" value\n", *argv);
206
addattr_l(&req.n, sizeof(req), IFLA_MTU, &mtu, 4);
207
} else if (strcmp(*argv, "multicast") == 0) {
209
req.i.ifi_change |= IFF_MULTICAST;
210
if (strcmp(*argv, "on") == 0) {
211
req.i.ifi_flags |= IFF_MULTICAST;
212
} else if (strcmp(*argv, "off") == 0) {
213
req.i.ifi_flags &= ~IFF_MULTICAST;
215
return on_off("multicast");
216
} else if (strcmp(*argv, "allmulticast") == 0) {
218
req.i.ifi_change |= IFF_ALLMULTI;
219
if (strcmp(*argv, "on") == 0) {
220
req.i.ifi_flags |= IFF_ALLMULTI;
221
} else if (strcmp(*argv, "off") == 0) {
222
req.i.ifi_flags &= ~IFF_ALLMULTI;
224
return on_off("allmulticast");
225
} else if (strcmp(*argv, "promisc") == 0) {
227
req.i.ifi_change |= IFF_PROMISC;
228
if (strcmp(*argv, "on") == 0) {
229
req.i.ifi_flags |= IFF_PROMISC;
230
} else if (strcmp(*argv, "off") == 0) {
231
req.i.ifi_flags &= ~IFF_PROMISC;
233
return on_off("promisc");
234
} else if (strcmp(*argv, "trailers") == 0) {
236
req.i.ifi_change |= IFF_NOTRAILERS;
237
if (strcmp(*argv, "off") == 0) {
238
req.i.ifi_flags |= IFF_NOTRAILERS;
239
} else if (strcmp(*argv, "on") == 0) {
240
req.i.ifi_flags &= ~IFF_NOTRAILERS;
242
return on_off("trailers");
243
} else if (strcmp(*argv, "arp") == 0) {
245
req.i.ifi_change |= IFF_NOARP;
246
if (strcmp(*argv, "on") == 0) {
247
req.i.ifi_flags &= ~IFF_NOARP;
248
} else if (strcmp(*argv, "off") == 0) {
249
req.i.ifi_flags |= IFF_NOARP;
251
return on_off("noarp");
253
} else if (matches(*argv, "dynamic") == 0) {
255
req.i.ifi_change |= IFF_DYNAMIC;
256
if (strcmp(*argv, "on") == 0) {
257
req.i.ifi_flags |= IFF_DYNAMIC;
258
} else if (strcmp(*argv, "off") == 0) {
259
req.i.ifi_flags &= ~IFF_DYNAMIC;
261
return on_off("dynamic");
263
} else if (matches(*argv, "type") == 0) {
269
if (strcmp(*argv, "dev") == 0) {
273
duparg2("dev", *argv);
293
ret = iplink_parse(argc, argv, &req, &name, &type, &link, &dev);
279
299
ll_init_map(&rth);