mirror of
https://gitlab.com/openconnect/ocserv.git
synced 2026-10-13 18:12:03 +08:00
'guess' DST address in IPv6 links
This commit is contained in:
+56
-23
@@ -72,8 +72,10 @@ int get_ips(struct worker_st *ws, struct vpn_st *vinfo, char **buffer,
|
|||||||
|
|
||||||
if (strcmp(vinfo->name, ifa->ifa_name) == 0) {
|
if (strcmp(vinfo->name, ifa->ifa_name) == 0) {
|
||||||
p = (char *)inet_ntop(ifa->ifa_addr->sa_family,
|
p = (char *)inet_ntop(ifa->ifa_addr->sa_family,
|
||||||
SA_IN_P_TYPE(ifa->ifa_addr, ifa->ifa_addr->sa_family),
|
SA_IN_P_TYPE(ifa->ifa_addr,
|
||||||
*buffer, *buffer_size);
|
ifa->ifa_addr->
|
||||||
|
sa_family), *buffer,
|
||||||
|
*buffer_size);
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
e = errno;
|
e = errno;
|
||||||
oclog(ws, LOG_ERR, "inet_ntop error: %s",
|
oclog(ws, LOG_ERR, "inet_ntop error: %s",
|
||||||
@@ -95,32 +97,62 @@ int get_ips(struct worker_st *ws, struct vpn_st *vinfo, char **buffer,
|
|||||||
vinfo->ipv6_local = p;
|
vinfo->ipv6_local = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* DST */
|
if (ifa->ifa_addr->sa_family == AF_INET6) {
|
||||||
if (ifa->ifa_dstaddr == NULL)
|
/* no DST address */
|
||||||
continue;
|
struct in6_addr ip;
|
||||||
|
|
||||||
p = (char *)inet_ntop(ifa->ifa_dstaddr->sa_family,
|
memcpy(&ip,
|
||||||
SA_IN_P_TYPE(ifa->ifa_dstaddr, ifa->ifa_dstaddr->sa_family),
|
SA_IN_P_TYPE(ifa->ifa_addr,
|
||||||
*buffer, *buffer_size);
|
ifa->ifa_addr->sa_family),
|
||||||
if (p == NULL) {
|
sizeof(ip));
|
||||||
e = errno;
|
((uint8_t *) & ip)[15]++;
|
||||||
oclog(ws, LOG_ERR, "inet_ntop error: %s",
|
|
||||||
strerror(e));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = strlen(p) + 1;
|
p = (char *)inet_ntop(AF_INET6,
|
||||||
*buffer += ret;
|
&ip, *buffer,
|
||||||
*buffer_size -= ret;
|
*buffer_size);
|
||||||
|
if (p == NULL) {
|
||||||
|
e = errno;
|
||||||
|
oclog(ws, LOG_ERR,
|
||||||
|
"inet_ntop error: %s",
|
||||||
|
strerror(e));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = strlen(p) + 1;
|
||||||
|
*buffer += ret;
|
||||||
|
*buffer_size -= ret;
|
||||||
|
|
||||||
if (ifa->ifa_dstaddr->sa_family == AF_INET) {
|
|
||||||
if (strcmp(p, "0.0.0.0") == 0)
|
|
||||||
p = NULL;
|
|
||||||
vinfo->ipv4 = p;
|
|
||||||
} else {
|
|
||||||
if (strcmp(p, "::") == 0)
|
if (strcmp(p, "::") == 0)
|
||||||
p = NULL;
|
p = NULL;
|
||||||
vinfo->ipv6 = p;
|
vinfo->ipv6 = p;
|
||||||
|
} else {
|
||||||
|
/* DST */
|
||||||
|
if (ifa->ifa_dstaddr == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
p = (char *)inet_ntop(ifa->ifa_dstaddr->
|
||||||
|
sa_family,
|
||||||
|
SA_IN_P_TYPE(ifa->
|
||||||
|
ifa_dstaddr,
|
||||||
|
ifa->
|
||||||
|
ifa_dstaddr->
|
||||||
|
sa_family),
|
||||||
|
*buffer, *buffer_size);
|
||||||
|
if (p == NULL) {
|
||||||
|
e = errno;
|
||||||
|
oclog(ws, LOG_ERR,
|
||||||
|
"inet_ntop error: %s",
|
||||||
|
strerror(e));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = strlen(p) + 1;
|
||||||
|
*buffer += ret;
|
||||||
|
*buffer_size -= ret;
|
||||||
|
|
||||||
|
if (strcmp(p, "0.0.0.0") == 0)
|
||||||
|
p = NULL;
|
||||||
|
vinfo->ipv4 = p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -198,7 +230,8 @@ int get_rt_vpn_info(worker_st * ws,
|
|||||||
snprintf(ifr.ifr_name, IFNAMSIZ, "%s", vinfo->name);
|
snprintf(ifr.ifr_name, IFNAMSIZ, "%s", vinfo->name);
|
||||||
ret = ioctl(fd, SIOCGIFMTU, (caddr_t) & ifr);
|
ret = ioctl(fd, SIOCGIFMTU, (caddr_t) & ifr);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
oclog(ws, LOG_ERR, "cannot obtain MTU for %s. Assuming 1500",
|
oclog(ws, LOG_ERR,
|
||||||
|
"cannot obtain MTU for %s. Assuming 1500",
|
||||||
vinfo->name);
|
vinfo->name);
|
||||||
vinfo->mtu = 1500;
|
vinfo->mtu = 1500;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user