link_veth.c revision f9329ccaf933a9dee5760de6979c7be6f17e253f
12da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov/*
22da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov * link_veth.c	veth driver module
32da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov *
42da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov *		This program is free software; you can redistribute it and/or
52da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov *		modify it under the terms of the GNU General Public License
62da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov *		as published by the Free Software Foundation; either version
72da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov *		2 of the License, or (at your option) any later version.
82da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov *
92da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov * Authors:	Pavel Emelianov <xemul@openvz.org>
102da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov *
112da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov */
122da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov
132da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov#include <string.h>
142da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov
152da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov#include "utils.h"
162da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov#include "ip_common.h"
172da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov#include "veth.h"
182da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov
19f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev#define	IFNAMSIZ	16
202da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov
212da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianovstatic void usage(void)
222da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov{
23f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev	printf("Usage: ip link <options> type veth "
24f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev		"[peer <options>]\nTo get <options> type "
25f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev		"'ip link add help'\n");
262da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov}
272da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov
282da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianovstatic int veth_parse_opt(struct link_util *lu, int argc, char **argv,
292da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov		struct nlmsghdr *hdr)
302da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov{
31f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev	char *name, *type, *link, *dev;
32f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev	int err, len;
33f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev	struct rtattr * data;
342da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov
35f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev	if (strcmp(argv[0], "peer") != 0) {
36f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev		usage();
37f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev		return -1;
38f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev	}
392da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov
40f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev	data = NLMSG_TAIL(hdr);
41f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev	addattr_l(hdr, 1024, VETH_INFO_PEER, NULL, 0);
422da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov
43f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev	hdr->nlmsg_len += sizeof(struct ifinfomsg);
442da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov
45f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev	err = iplink_parse(argc - 1, argv + 1, (struct iplink_req *)hdr,
46f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev			&name, &type, &link, &dev);
47f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev	if (err < 0)
48f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev		return err;
492da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov
50f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev	if (name) {
51f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev		len = strlen(name) + 1;
52f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev		if (len > IFNAMSIZ)
53f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev			invarg("\"name\" too long\n", *argv);
54f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev		addattr_l(hdr, 1024, IFLA_IFNAME, name, len);
552da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov	}
562da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov
57f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev	data->rta_len = (void *)NLMSG_TAIL(hdr) - (void *)data;
58f9329ccaf933a9dee5760de6979c7be6f17e253fVitaliy Gusev	return argc - 1 - err;
592da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov}
602da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov
612da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianovstruct link_util veth_link_util = {
622da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov	.id = "veth",
632da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov	.parse_opt = veth_parse_opt,
642da55b1bbed22e1058627f6b262158349b2b142ePavel Emelianov};
65