Line data Source code
1 : /* SPDX-License-Identifier: LGPL-2.1+ */ 2 : 3 : #include <linux/can/vxcan.h> 4 : 5 : #include "netdev/vxcan.h" 6 : 7 0 : static int netdev_vxcan_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *m) { 8 : VxCan *v; 9 : int r; 10 : 11 0 : assert(netdev); 12 0 : assert(!link); 13 0 : assert(m); 14 : 15 0 : v = VXCAN(netdev); 16 : 17 0 : assert(v); 18 : 19 0 : r = sd_netlink_message_open_container(m, VXCAN_INFO_PEER); 20 0 : if (r < 0) 21 0 : return log_netdev_error_errno(netdev, r, "Could not append VXCAN_INFO_PEER attribute: %m"); 22 : 23 0 : if (v->ifname_peer) { 24 0 : r = sd_netlink_message_append_string(m, IFLA_IFNAME, v->ifname_peer); 25 0 : if (r < 0) 26 0 : return log_error_errno(r, "Failed to add vxcan netlink interface peer name: %m"); 27 : } 28 : 29 0 : r = sd_netlink_message_close_container(m); 30 0 : if (r < 0) 31 0 : return log_netdev_error_errno(netdev, r, "Could not append VXCAN_INFO_PEER attribute: %m"); 32 : 33 0 : return r; 34 : } 35 : 36 0 : static int netdev_vxcan_verify(NetDev *netdev, const char *filename) { 37 : VxCan *v; 38 : 39 0 : assert(netdev); 40 0 : assert(filename); 41 : 42 0 : v = VXCAN(netdev); 43 : 44 0 : assert(v); 45 : 46 0 : if (!v->ifname_peer) { 47 0 : log_warning("VxCan NetDev without peer name configured in %s. Ignoring", filename); 48 0 : return -EINVAL; 49 : } 50 : 51 0 : return 0; 52 : } 53 : 54 0 : static void vxcan_done(NetDev *n) { 55 : VxCan *v; 56 : 57 0 : assert(n); 58 : 59 0 : v = VXCAN(n); 60 : 61 0 : assert(v); 62 : 63 0 : free(v->ifname_peer); 64 0 : } 65 : 66 : const NetDevVTable vxcan_vtable = { 67 : .object_size = sizeof(VxCan), 68 : .sections = "Match\0NetDev\0VXCAN\0", 69 : .done = vxcan_done, 70 : .fill_message_create = netdev_vxcan_fill_message_create, 71 : .create_type = NETDEV_CREATE_INDEPENDENT, 72 : .config_verify = netdev_vxcan_verify, 73 : .generate_mac = true, 74 : };