11 #include "../../hal/socket.h"
13 #include <sys/socket.h>
14 #include <netinet/in.h>
15 #include <netinet/tcp.h>
16 #include <arpa/inet.h>
20 #include <sys/ioctl.h>
21 #include <linux/can.h>
22 #include <linux/can/raw.h>
26 namespace rp{
namespace net {
40 assert(!
"should not reach here");
51 reinterpret_cast<sockaddr_storage *
>(
_platform_data)->ss_family = AF_INET;
68 reinterpret_cast<sockaddr_storage *
>(
_platform_data)->ss_family = AF_INET;
75 : _platform_data(platform_data)
92 switch(
reinterpret_cast<const sockaddr_storage *
>(
_platform_data)->ss_family) {
98 assert(!
"should not reach here");
107 return (
int)ntohs(
reinterpret_cast<const sockaddr_in *
>(
_platform_data)->sin_port);
109 return (
int)ntohs(
reinterpret_cast<const sockaddr_in6 *
>(
_platform_data)->sin6_port);
119 reinterpret_cast<sockaddr_in *
>(
_platform_data)->sin_port = htons((
short)port);
122 reinterpret_cast<sockaddr_in6 *
>(
_platform_data)->sin6_port = htons((
short)port);
136 reinterpret_cast<sockaddr_storage *
>(
_platform_data)->ss_family = AF_INET;
137 ans = inet_pton(AF_INET,
145 reinterpret_cast<sockaddr_storage *
>(
_platform_data)->ss_family = AF_INET6;
146 ans = inet_pton(AF_INET6,
163 int net_family =
reinterpret_cast<const sockaddr_storage *
>(
_platform_data)->ss_family;
164 const char *ans = NULL;
165 switch (net_family) {
167 ans = inet_ntop(net_family, &
reinterpret_cast<const sockaddr_in *
>(
_platform_data)->sin_addr,
172 ans = inet_ntop(net_family, &
reinterpret_cast<const sockaddr_in6 *
>(
_platform_data)->sin6_addr,
184 struct addrinfo hints;
188 memset(&hints, 0,
sizeof(
struct addrinfo));
190 hints.ai_flags = AI_PASSIVE;
193 hints.ai_family |= AI_NUMERICSERV | AI_NUMERICHOST;
197 ans = getaddrinfo(hostname, sevicename, &hints, &
result);
207 for (
struct addrinfo * cursor =
result; cursor != NULL; cursor = cursor->ai_next) {
209 sockaddr_storage * storagebuffer =
new sockaddr_storage;
210 assert(
sizeof(sockaddr_storage) >= cursor->ai_addrlen);
211 memcpy(storagebuffer, cursor->ai_addr, cursor->ai_addrlen);
219 return addresspool.size();
229 memcpy(buffer, &
reinterpret_cast<const sockaddr_in *
>(
_platform_data)->sin_addr.s_addr,
sizeof(
reinterpret_cast<const sockaddr_in *
>(
_platform_data)->sin_addr.s_addr));
235 memcpy(buffer,
reinterpret_cast<const sockaddr_in6 *
>(
_platform_data)->sin6_addr.s6_addr,
sizeof(
reinterpret_cast<const sockaddr_in6 *
>(
_platform_data)->sin6_addr.s6_addr));
252 sockaddr_in * addrv4 =
reinterpret_cast<sockaddr_in *
>(
_platform_data);
253 addrv4->sin_family = AF_INET;
254 addrv4->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
259 sockaddr_in6 * addrv6 =
reinterpret_cast<sockaddr_in6 *
>(
_platform_data);
260 addrv6->sin6_family = AF_INET6;
261 addrv6->sin6_addr = in6addr_loopback;
276 sockaddr_in * addrv4 =
reinterpret_cast<sockaddr_in *
>(
_platform_data);
277 addrv4->sin_family = AF_INET;
278 addrv4->sin_addr.s_addr = htonl(INADDR_BROADCAST);
289 sockaddr_in * addrv4 =
reinterpret_cast<sockaddr_in *
>(
_platform_data);
290 addrv4->sin_family = AF_INET;
291 addrv4->sin_addr.s_addr = htonl(INADDR_ANY);
296 sockaddr_in6 * addrv6 =
reinterpret_cast<sockaddr_in6 *
>(
_platform_data);
297 addrv6->sin6_family = AF_INET6;
298 addrv6->sin6_addr = in6addr_any;
319 namespace rp {
namespace arch {
namespace net{
332 ::setsockopt( _socket_fd, SOL_SOCKET, SO_REUSEADDR , (
char *)&bool_true,
sizeof(bool_true) );
335 this->setTimeout(DEFAULT_SOCKET_TIMEOUT, SOCKET_DIR_BOTH);
351 const struct sockaddr * addr =
reinterpret_cast<const struct sockaddr *
>(localaddr.
getPlatformData());
353 int ans = ::bind(_socket_fd, addr,
sizeof(sockaddr_storage));
363 struct sockaddr * addr =
reinterpret_cast<struct sockaddr *
>(
const_cast<void *
>(localaddr.
getPlatformData()));
366 size_t actualsize =
sizeof(sockaddr_storage);
367 int ans = ::getsockname(_socket_fd, addr, (socklen_t*)&actualsize);
369 assert(actualsize <=
sizeof(sockaddr_storage));
370 assert(addr->sa_family == AF_INET || addr->sa_family == AF_INET6);
379 tv.tv_sec = timeout / 1000;
380 tv.tv_usec = (timeout % 1000) * 1000;
382 if (msk & SOCKET_DIR_RD) {
383 ans = ::setsockopt( _socket_fd, SOL_SOCKET, SO_RCVTIMEO, &tv,
sizeof(tv) );
387 if (msk & SOCKET_DIR_WR) {
388 ans = ::setsockopt( _socket_fd, SOL_SOCKET, SO_SNDTIMEO, &tv,
sizeof(tv) );
397 const struct sockaddr * addr =
reinterpret_cast<const struct sockaddr *
>(pairAddress.
getPlatformData());
398 int ans = ::connect(_socket_fd, addr,
sizeof(sockaddr_storage));
418 int ans = ::listen( _socket_fd, backlog);
426 addrsize =
sizeof(sockaddr_storage);
427 int pair_socket = ::accept( _socket_fd, pairAddress?
reinterpret_cast<struct sockaddr *
>(
const_cast<void *
>(pairAddress->
getPlatformData())):NULL
428 , (socklen_t*)&addrsize);
430 if (pair_socket>=0) {
439 return waitforData(timeout);
444 size_t ans = ::send( _socket_fd, buffer, len, MSG_NOSIGNAL);
450 #if EWOULDBLOCK!=EAGAIN
464 size_t ans = ::recv( _socket_fd, buf, len, 0);
465 if (ans == (
size_t)-1) {
470 #if EWOULDBLOCK!=EAGAIN
487 virtual u_result recvNoWait(
void *buf,
size_t len,
size_t & recv_len)
489 size_t ans = ::recv( _socket_fd, buf, len, MSG_DONTWAIT);
490 if (ans == (
size_t)-1) {
492 if (errno == EAGAIN || errno == EWOULDBLOCK) {
509 struct sockaddr * addr =
reinterpret_cast<struct sockaddr *
>(
const_cast<void *
>(peerAddr.
getPlatformData()));
511 size_t actualsize =
sizeof(sockaddr_storage);
512 int ans = ::getpeername(_socket_fd, addr, (socklen_t*)&actualsize);
514 assert(actualsize <=
sizeof(sockaddr_storage));
515 assert(addr->sa_family == AF_INET || addr->sa_family == AF_INET6);
527 shutdw_opt = SHUT_RD;
530 shutdw_opt = SHUT_WR;
532 case SOCKET_DIR_BOTH:
534 shutdw_opt = SHUT_RDWR;
537 int ans = ::shutdown(_socket_fd, shutdw_opt);
543 int bool_true = enable?1:0;
549 int bool_true = enable?1:0;
557 FD_SET(_socket_fd, &wrset);
560 tv.tv_sec = timeout / 1000;
561 tv.tv_usec = (timeout % 1000) * 1000;
562 int ans = ::select(_socket_fd+1, NULL, &wrset, NULL, &tv);
581 FD_SET(_socket_fd, &rdset);
584 tv.tv_sec = timeout / 1000;
585 tv.tv_usec = (timeout % 1000) * 1000;
586 int ans = ::select(_socket_fd+1, &rdset, NULL, NULL, &tv);
617 ::setsockopt( _socket_fd, SOL_SOCKET, SO_REUSEADDR | SO_BROADCAST , (
char *)&bool_true,
sizeof(bool_true) );
618 setTimeout(DEFAULT_SOCKET_TIMEOUT, SOCKET_DIR_BOTH);
634 const struct sockaddr * addr =
reinterpret_cast<const struct sockaddr *
>(localaddr.
getPlatformData());
636 int ans = ::bind(_socket_fd, addr,
sizeof(sockaddr_storage));
646 struct sockaddr * addr =
reinterpret_cast<struct sockaddr *
>(
const_cast<void *
>((localaddr.
getPlatformData())));
649 size_t actualsize =
sizeof(sockaddr_storage);
650 int ans = ::getsockname(_socket_fd, addr, (socklen_t*)&actualsize);
652 assert(actualsize <=
sizeof(sockaddr_storage));
653 assert(addr->sa_family == AF_INET || addr->sa_family == AF_INET6);
662 tv.tv_sec = timeout / 1000;
663 tv.tv_usec = (timeout % 1000) * 1000;
665 if (msk & SOCKET_DIR_RD) {
666 ans = ::setsockopt( _socket_fd, SOL_SOCKET, SO_RCVTIMEO, &tv,
sizeof(tv) );
670 if (msk & SOCKET_DIR_WR) {
671 ans = ::setsockopt( _socket_fd, SOL_SOCKET, SO_SNDTIMEO, &tv,
sizeof(tv) );
683 FD_SET(_socket_fd, &wrset);
686 tv.tv_sec = timeout / 1000;
687 tv.tv_usec = (timeout % 1000) * 1000;
688 int ans = ::select(_socket_fd+1, NULL, &wrset, NULL, &tv);
707 FD_SET(_socket_fd, &rdset);
710 tv.tv_sec = timeout / 1000;
711 tv.tv_usec = (timeout % 1000) * 1000;
712 int ans = ::select(_socket_fd+1, &rdset, NULL, NULL, &tv);
729 const struct sockaddr * addr = target ?
reinterpret_cast<const struct sockaddr *
>(target->
getPlatformData()) : NULL;
730 int dest_addr_size = (target ?
sizeof(sockaddr_storage) : 0);
731 int ans = ::sendto(_socket_fd, (
const char *)buffer, (
int)len, 0, addr, dest_addr_size);
738 #if EWOULDBLOCK!=EAGAIN
755 sockaddr_storage unspecAddr;
756 unspecAddr.ss_family = AF_UNSPEC;
758 const struct sockaddr* addr = pairAddress ?
reinterpret_cast<const struct sockaddr*
>(pairAddress->
getPlatformData()) :
reinterpret_cast<const struct sockaddr*
>(&unspecAddr);
759 int ans = ::connect(_socket_fd, addr, (
int)
sizeof(sockaddr_storage));
771 FD_SET(_socket_fd, &rdset);
775 memset(recv_data, 0,
sizeof(recv_data));
777 res = select(FD_SETSIZE, &rdset,
nullptr,
nullptr, &tv);
779 recv(_socket_fd, recv_data, 1, 0);
786 struct sockaddr * addr = (sourceAddr?
reinterpret_cast<struct sockaddr *
>(
const_cast<void *
>(sourceAddr->
getPlatformData())):NULL);
787 size_t source_addr_size = (sourceAddr?
sizeof(sockaddr_storage):0);
789 size_t ans = ::recvfrom( _socket_fd, buf, len, 0, addr, (socklen_t*)&source_addr_size);
790 if (ans == (
size_t)-1) {
794 #if EWOULDBLOCK!=EAGAIN
810 virtual u_result recvFromNoWait(
void *buf,
size_t len,
size_t & recv_len,
SocketAddress * sourceAddr)
812 struct sockaddr * addr = (sourceAddr?
reinterpret_cast<struct sockaddr *
>(
const_cast<void *
>(sourceAddr->
getPlatformData())):NULL);
813 size_t source_addr_size = (sourceAddr?
sizeof(sockaddr_storage):0);
816 size_t ans = ::recvfrom( _socket_fd, buf, len, MSG_DONTWAIT, addr, &source_addr_size);
818 if (ans == (
size_t)-1) {
820 if (errno == EAGAIN || errno == EWOULDBLOCK) {
844 namespace rp {
namespace net{
857 assert(!
"should not reach here");
869 int socket_fd = ::socket(socket_family, SOCK_STREAM, 0);
870 if (socket_fd == -1)
return NULL;
883 int socket_fd = ::socket(socket_family, (family==
SOCKET_FAMILY_RAW)?SOCK_RAW:SOCK_DGRAM, 0);
884 if (socket_fd == -1)
return NULL;