diff options
Diffstat (limited to 'drivers/net/netconsole.c')
| -rw-r--r-- | drivers/net/netconsole.c | 44 | 
1 files changed, 40 insertions, 4 deletions
| diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 6989ebe2bc79..37add21a3d7d 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -269,12 +269,18 @@ static ssize_t show_remote_port(struct netconsole_target *nt, char *buf)  static ssize_t show_local_ip(struct netconsole_target *nt, char *buf)  { -	return snprintf(buf, PAGE_SIZE, "%pI4\n", &nt->np.local_ip); +	if (nt->np.ipv6) +		return snprintf(buf, PAGE_SIZE, "%pI6c\n", &nt->np.local_ip.in6); +	else +		return snprintf(buf, PAGE_SIZE, "%pI4\n", &nt->np.local_ip);  }  static ssize_t show_remote_ip(struct netconsole_target *nt, char *buf)  { -	return snprintf(buf, PAGE_SIZE, "%pI4\n", &nt->np.remote_ip); +	if (nt->np.ipv6) +		return snprintf(buf, PAGE_SIZE, "%pI6c\n", &nt->np.remote_ip.in6); +	else +		return snprintf(buf, PAGE_SIZE, "%pI4\n", &nt->np.remote_ip);  }  static ssize_t show_local_mac(struct netconsole_target *nt, char *buf) @@ -410,7 +416,22 @@ static ssize_t store_local_ip(struct netconsole_target *nt,  		return -EINVAL;  	} -	nt->np.local_ip = in_aton(buf); +	if (strnchr(buf, count, ':')) { +		const char *end; +		if (in6_pton(buf, count, nt->np.local_ip.in6.s6_addr, -1, &end) > 0) { +			if (*end && *end != '\n') { +				printk(KERN_ERR "netconsole: invalid IPv6 address at: <%c>\n", *end); +				return -EINVAL; +			} +			nt->np.ipv6 = true; +		} else +			return -EINVAL; +	} else { +		if (!nt->np.ipv6) { +			nt->np.local_ip.ip = in_aton(buf); +		} else +			return -EINVAL; +	}  	return strnlen(buf, count);  } @@ -426,7 +447,22 @@ static ssize_t store_remote_ip(struct netconsole_target *nt,  		return -EINVAL;  	} -	nt->np.remote_ip = in_aton(buf); +	if (strnchr(buf, count, ':')) { +		const char *end; +		if (in6_pton(buf, count, nt->np.remote_ip.in6.s6_addr, -1, &end) > 0) { +			if (*end && *end != '\n') { +				printk(KERN_ERR "netconsole: invalid IPv6 address at: <%c>\n", *end); +				return -EINVAL; +			} +			nt->np.ipv6 = true; +		} else +			return -EINVAL; +	} else { +		if (!nt->np.ipv6) { +			nt->np.remote_ip.ip = in_aton(buf); +		} else +			return -EINVAL; +	}  	return strnlen(buf, count);  } |