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