static gboolean create_and_realize (NMDevice *device, NMConnection *connection, NMDevice *parent, NMPlatformLink *out_plink, GError **error) { NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (device); const char *iface = nm_device_get_iface (device); NMSettingVlan *s_vlan; int parent_ifindex, vlan_id; NMPlatformError plerr; g_assert (out_plink); s_vlan = nm_connection_get_setting_vlan (connection); g_assert (s_vlan); if (!nm_device_supports_vlans (parent)) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED, "no support for VLANs on interface %s of type %s", nm_device_get_iface (parent), nm_device_get_type_desc (parent)); return FALSE; } parent_ifindex = nm_device_get_ifindex (parent); g_warn_if_fail (parent_ifindex > 0); vlan_id = nm_setting_vlan_get_id (s_vlan); plerr = nm_platform_vlan_add (NM_PLATFORM_GET, iface, parent_ifindex, vlan_id, nm_setting_vlan_get_flags (s_vlan), out_plink); if (plerr != NM_PLATFORM_ERROR_SUCCESS && plerr != NM_PLATFORM_ERROR_EXISTS) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED, "Failed to create VLAN interface '%s' for '%s': %s", iface, nm_connection_get_id (connection), nm_platform_error_to_string (plerr)); return FALSE; } g_warn_if_fail (priv->parent == NULL); nm_device_vlan_set_parent (NM_DEVICE_VLAN (device), parent); priv->vlan_id = vlan_id; return TRUE; }
static gboolean create_and_realize (NMDevice *device, NMConnection *connection, NMDevice *parent, const NMPlatformLink **out_plink, GError **error) { const char *iface = nm_device_get_iface (device); NMPlatformError plerr; NMSettingMacvlan *s_macvlan; NMPlatformLnkMacvlan lnk = { }; int parent_ifindex; s_macvlan = nm_connection_get_setting_macvlan (connection); g_assert (s_macvlan); if (!parent) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED, "MACVLAN devices can not be created without a parent interface"); return FALSE; } parent_ifindex = nm_device_get_ifindex (parent); g_warn_if_fail (parent_ifindex > 0); lnk.mode = setting_mode_to_platform (nm_setting_macvlan_get_mode (s_macvlan)); if (!lnk.mode) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED, "unsupported MACVLAN mode %u in connection %s", nm_setting_macvlan_get_mode (s_macvlan), nm_connection_get_uuid (connection)); return FALSE; } lnk.no_promisc = !nm_setting_macvlan_get_promiscuous (s_macvlan); lnk.tap = nm_setting_macvlan_get_tap (s_macvlan); plerr = nm_platform_link_macvlan_add (NM_PLATFORM_GET, iface, parent_ifindex, &lnk, out_plink); if (plerr != NM_PLATFORM_ERROR_SUCCESS) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED, "Failed to create %s interface '%s' for '%s': %s", lnk.tap ? "macvtap" : "macvlan", iface, nm_connection_get_id (connection), nm_platform_error_to_string (plerr)); return FALSE; } return TRUE; }
static gboolean create_and_realize (NMDevice *device, NMConnection *connection, NMDevice *parent, const NMPlatformLink **out_plink, GError **error) { NMSettingBridge *s_bridge; const char *iface = nm_device_get_iface (device); const char *hwaddr; guint8 mac_address[NM_UTILS_HWADDR_LEN_MAX]; NMPlatformError plerr; g_assert (iface); s_bridge = nm_connection_get_setting_bridge (connection); g_assert (s_bridge); hwaddr = nm_setting_bridge_get_mac_address (s_bridge); if (hwaddr) { if (!nm_utils_hwaddr_aton (hwaddr, mac_address, ETH_ALEN)) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED, "Invalid hardware address '%s'", hwaddr); return FALSE; } } plerr = nm_platform_link_bridge_add (NM_PLATFORM_GET, iface, hwaddr ? mac_address : NULL, hwaddr ? ETH_ALEN : 0, out_plink); if (plerr != NM_PLATFORM_ERROR_SUCCESS) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED, "Failed to create bridge interface '%s' for '%s': %s", iface, nm_connection_get_id (connection), nm_platform_error_to_string (plerr)); return FALSE; } return TRUE; }
static gboolean create_and_realize (NMDevice *device, NMConnection *connection, NMDevice *parent, const NMPlatformLink **out_plink, GError **error) { const char *iface = nm_device_get_iface (device); NMPlatformError plerr; plerr = nm_platform_link_team_add (NM_PLATFORM_GET, iface, out_plink); if (plerr != NM_PLATFORM_ERROR_SUCCESS) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED, "Failed to create team master interface '%s' for '%s': %s", iface, nm_connection_get_id (connection), nm_platform_error_to_string (plerr)); return FALSE; } return TRUE; }
static gboolean create_and_realize (NMDevice *device, NMConnection *connection, NMDevice *parent, const NMPlatformLink **out_plink, GError **error) { const char *iface = nm_device_get_iface (device); NMPlatformError plerr; NMSettingTun *s_tun; gint64 user, group; s_tun = nm_connection_get_setting_tun (connection); g_assert (s_tun); user = _nm_utils_ascii_str_to_int64 (nm_setting_tun_get_owner (s_tun), 10, 0, G_MAXINT32, -1); group = _nm_utils_ascii_str_to_int64 (nm_setting_tun_get_group (s_tun), 10, 0, G_MAXINT32, -1); plerr = nm_platform_link_tun_add (NM_PLATFORM_GET, iface, nm_setting_tun_get_mode (s_tun) == NM_SETTING_TUN_MODE_TAP, user, group, nm_setting_tun_get_pi (s_tun), nm_setting_tun_get_vnet_hdr (s_tun), nm_setting_tun_get_multi_queue (s_tun), out_plink); if (plerr != NM_PLATFORM_ERROR_SUCCESS) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED, "Failed to create TUN/TAP interface '%s' for '%s': %s", iface, nm_connection_get_id (connection), nm_platform_error_to_string (plerr)); return FALSE; } return TRUE; }
static gboolean create_and_realize (NMDevice *device, NMConnection *connection, NMDevice *parent, const NMPlatformLink **out_plink, GError **error) { const char *iface = nm_device_get_iface (device); NMSettingIPTunnel *s_ip_tunnel; NMPlatformError plerr; NMPlatformLnkGre lnk_gre = { }; NMPlatformLnkSit lnk_sit = { }; NMPlatformLnkIpIp lnk_ipip = { }; NMPlatformLnkIp6Tnl lnk_ip6tnl = { }; const char *str; gint64 val; s_ip_tunnel = nm_connection_get_setting_ip_tunnel (connection); g_assert (s_ip_tunnel); switch (nm_setting_ip_tunnel_get_mode (s_ip_tunnel)) { case NM_IP_TUNNEL_MODE_GRE: if (parent) lnk_gre.parent_ifindex = nm_device_get_ifindex (parent); str = nm_setting_ip_tunnel_get_local (s_ip_tunnel); if (str) inet_pton (AF_INET, str, &lnk_gre.local); str = nm_setting_ip_tunnel_get_remote (s_ip_tunnel); g_assert (str); inet_pton (AF_INET, str, &lnk_gre.remote); lnk_gre.ttl = nm_setting_ip_tunnel_get_ttl (s_ip_tunnel); lnk_gre.tos = nm_setting_ip_tunnel_get_tos (s_ip_tunnel); lnk_gre.path_mtu_discovery = nm_setting_ip_tunnel_get_path_mtu_discovery (s_ip_tunnel); val = _nm_utils_ascii_str_to_int64 (nm_setting_ip_tunnel_get_input_key (s_ip_tunnel), 10, 0, G_MAXUINT32, -1); if (val != -1) { lnk_gre.input_key = val; lnk_gre.input_flags = NM_GRE_KEY; } val = _nm_utils_ascii_str_to_int64 (nm_setting_ip_tunnel_get_output_key (s_ip_tunnel), 10, 0, G_MAXUINT32, -1); if (val != -1) { lnk_gre.output_key = val; lnk_gre.output_flags = NM_GRE_KEY; } plerr = nm_platform_link_gre_add (NM_PLATFORM_GET, iface, &lnk_gre, out_plink); if (plerr != NM_PLATFORM_ERROR_SUCCESS) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED, "Failed to create GRE interface '%s' for '%s': %s", iface, nm_connection_get_id (connection), nm_platform_error_to_string (plerr)); return FALSE; } break; case NM_IP_TUNNEL_MODE_SIT: if (parent) lnk_sit.parent_ifindex = nm_device_get_ifindex (parent); str = nm_setting_ip_tunnel_get_local (s_ip_tunnel); if (str) inet_pton (AF_INET, str, &lnk_sit.local); str = nm_setting_ip_tunnel_get_remote (s_ip_tunnel); g_assert (str); inet_pton (AF_INET, str, &lnk_sit.remote); lnk_sit.ttl = nm_setting_ip_tunnel_get_ttl (s_ip_tunnel); lnk_sit.tos = nm_setting_ip_tunnel_get_tos (s_ip_tunnel); lnk_sit.path_mtu_discovery = nm_setting_ip_tunnel_get_path_mtu_discovery (s_ip_tunnel); plerr = nm_platform_link_sit_add (NM_PLATFORM_GET, iface, &lnk_sit, out_plink); if (plerr != NM_PLATFORM_ERROR_SUCCESS) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED, "Failed to create SIT interface '%s' for '%s': %s", iface, nm_connection_get_id (connection), nm_platform_error_to_string (plerr)); return FALSE; } break; case NM_IP_TUNNEL_MODE_IPIP: if (parent) lnk_ipip.parent_ifindex = nm_device_get_ifindex (parent); str = nm_setting_ip_tunnel_get_local (s_ip_tunnel); if (str) inet_pton (AF_INET, str, &lnk_ipip.local); str = nm_setting_ip_tunnel_get_remote (s_ip_tunnel); g_assert (str); inet_pton (AF_INET, str, &lnk_ipip.remote); lnk_ipip.ttl = nm_setting_ip_tunnel_get_ttl (s_ip_tunnel); lnk_ipip.tos = nm_setting_ip_tunnel_get_tos (s_ip_tunnel); lnk_ipip.path_mtu_discovery = nm_setting_ip_tunnel_get_path_mtu_discovery (s_ip_tunnel); plerr = nm_platform_link_ipip_add (NM_PLATFORM_GET, iface, &lnk_ipip, out_plink); if (plerr != NM_PLATFORM_ERROR_SUCCESS) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED, "Failed to create IPIP interface '%s' for '%s': %s", iface, nm_connection_get_id (connection), nm_platform_error_to_string (plerr)); return FALSE; } break; case NM_IP_TUNNEL_MODE_IPIP6: case NM_IP_TUNNEL_MODE_IP6IP6: if (parent) lnk_ip6tnl.parent_ifindex = nm_device_get_ifindex (parent); str = nm_setting_ip_tunnel_get_local (s_ip_tunnel); if (str) inet_pton (AF_INET6, str, &lnk_ip6tnl.local); str = nm_setting_ip_tunnel_get_remote (s_ip_tunnel); g_assert (str); inet_pton (AF_INET6, str, &lnk_ip6tnl.remote); lnk_ip6tnl.ttl = nm_setting_ip_tunnel_get_ttl (s_ip_tunnel); lnk_ip6tnl.tclass = nm_setting_ip_tunnel_get_tos (s_ip_tunnel); lnk_ip6tnl.encap_limit = nm_setting_ip_tunnel_get_encapsulation_limit (s_ip_tunnel); lnk_ip6tnl.flow_label = nm_setting_ip_tunnel_get_flow_label (s_ip_tunnel); lnk_ip6tnl.proto = nm_setting_ip_tunnel_get_mode (s_ip_tunnel) == NM_IP_TUNNEL_MODE_IPIP6 ? IPPROTO_IPIP : IPPROTO_IPV6; plerr = nm_platform_link_ip6tnl_add (NM_PLATFORM_GET, iface, &lnk_ip6tnl, out_plink); if (plerr != NM_PLATFORM_ERROR_SUCCESS) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED, "Failed to create IPIP interface '%s' for '%s': %s", iface, nm_connection_get_id (connection), nm_platform_error_to_string (plerr)); return FALSE; } break; default: g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED, "Failed to create IP tunnel interface '%s' for '%s': mode %d not supported", iface, nm_connection_get_id (connection), (int) nm_setting_ip_tunnel_get_mode (s_ip_tunnel)); return FALSE; } return TRUE; }
static gboolean create_and_realize (NMDevice *device, NMConnection *connection, NMDevice *parent, const NMPlatformLink **out_plink, GError **error) { const char *iface = nm_device_get_iface (device); NMPlatformError plerr; NMPlatformLnkVxlan props = { }; NMSettingVxlan *s_vxlan; const char *str; int ret; s_vxlan = nm_connection_get_setting_vxlan (connection); g_assert (s_vxlan); if (parent) props.parent_ifindex = nm_device_get_ifindex (parent); props.id = nm_setting_vxlan_get_id (s_vxlan); str = nm_setting_vxlan_get_local (s_vxlan); if (str) { ret = inet_pton (AF_INET, str, &props.local); if (ret != 1) ret = inet_pton (AF_INET6, str, &props.local6); if (ret != 1) return FALSE; } str = nm_setting_vxlan_get_remote (s_vxlan); ret = inet_pton (AF_INET, str, &props.group); if (ret != 1) ret = inet_pton (AF_INET6, str, &props.group6); if (ret != 1) return FALSE; props.tos = nm_setting_vxlan_get_tos (s_vxlan); props.ttl = nm_setting_vxlan_get_ttl (s_vxlan); props.learning = nm_setting_vxlan_get_learning (s_vxlan); props.ageing = nm_setting_vxlan_get_ageing (s_vxlan); props.limit = nm_setting_vxlan_get_limit (s_vxlan); props.src_port_min = nm_setting_vxlan_get_source_port_min (s_vxlan); props.src_port_max = nm_setting_vxlan_get_source_port_max (s_vxlan); props.dst_port = nm_setting_vxlan_get_destination_port (s_vxlan); props.proxy = nm_setting_vxlan_get_proxy (s_vxlan); props.rsc = nm_setting_vxlan_get_rsc (s_vxlan); props.l2miss = nm_setting_vxlan_get_l2_miss (s_vxlan); props.l3miss = nm_setting_vxlan_get_l3_miss (s_vxlan); plerr = nm_platform_link_vxlan_add (NM_PLATFORM_GET, iface, &props, out_plink); if (plerr != NM_PLATFORM_ERROR_SUCCESS) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED, "Failed to create VXLAN interface '%s' for '%s': %s", iface, nm_connection_get_id (connection), nm_platform_error_to_string (plerr)); return FALSE; } return TRUE; }