mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-06 09:40:17 +01:00
core: more conversion to ifindex instead of iface
This commit is contained in:
parent
c742cc83fd
commit
efb5735ad1
6 changed files with 98 additions and 60 deletions
|
|
@ -677,7 +677,7 @@ _set_hw_addr (NMDeviceEthernet *self, const guint8 *addr, const char *detail)
|
|||
/* Can't change MAC address while device is up */
|
||||
real_hw_take_down (dev);
|
||||
|
||||
success = nm_system_device_set_mac (iface, (struct ether_addr *) addr);
|
||||
success = nm_system_iface_set_mac (nm_device_get_ip_ifindex (dev), (struct ether_addr *) addr);
|
||||
if (success) {
|
||||
/* MAC address succesfully changed; update the current MAC to match */
|
||||
_update_hw_addr (self, addr);
|
||||
|
|
|
|||
|
|
@ -1209,7 +1209,7 @@ _set_hw_addr (NMDeviceWifi *self, const guint8 *addr, const char *detail)
|
|||
/* Can't change MAC address while device is up */
|
||||
real_hw_take_down (dev);
|
||||
|
||||
success = nm_system_device_set_mac (iface, (struct ether_addr *) addr);
|
||||
success = nm_system_iface_set_mac (nm_device_get_ip_ifindex (dev), (struct ether_addr *) addr);
|
||||
if (success) {
|
||||
/* MAC address succesfully changed; update the current MAC to match */
|
||||
_update_hw_addr (self, addr);
|
||||
|
|
|
|||
|
|
@ -3011,6 +3011,7 @@ nm_device_set_ip4_config (NMDevice *self,
|
|||
gboolean success = TRUE;
|
||||
NMIP4ConfigCompareFlags diff = NM_IP4_COMPARE_FLAG_ALL;
|
||||
NMDnsManager *dns_mgr;
|
||||
int ip_ifindex;
|
||||
|
||||
g_return_val_if_fail (NM_IS_DEVICE (self), FALSE);
|
||||
g_return_val_if_fail (reason != NULL, FALSE);
|
||||
|
|
@ -3041,8 +3042,10 @@ nm_device_set_ip4_config (NMDevice *self,
|
|||
/* Don't touch the device's actual IP config if the connection is
|
||||
* assumed when NM starts.
|
||||
*/
|
||||
if (!assumed)
|
||||
success = nm_system_apply_ip4_config (ip_iface, new_config, nm_device_get_priority (self), diff);
|
||||
if (!assumed) {
|
||||
ip_ifindex = nm_device_get_ip_ifindex (self);
|
||||
success = nm_system_apply_ip4_config (ip_ifindex, new_config, nm_device_get_priority (self), diff);
|
||||
}
|
||||
|
||||
if (success || assumed) {
|
||||
/* Export over D-Bus */
|
||||
|
|
|
|||
136
src/nm-system.c
136
src/nm-system.c
|
|
@ -105,7 +105,7 @@ create_route (int iface_idx, int mss)
|
|||
}
|
||||
|
||||
static struct rtnl_route *
|
||||
nm_system_device_set_ip4_route (const char *iface,
|
||||
nm_system_device_set_ip4_route (int ifindex,
|
||||
guint32 ip4_dest,
|
||||
guint32 ip4_prefix,
|
||||
guint32 ip4_gateway,
|
||||
|
|
@ -116,15 +116,18 @@ nm_system_device_set_ip4_route (const char *iface,
|
|||
struct rtnl_route *route;
|
||||
struct nl_addr *dest_addr;
|
||||
struct nl_addr *gw_addr = NULL;
|
||||
int err, iface_idx;
|
||||
int err;
|
||||
const char *iface;
|
||||
|
||||
g_return_val_if_fail (ifindex > 0, NULL);
|
||||
|
||||
nlh = nm_netlink_get_default_handle ();
|
||||
g_return_val_if_fail (nlh != NULL, NULL);
|
||||
|
||||
iface_idx = nm_netlink_iface_to_index (iface);
|
||||
g_return_val_if_fail (iface_idx >= 0, NULL);
|
||||
iface = nm_netlink_index_to_iface (ifindex);
|
||||
g_return_val_if_fail (iface != NULL, NULL);
|
||||
|
||||
route = create_route (iface_idx, mss);
|
||||
route = create_route (ifindex, mss);
|
||||
g_return_val_if_fail (route != NULL, NULL);
|
||||
|
||||
/* Destination */
|
||||
|
|
@ -158,7 +161,7 @@ nm_system_device_set_ip4_route (const char *iface,
|
|||
/* Gateway might be over a bridge; try adding a route to gateway first */
|
||||
struct rtnl_route *route2;
|
||||
|
||||
route2 = create_route (iface_idx, mss);
|
||||
route2 = create_route (ifindex, mss);
|
||||
if (route2) {
|
||||
/* Add route to gateway over bridge */
|
||||
rtnl_route_set_dst (route2, gw_addr);
|
||||
|
|
@ -188,8 +191,10 @@ nm_system_device_set_ip4_route (const char *iface,
|
|||
}
|
||||
|
||||
static gboolean
|
||||
sync_addresses (const char *iface, int ifindex, int family,
|
||||
struct rtnl_addr **addrs, int num_addrs)
|
||||
sync_addresses (int ifindex,
|
||||
int family,
|
||||
struct rtnl_addr **addrs,
|
||||
int num_addrs)
|
||||
{
|
||||
struct nl_handle *nlh;
|
||||
struct nl_cache *addr_cache;
|
||||
|
|
@ -199,6 +204,10 @@ sync_addresses (const char *iface, int ifindex, int family,
|
|||
int i, err;
|
||||
guint32 log_domain = (family == AF_INET) ? LOGD_IP4 : LOGD_IP6;
|
||||
char buf[INET6_ADDRSTRLEN + 1];
|
||||
const char *iface;
|
||||
|
||||
iface = nm_netlink_index_to_iface (ifindex);
|
||||
g_return_val_if_fail (iface != NULL, FALSE);
|
||||
|
||||
log_domain |= LOGD_DEVICE;
|
||||
|
||||
|
|
@ -361,7 +370,7 @@ add_ip4_addresses (NMIP4Config *config, const char *iface)
|
|||
rtnl_addr_set_ifindex (addrs[i], iface_idx);
|
||||
}
|
||||
|
||||
return sync_addresses (iface, iface_idx, AF_INET, addrs, num_addrs);
|
||||
return sync_addresses (iface_idx, AF_INET, addrs, num_addrs);
|
||||
}
|
||||
|
||||
struct rtnl_route *
|
||||
|
|
@ -406,10 +415,10 @@ nm_system_add_ip4_vpn_gateway_route (NMDevice *parent_device, NMIP4Config *vpn_c
|
|||
* parent device.
|
||||
*/
|
||||
if (ip4_dest_in_same_subnet (parent_config, vpn_gw, parent_prefix)) {
|
||||
route = nm_system_device_set_ip4_route (nm_device_get_ip_iface (parent_device),
|
||||
route = nm_system_device_set_ip4_route (nm_device_get_ip_ifindex (parent_device),
|
||||
vpn_gw, 32, 0, 0, nm_ip4_config_get_mss (parent_config));
|
||||
} else {
|
||||
route = nm_system_device_set_ip4_route (nm_device_get_ip_iface (parent_device),
|
||||
route = nm_system_device_set_ip4_route (nm_device_get_ip_ifindex (parent_device),
|
||||
vpn_gw, 32, parent_gw, 0, nm_ip4_config_get_mss (parent_config));
|
||||
}
|
||||
|
||||
|
|
@ -423,16 +432,20 @@ nm_system_add_ip4_vpn_gateway_route (NMDevice *parent_device, NMIP4Config *vpn_c
|
|||
*
|
||||
*/
|
||||
gboolean
|
||||
nm_system_apply_ip4_config (const char *iface,
|
||||
nm_system_apply_ip4_config (int ifindex,
|
||||
NMIP4Config *config,
|
||||
int priority,
|
||||
NMIP4ConfigCompareFlags flags)
|
||||
{
|
||||
const char *iface;
|
||||
int i;
|
||||
|
||||
g_return_val_if_fail (iface != NULL, FALSE);
|
||||
g_return_val_if_fail (ifindex > 0, FALSE);
|
||||
g_return_val_if_fail (config != NULL, FALSE);
|
||||
|
||||
iface = nm_netlink_index_to_iface (ifindex);
|
||||
g_return_val_if_fail (iface != NULL, FALSE);
|
||||
|
||||
if (flags & NM_IP4_COMPARE_FLAG_ADDRESSES) {
|
||||
if (!add_ip4_addresses (config, iface))
|
||||
return FALSE;
|
||||
|
|
@ -459,7 +472,7 @@ nm_system_apply_ip4_config (const char *iface,
|
|||
&& nm_ip4_route_get_dest (route) == 0)
|
||||
continue;
|
||||
|
||||
tmp = nm_system_device_set_ip4_route (iface,
|
||||
tmp = nm_system_device_set_ip4_route (ifindex,
|
||||
nm_ip4_route_get_dest (route),
|
||||
nm_ip4_route_get_prefix (route),
|
||||
nm_ip4_route_get_next_hop (route),
|
||||
|
|
@ -471,7 +484,7 @@ nm_system_apply_ip4_config (const char *iface,
|
|||
|
||||
if (flags & NM_IP4_COMPARE_FLAG_MTU) {
|
||||
if (nm_ip4_config_get_mtu (config))
|
||||
nm_system_device_set_mtu (iface, nm_ip4_config_get_mtu (config));
|
||||
nm_system_iface_set_mtu (ifindex, nm_ip4_config_get_mtu (config));
|
||||
}
|
||||
|
||||
if (priority > 0)
|
||||
|
|
@ -595,7 +608,7 @@ add_ip6_addresses (NMIP6Config *config, const char *iface)
|
|||
rtnl_addr_set_ifindex (addrs[i], iface_idx);
|
||||
}
|
||||
|
||||
return sync_addresses (iface, iface_idx, AF_INET6, addrs, num_addrs);
|
||||
return sync_addresses (iface_idx, AF_INET6, addrs, num_addrs);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -707,6 +720,13 @@ nm_system_iface_set_up (int ifindex,
|
|||
return success;
|
||||
}
|
||||
|
||||
/**
|
||||
* nm_system_iface_is_up:
|
||||
* @ifindex: interface index
|
||||
*
|
||||
* Returns: %TRUE if the interface is up, %FALSE if it was down or the check
|
||||
* failed.
|
||||
**/
|
||||
gboolean
|
||||
nm_system_iface_is_up (int ifindex)
|
||||
{
|
||||
|
|
@ -717,10 +737,7 @@ nm_system_iface_is_up (int ifindex)
|
|||
g_return_val_if_fail (ifindex > 0, FALSE);
|
||||
|
||||
iface = nm_netlink_index_to_iface (ifindex);
|
||||
if (iface == NULL) {
|
||||
nm_log_err (LOGD_HW, "failed to get interface name for index %d", ifindex);
|
||||
return FALSE;
|
||||
}
|
||||
g_return_val_if_fail (iface != NULL, FALSE);
|
||||
|
||||
l = nm_netlink_index_to_rtnl_link (ifindex);
|
||||
if (l == NULL) {
|
||||
|
|
@ -734,72 +751,96 @@ nm_system_iface_is_up (int ifindex)
|
|||
return flags & IFF_UP;
|
||||
}
|
||||
|
||||
/**
|
||||
* nm_system_iface_set_mtu:
|
||||
* @ifindex: interface index
|
||||
* @mtu: the new MTU
|
||||
*
|
||||
* Returns: %TRUE if the request was successful, %FALSE if it failed
|
||||
**/
|
||||
gboolean
|
||||
nm_system_device_set_mtu (const char *iface, guint32 mtu)
|
||||
nm_system_iface_set_mtu (int ifindex, guint32 mtu)
|
||||
{
|
||||
struct rtnl_link *old;
|
||||
struct rtnl_link *new;
|
||||
gboolean success = FALSE;
|
||||
struct nl_handle *nlh;
|
||||
int iface_idx;
|
||||
const char *iface;
|
||||
int err;
|
||||
|
||||
g_return_val_if_fail (iface != NULL, FALSE);
|
||||
g_return_val_if_fail (ifindex > 0, FALSE);
|
||||
g_return_val_if_fail (mtu > 0, FALSE);
|
||||
|
||||
iface = nm_netlink_index_to_iface (ifindex);
|
||||
g_return_val_if_fail (iface != NULL, FALSE);
|
||||
|
||||
new = rtnl_link_alloc ();
|
||||
if (!new)
|
||||
return FALSE;
|
||||
|
||||
iface_idx = nm_netlink_iface_to_index (iface);
|
||||
old = nm_netlink_index_to_rtnl_link (iface_idx);
|
||||
old = nm_netlink_index_to_rtnl_link (ifindex);
|
||||
if (old) {
|
||||
rtnl_link_set_mtu (new, mtu);
|
||||
nlh = nm_netlink_get_default_handle ();
|
||||
if (nlh) {
|
||||
rtnl_link_change (nlh, old, new, 0);
|
||||
success = TRUE;
|
||||
err = rtnl_link_change (nlh, old, new, 0);
|
||||
if (err == 0)
|
||||
success = TRUE;
|
||||
else
|
||||
nm_log_warn (LOGD_HW, "(%s): failed to change interface MTU", iface);
|
||||
}
|
||||
rtnl_link_put (old);
|
||||
}
|
||||
|
||||
rtnl_link_put (new);
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
/**
|
||||
* nm_system_iface_set_mac:
|
||||
* @ifindex: interface index
|
||||
* @mac: new MAC address
|
||||
*
|
||||
* Attempts to change the interface's MAC address to the requested value,
|
||||
* ie MAC spoofing or cloning.
|
||||
*
|
||||
* Returns: %TRUE if the request succeeded, %FALSE if it failed.
|
||||
**/
|
||||
gboolean
|
||||
nm_system_device_set_mac (const char *iface, const struct ether_addr *mac)
|
||||
nm_system_iface_set_mac (int ifindex, const struct ether_addr *mac)
|
||||
{
|
||||
struct rtnl_link *old;
|
||||
struct rtnl_link *new;
|
||||
struct rtnl_link *old, *new;
|
||||
gboolean success = FALSE;
|
||||
struct nl_handle *nlh;
|
||||
int iface_idx;
|
||||
const char *iface;
|
||||
struct nl_addr *addr = NULL;
|
||||
int err;
|
||||
|
||||
g_return_val_if_fail (iface != NULL, FALSE);
|
||||
g_return_val_if_fail (ifindex > 0, FALSE);
|
||||
g_return_val_if_fail (mac != NULL, FALSE);
|
||||
|
||||
iface = nm_netlink_index_to_iface (ifindex);
|
||||
g_return_val_if_fail (iface != NULL, FALSE);
|
||||
|
||||
new = rtnl_link_alloc ();
|
||||
if (!new)
|
||||
return FALSE;
|
||||
|
||||
iface_idx = nm_netlink_iface_to_index (iface);
|
||||
old = nm_netlink_index_to_rtnl_link (iface_idx);
|
||||
old = nm_netlink_index_to_rtnl_link (ifindex);
|
||||
if (old) {
|
||||
addr = nl_addr_build (AF_LLC, (void *) mac, ETH_ALEN);
|
||||
if (!addr) {
|
||||
char *mac_str;
|
||||
mac_str = g_strdup_printf ("%02X:%02X:%02X:%02X:%02X:%02X", mac->ether_addr_octet[0], mac->ether_addr_octet[1], mac->ether_addr_octet[2],
|
||||
mac->ether_addr_octet[3], mac->ether_addr_octet[4], mac->ether_addr_octet[5]);
|
||||
nm_log_err (LOGD_DEVICE, "(%s): could not allocate memory for MAC address (%s)", iface, mac_str);
|
||||
g_free (mac_str);
|
||||
nm_log_err (LOGD_HW, "(%s): failed to allocate memory for MAC address change", iface);
|
||||
return FALSE;
|
||||
}
|
||||
rtnl_link_set_addr (new, addr);
|
||||
nlh = nm_netlink_get_default_handle ();
|
||||
if (nlh) {
|
||||
rtnl_link_change (nlh, old, new, 0);
|
||||
success = TRUE;
|
||||
err = rtnl_link_change (nlh, old, new, 0);
|
||||
if (err == 0)
|
||||
success = TRUE;
|
||||
else
|
||||
nm_log_warn (LOGD_HW, "(%s): failed to change interface MAC address", iface);
|
||||
}
|
||||
rtnl_link_put (old);
|
||||
}
|
||||
|
|
@ -1177,12 +1218,8 @@ nm_system_replace_default_ip6_route (const char *iface, const struct in6_addr *g
|
|||
gboolean
|
||||
nm_system_iface_flush_addresses (int ifindex, int family)
|
||||
{
|
||||
const char *iface;
|
||||
|
||||
g_return_val_if_fail (ifindex > 0, FALSE);
|
||||
|
||||
iface = nm_netlink_index_to_iface (ifindex);
|
||||
return iface ? sync_addresses (iface, ifindex, family, NULL, 0) : FALSE;
|
||||
return sync_addresses (ifindex, family, NULL, 0);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1318,10 +1355,7 @@ nm_system_iface_flush_routes (int ifindex, int family)
|
|||
g_return_val_if_fail (ifindex > 0, FALSE);
|
||||
|
||||
iface = nm_netlink_index_to_iface (ifindex);
|
||||
if (iface < 0) {
|
||||
nm_log_warn (LOGD_DEVICE, "(%d) failed to lookup interface name", ifindex);
|
||||
return FALSE;
|
||||
}
|
||||
g_return_val_if_fail (iface != NULL, FALSE);
|
||||
|
||||
if (family == AF_INET) {
|
||||
log_level = LOGD_IP4;
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ gboolean nm_system_iface_flush_addresses (int ifindex, int family
|
|||
void nm_system_enable_loopback (void);
|
||||
void nm_system_update_dns (void);
|
||||
|
||||
gboolean nm_system_apply_ip4_config (const char *iface,
|
||||
gboolean nm_system_apply_ip4_config (int ifindex,
|
||||
NMIP4Config *config,
|
||||
int priority,
|
||||
NMIP4ConfigCompareFlags flags);
|
||||
|
|
@ -85,7 +85,8 @@ gboolean nm_system_iface_set_up (int ifindex,
|
|||
|
||||
gboolean nm_system_iface_is_up (int ifindex);
|
||||
|
||||
gboolean nm_system_device_set_mtu (const char *iface, guint32 mtu);
|
||||
gboolean nm_system_device_set_mac (const char *iface, const struct ether_addr *mac);
|
||||
gboolean nm_system_iface_set_mtu (int ifindex, guint32 mtu);
|
||||
|
||||
gboolean nm_system_iface_set_mac (int ifindex, const struct ether_addr *mac);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -539,7 +539,7 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy,
|
|||
|
||||
nm_system_iface_set_up (priv->ip_ifindex, TRUE, NULL);
|
||||
|
||||
if (nm_system_apply_ip4_config (priv->ip_iface, config, 0, NM_IP4_COMPARE_FLAG_ALL)) {
|
||||
if (nm_system_apply_ip4_config (priv->ip_ifindex, config, 0, NM_IP4_COMPARE_FLAG_ALL)) {
|
||||
NMDnsManager *dns_mgr;
|
||||
|
||||
/* Add any explicit route to the VPN gateway through the parent device */
|
||||
|
|
@ -971,7 +971,7 @@ vpn_cleanup (NMVPNConnection *connection)
|
|||
/* Reset routes and addresses of the currently active device */
|
||||
parent_config = nm_device_get_ip4_config (priv->parent_dev);
|
||||
if (parent_config) {
|
||||
if (!nm_system_apply_ip4_config (nm_device_get_ip_iface (priv->parent_dev),
|
||||
if (!nm_system_apply_ip4_config (nm_device_get_ip_ifindex (priv->parent_dev),
|
||||
nm_device_get_ip4_config (priv->parent_dev),
|
||||
nm_device_get_priority (priv->parent_dev),
|
||||
NM_IP4_COMPARE_FLAG_ADDRESSES | NM_IP4_COMPARE_FLAG_ROUTES)) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue