summaryrefslogtreecommitdiff
path: root/accel-pppd/ipv6
diff options
context:
space:
mode:
authorDmitry Kozlov <xeb@mail.ru>2016-07-11 09:47:04 +0300
committerDmitry Kozlov <xeb@mail.ru>2016-07-11 09:47:04 +0300
commite0cca4344f70b9c9e23e3c6a7e17c8e93c765184 (patch)
tree1068654b025b2e24c983d99776696ad889a0c138 /accel-pppd/ipv6
parent6fb04941ca41312909208938bfac4f753d3c277c (diff)
downloadaccel-ppp-e0cca4344f70b9c9e23e3c6a7e17c8e93c765184.tar.gz
accel-ppp-e0cca4344f70b9c9e23e3c6a7e17c8e93c765184.zip
implemented support for network namespace
This is done using radius attribute NAS-Port-Id. The new format of this attribute is NAS-Port-Id=[ns/][name]. Namespaces must be created malually by "ip netns add ..." command
Diffstat (limited to 'accel-pppd/ipv6')
-rw-r--r--accel-pppd/ipv6/dhcpv6.c22
-rw-r--r--accel-pppd/ipv6/nd.c21
2 files changed, 22 insertions, 21 deletions
diff --git a/accel-pppd/ipv6/dhcpv6.c b/accel-pppd/ipv6/dhcpv6.c
index e170ae21..f147a8cd 100644
--- a/accel-pppd/ipv6/dhcpv6.c
+++ b/accel-pppd/ipv6/dhcpv6.c
@@ -66,15 +66,15 @@ static void ev_ses_started(struct ap_session *ses)
if (!ses->ipv6)
return;
- sock = socket(AF_INET6, SOCK_DGRAM, 0);
+ sock = net->socket(AF_INET6, SOCK_DGRAM, 0);
if (!sock) {
log_ppp_error("dhcpv6: socket: %s\n", strerror(errno));
return;
}
- setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &f, sizeof(f));
+ net->setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &f, sizeof(f));
- if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, ses->ifname, strlen(ses->ifname))) {
+ if (net->setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, ses->ifname, strlen(ses->ifname))) {
log_ppp_error("ipv6_nd: setsockopt(SO_BINDTODEVICE): %s\n", strerror(errno));
close(sock);
return;
@@ -84,7 +84,7 @@ static void ev_ses_started(struct ap_session *ses)
addr.sin6_family = AF_INET6;
addr.sin6_port = htons(DHCPV6_SERV_PORT);
- if (bind(sock, (struct sockaddr *)&addr, sizeof(addr))) {
+ if (net->bind(sock, (struct sockaddr *)&addr, sizeof(addr))) {
log_ppp_error("dhcpv6: bind: %s\n", strerror(errno));
close(sock);
return;
@@ -95,14 +95,14 @@ static void ev_ses_started(struct ap_session *ses)
mreq.ipv6mr_multiaddr.s6_addr32[0] = htonl(0xff020000);
mreq.ipv6mr_multiaddr.s6_addr32[3] = htonl(0x010002);
- if (setsockopt(sock, SOL_IPV6, IPV6_ADD_MEMBERSHIP, &mreq, sizeof(mreq))) {
+ if (net->setsockopt(sock, SOL_IPV6, IPV6_ADD_MEMBERSHIP, &mreq, sizeof(mreq))) {
log_ppp_error("dhcpv6: failed to join to All_DHCP_Relay_Agents_and_Servers\n");
close(sock);
return;
}
- fcntl(sock, F_SETFL, O_NONBLOCK);
fcntl(sock, F_SETFD, fcntl(sock, F_GETFD) | FD_CLOEXEC);
+ net->set_nonblocking(sock, 1);
pd = _malloc(sizeof(*pd));
memset(pd, 0, sizeof(*pd));
@@ -189,7 +189,7 @@ static void insert_dp_routes(struct ap_session *ses, struct dhcpv6_pd *pd)
rt6.rtmsg_flags |= RTF_GATEWAY;
list_for_each_entry(a, &ses->ipv6->addr_list, entry) {
build_addr(a, ses->ipv6->peer_intf_id, &rt6.rtmsg_gateway);
- if (ioctl(sock6_fd, SIOCADDRT, &rt6)) {
+ if (net->sock6_ioctl(SIOCADDRT, &rt6)) {
err = errno;
inet_ntop(AF_INET6, &p->addr, str1, sizeof(str1));
inet_ntop(AF_INET6, &rt6.rtmsg_gateway, str2, sizeof(str2));
@@ -202,7 +202,7 @@ static void insert_dp_routes(struct ap_session *ses, struct dhcpv6_pd *pd)
rt6.rtmsg_metric++;
}
} else {
- if (ioctl(sock6_fd, SIOCADDRT, &rt6)) {
+ if (net->sock6_ioctl(SIOCADDRT, &rt6)) {
err = errno;
inet_ntop(AF_INET6, &p->addr, str1, sizeof(str1));
log_ppp_error("dhcpv6: route add %s/%i: %s\n",
@@ -457,7 +457,7 @@ static void dhcpv6_send_reply(struct dhcpv6_packet *req, struct dhcpv6_pd *pd, i
dhcpv6_packet_print(reply, log_ppp_info2);
}
- sendto(pd->hnd.fd, reply->hdr, reply->endptr - (void *)reply->hdr, 0, (struct sockaddr *)&req->addr, sizeof(req->addr));
+ net->sendto(pd->hnd.fd, reply->hdr, reply->endptr - (void *)reply->hdr, 0, (struct sockaddr *)&req->addr, sizeof(req->addr));
dhcpv6_packet_free(reply);
}
@@ -609,7 +609,7 @@ static void dhcpv6_send_reply2(struct dhcpv6_packet *req, struct dhcpv6_pd *pd,
dhcpv6_packet_print(reply, log_ppp_info2);
}
- sendto(pd->hnd.fd, reply->hdr, reply->endptr - (void *)reply->hdr, 0, (struct sockaddr *)&req->addr, sizeof(req->addr));
+ net->sendto(pd->hnd.fd, reply->hdr, reply->endptr - (void *)reply->hdr, 0, (struct sockaddr *)&req->addr, sizeof(req->addr));
out:
dhcpv6_packet_free(reply);
@@ -799,7 +799,7 @@ static int dhcpv6_read(struct triton_md_handler_t *h)
uint8_t *buf = _malloc(BUF_SIZE);
while (1) {
- n = recvfrom(h->fd, buf, BUF_SIZE, 0, &addr, &len);
+ n = net->recvfrom(h->fd, buf, BUF_SIZE, 0, (struct sockaddr *)&addr, &len);
if (n == -1) {
if (errno == EAGAIN)
break;
diff --git a/accel-pppd/ipv6/nd.c b/accel-pppd/ipv6/nd.c
index 19a3d7d3..1d70ae95 100644
--- a/accel-pppd/ipv6/nd.c
+++ b/accel-pppd/ipv6/nd.c
@@ -185,7 +185,7 @@ static void ipv6_nd_send_ra(struct ipv6_nd_handler_t *h, struct sockaddr_in6 *ad
} else
endptr = rdnss_addr;
- sendto(h->hnd.fd, buf, endptr - buf, 0, (struct sockaddr *)addr, sizeof(*addr));
+ net->sendto(h->hnd.fd, buf, endptr - buf, 0, (struct sockaddr *)addr, sizeof(*addr));
mempool_free(buf);
}
@@ -225,7 +225,7 @@ static int ipv6_nd_read(struct triton_md_handler_t *_h)
}
while (1) {
- n = recvfrom(h->hnd.fd, icmph, BUF_SIZE, 0, &addr, &addr_len);
+ n = net->recvfrom(h->hnd.fd, icmph, BUF_SIZE, 0, (struct sockaddr *)&addr, &addr_len);
if (n == -1) {
if (errno == EAGAIN)
break;
@@ -269,31 +269,31 @@ static int ipv6_nd_start(struct ap_session *ses)
int val;
struct ipv6_nd_handler_t *h;
- sock = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
+ sock = net->socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
if (sock < 0) {
log_ppp_error("socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6): %s\n", strerror(errno));
return -1;
}
- if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, ses->ifname, strlen(ses->ifname))) {
+ if (net->setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, ses->ifname, strlen(ses->ifname))) {
log_ppp_error("ipv6_nd: setsockopt(SO_BINDTODEVICE): %s\n", strerror(errno));
goto out_err;
}
val = 2;
- if (setsockopt(sock, IPPROTO_RAW, IPV6_CHECKSUM, &val, sizeof(val))) {
+ if (net->setsockopt(sock, IPPROTO_RAW, IPV6_CHECKSUM, &val, sizeof(val))) {
log_ppp_error("ipv6_nd: setsockopt(IPV6_CHECKSUM): %s\n", strerror(errno));
goto out_err;
}
val = 255;
- if (setsockopt(sock, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &val, sizeof(val))) {
+ if (net->setsockopt(sock, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &val, sizeof(val))) {
log_ppp_error("ipv6_nd: setsockopt(IPV6_UNICAST_HOPS): %s\n", strerror(errno));
goto out_err;
}
- if (setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &val, sizeof(val))) {
+ if (net->setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &val, sizeof(val))) {
log_ppp_error("ipv6_nd: setsockopt(IPV6_MULTICAST_HOPS): %s\n", strerror(errno));
goto out_err;
}
@@ -307,7 +307,7 @@ static int ipv6_nd_start(struct ap_session *ses)
ICMP6_FILTER_SETBLOCKALL(&filter);
ICMP6_FILTER_SETPASS(ND_ROUTER_SOLICIT, &filter);
- if (setsockopt(sock, IPPROTO_ICMPV6, ICMP6_FILTER, &filter, sizeof(filter))) {
+ if (net->setsockopt(sock, IPPROTO_ICMPV6, ICMP6_FILTER, &filter, sizeof(filter))) {
log_ppp_error("ipv6_nd: setsockopt(ICMP6_FILTER): %s\n", strerror(errno));
goto out_err;
}
@@ -317,13 +317,14 @@ static int ipv6_nd_start(struct ap_session *ses)
mreq.ipv6mr_multiaddr.s6_addr32[0] = htonl(0xff020000);
mreq.ipv6mr_multiaddr.s6_addr32[3] = htonl(0x2);
- if (setsockopt(sock, SOL_IPV6, IPV6_ADD_MEMBERSHIP, &mreq, sizeof(mreq))) {
+ if (net->setsockopt(sock, SOL_IPV6, IPV6_ADD_MEMBERSHIP, &mreq, sizeof(mreq))) {
log_ppp_error("ipv6_nd: failed to join ipv6 allrouters\n");
goto out_err;
}
fcntl(sock, F_SETFD, fcntl(sock, F_GETFD) | FD_CLOEXEC);
- fcntl(sock, F_SETFL, O_NONBLOCK);
+
+ net->set_nonblocking(sock, 1);
h = _malloc(sizeof(*h));
memset(h, 0, sizeof(*h));