mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-02-07 19:10:31 +01:00
We only use IPV6_DEFAULTGW at the moment. That means we just support the gateway for the first IPv6 address/subnet. That should be changed later after we figure out what variables should be used.
This commit is contained in:
parent
bc6fc7b910
commit
1f004c1122
2 changed files with 54 additions and 14 deletions
|
|
@ -15,7 +15,7 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 2008 - 2010 Red Hat, Inc.
|
||||
* Copyright (C) 2008 - 2011 Red Hat, Inc.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
|
@ -886,11 +886,17 @@ error:
|
|||
}
|
||||
|
||||
static NMIP6Address *
|
||||
parse_full_ip6_address (const char *addr_str, GError **error)
|
||||
parse_full_ip6_address (shvarFile *ifcfg,
|
||||
const char *network_file,
|
||||
const char *addr_str,
|
||||
int i,
|
||||
GError **error)
|
||||
{
|
||||
NMIP6Address *addr = NULL;
|
||||
char **list;
|
||||
char *ip_tag, *prefix_tag;
|
||||
char *ip_val, *prefix_val;
|
||||
shvarFile *network_ifcfg;
|
||||
char *value = NULL;
|
||||
struct in6_addr tmp = IN6ADDR_ANY_INIT;
|
||||
gboolean success = FALSE;
|
||||
|
||||
|
|
@ -906,27 +912,26 @@ parse_full_ip6_address (const char *addr_str, GError **error)
|
|||
goto error;
|
||||
}
|
||||
|
||||
ip_tag = list[0];
|
||||
prefix_tag = list[1];
|
||||
ip_val = list[0];
|
||||
prefix_val = list[1];
|
||||
|
||||
addr = nm_ip6_address_new ();
|
||||
/* IP address */
|
||||
if (ip_tag) {
|
||||
if (!parse_ip6_address (ip_tag, &tmp, error))
|
||||
if (ip_val) {
|
||||
if (!parse_ip6_address (ip_val, &tmp, error))
|
||||
goto error;
|
||||
}
|
||||
|
||||
nm_ip6_address_set_address (addr, &tmp);
|
||||
|
||||
/* Prefix */
|
||||
if (prefix_tag) {
|
||||
if (prefix_val) {
|
||||
long int prefix;
|
||||
|
||||
errno = 0;
|
||||
prefix = strtol (prefix_tag, NULL, 10);
|
||||
prefix = strtol (prefix_val, NULL, 10);
|
||||
if (errno || prefix <= 0 || prefix > 128) {
|
||||
g_set_error (error, IFCFG_PLUGIN_ERROR, 0,
|
||||
"Invalid IP6 prefix '%s'", prefix_tag);
|
||||
"Invalid IP6 prefix '%s'", prefix_val);
|
||||
goto error;
|
||||
}
|
||||
nm_ip6_address_set_prefix (addr, (guint32) prefix);
|
||||
|
|
@ -935,6 +940,32 @@ parse_full_ip6_address (const char *addr_str, GError **error)
|
|||
nm_ip6_address_set_prefix (addr, 64);
|
||||
}
|
||||
|
||||
/* Gateway */
|
||||
tmp = in6addr_any;
|
||||
value = svGetValue (ifcfg, "IPV6_DEFAULTGW", FALSE);
|
||||
if (i != 0) {
|
||||
/* We don't support gateways for IPV6ADDR_SECONDARIES yet */
|
||||
g_free (value);
|
||||
value = NULL;
|
||||
}
|
||||
if (!value) {
|
||||
/* If no gateway in the ifcfg, try global /etc/sysconfig/network instead */
|
||||
network_ifcfg = svNewFile (network_file);
|
||||
if (network_ifcfg) {
|
||||
value = svGetValue (network_ifcfg, "IPV6_DEFAULTGW", FALSE);
|
||||
svCloseFile (network_ifcfg);
|
||||
}
|
||||
}
|
||||
if (value) {
|
||||
char *ptr;
|
||||
|
||||
if ((ptr = strchr (value, '%')) != NULL)
|
||||
*ptr = '\0'; /* remove %interface prefix if present */
|
||||
if (!parse_ip6_address (value, &tmp, error))
|
||||
goto error;
|
||||
nm_ip6_address_set_gateway (addr, &tmp);
|
||||
}
|
||||
|
||||
success = TRUE;
|
||||
|
||||
error:
|
||||
|
|
@ -944,6 +975,7 @@ error:
|
|||
}
|
||||
|
||||
g_strfreev (list);
|
||||
g_free (value);
|
||||
return addr;
|
||||
}
|
||||
|
||||
|
|
@ -1507,8 +1539,8 @@ make_ip6_setting (shvarFile *ifcfg,
|
|||
|
||||
list = g_strsplit_set (val, " ", 0);
|
||||
g_free (val);
|
||||
for (iter = list; iter && *iter; iter++, i++) {
|
||||
addr = parse_full_ip6_address (*iter, error);
|
||||
for (iter = list, i = 0; iter && *iter; iter++, i++) {
|
||||
addr = parse_full_ip6_address (ifcfg, network_file, *iter, i, error);
|
||||
if (!addr) {
|
||||
g_strfreev (list);
|
||||
goto error;
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 2009 - 2010 Red Hat, Inc.
|
||||
* Copyright (C) 2009 - 2011 Red Hat, Inc.
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
|
|
@ -1408,6 +1408,13 @@ write_ip6_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
|
|||
g_string_append_c (ip_ptr, '/');
|
||||
g_string_append (ip_ptr, prefix);
|
||||
g_free (prefix);
|
||||
|
||||
/* We only support gateway for the first IP address for now */
|
||||
if (i == 0) {
|
||||
ip = nm_ip6_address_get_gateway (addr);
|
||||
inet_ntop (AF_INET6, (const void *) ip, buf, sizeof (buf));
|
||||
svSetValue (ifcfg, "IPV6_DEFAULTGW", buf, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
svSetValue (ifcfg, "IPV6ADDR", ip_str1->str, FALSE);
|
||||
|
|
@ -1417,6 +1424,7 @@ write_ip6_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
|
|||
} else {
|
||||
svSetValue (ifcfg, "IPV6ADDR", NULL, FALSE);
|
||||
svSetValue (ifcfg, "IPV6ADDR_SECONDARIES", NULL, FALSE);
|
||||
svSetValue (ifcfg, "IPV6_DEFAULTGW", NULL, FALSE);
|
||||
}
|
||||
|
||||
/* Write out DNS - 'DNS' key is used both for IPv4 and IPv6 */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue