2014-05-21 12:31:04 +04:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd .
Copyright 2014 Susant Sahani < susant @ redhat . com >
systemd is free software ; you can redistribute it and / or modify it
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation ; either version 2.1 of the License , or
( at your option ) any later version .
systemd is distributed in the hope that it will be useful , but
WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public License
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
# include <net/if.h>
# include <linux/veth.h>
2015-06-12 17:31:33 +03:00
# include "sd-netlink.h"
2014-07-06 16:07:34 +04:00
# include "networkd-netdev-veth.h"
2014-05-21 12:31:04 +04:00
2015-06-12 17:31:33 +03:00
static int netdev_veth_fill_message_create ( NetDev * netdev , Link * link , sd_netlink_message * m ) {
2014-07-16 15:17:10 +04:00
Veth * v = VETH ( netdev ) ;
2014-05-21 12:31:04 +04:00
int r ;
assert ( netdev ) ;
2014-07-16 15:17:10 +04:00
assert ( ! link ) ;
assert ( v ) ;
2014-05-21 12:31:04 +04:00
assert ( m ) ;
2015-06-12 17:31:33 +03:00
r = sd_netlink_message_open_container ( m , VETH_INFO_PEER ) ;
2015-06-10 09:50:45 +03:00
if ( r < 0 )
return log_netdev_error_errno ( netdev , r , " Could not append VETH_INFO_PEER attribute: %m " ) ;
2014-05-21 12:31:04 +04:00
2014-07-16 15:17:10 +04:00
if ( v - > ifname_peer ) {
2015-06-12 17:31:33 +03:00
r = sd_netlink_message_append_string ( m , IFLA_IFNAME , v - > ifname_peer ) ;
2014-11-28 20:50:43 +03:00
if ( r < 0 )
return log_error_errno ( r , " Failed to add netlink interface name: %m " ) ;
2014-05-21 12:31:04 +04:00
}
2014-07-16 15:17:10 +04:00
if ( v - > mac_peer ) {
2015-06-12 17:31:33 +03:00
r = sd_netlink_message_append_ether_addr ( m , IFLA_ADDRESS , v - > mac_peer ) ;
2015-06-10 09:50:45 +03:00
if ( r < 0 )
return log_netdev_error_errno ( netdev , r , " Could not append IFLA_ADDRESS attribute: %m " ) ;
2014-06-14 17:38:35 +04:00
}
2015-06-12 17:31:33 +03:00
r = sd_netlink_message_close_container ( m ) ;
2015-06-10 09:50:45 +03:00
if ( r < 0 )
return log_netdev_error_errno ( netdev , r , " Could not append IFLA_INFO_DATA attribute: %m " ) ;
2014-05-21 12:31:04 +04:00
return r ;
}
2014-07-06 16:07:34 +04:00
static int netdev_veth_verify ( NetDev * netdev , const char * filename ) {
2014-07-16 15:17:10 +04:00
Veth * v = VETH ( netdev ) ;
2014-05-21 12:31:04 +04:00
int r ;
assert ( netdev ) ;
2014-07-16 15:17:10 +04:00
assert ( v ) ;
2014-07-06 16:07:34 +04:00
assert ( filename ) ;
2014-05-21 12:31:04 +04:00
2014-07-16 15:17:10 +04:00
if ( ! v - > ifname_peer ) {
2014-07-06 16:07:34 +04:00
log_warning ( " Veth NetDev without peer name configured in %s. Ignoring " ,
filename ) ;
return - EINVAL ;
2014-05-21 12:31:04 +04:00
}
2014-07-16 15:17:10 +04:00
if ( ! v - > mac_peer ) {
r = netdev_get_mac ( v - > ifname_peer , & v - > mac_peer ) ;
2014-07-06 16:07:34 +04:00
if ( r < 0 ) {
log_warning ( " Failed to generate predictable MAC address for %s. Ignoring " ,
2014-07-16 15:17:10 +04:00
v - > ifname_peer ) ;
2014-07-06 16:07:34 +04:00
return - EINVAL ;
}
2014-05-21 12:31:04 +04:00
}
return 0 ;
}
2014-07-06 16:07:34 +04:00
2014-07-16 15:17:10 +04:00
static void veth_done ( NetDev * n ) {
Veth * v = VETH ( n ) ;
assert ( n ) ;
assert ( v ) ;
free ( v - > ifname_peer ) ;
free ( v - > mac_peer ) ;
}
2014-07-06 16:07:34 +04:00
const NetDevVTable veth_vtable = {
2014-07-16 15:17:10 +04:00
. object_size = sizeof ( Veth ) ,
. sections = " Match \0 NetDev \0 Peer \0 " ,
. done = veth_done ,
2014-07-06 16:07:34 +04:00
. fill_message_create = netdev_veth_fill_message_create ,
2014-07-16 15:17:10 +04:00
. create_type = NETDEV_CREATE_INDEPENDENT ,
2014-07-06 16:07:34 +04:00
. config_verify = netdev_veth_verify ,
} ;