X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=PPI%2FSocketSink.cc;h=f3b724d34c7af0ca5d92a3a66b15176fcfcd126c;hb=92f8630b75f3ef50e73c48cde58645dcd1534e27;hp=5c13c6c72dcf202ca61facb9d978a009545774a7;hpb=0d0ad213c710645ba63515cfcd0e734d8ff2f1a5;p=senf.git diff --git a/PPI/SocketSink.cc b/PPI/SocketSink.cc index 5c13c6c..f3b724d 100644 --- a/PPI/SocketSink.cc +++ b/PPI/SocketSink.cc @@ -29,41 +29,114 @@ #define prefix_ +prefix_ senf::ppi::IPv4SourceForcingDgramWriter::IPv4SourceForcingDgramWriter(){ + source_ = senf::INet4Address::from_string("0.0.0.0"); + destination_ = senf::INet4Address::from_string("0.0.0.0"); + protocolId_ = 0; +} + +prefix_ senf::ppi::IPv4SourceForcingDgramWriter::IPv4SourceForcingDgramWriter(senf::INet4Address sourceAddr, senf::INet4SocketAddress destAddr){ + source(sourceAddr); + destination(destAddr); +} + +prefix_ void senf::ppi::IPv4SourceForcingDgramWriter::source(senf::INet4Address & source){ + source_ = source; +} +prefix_ void senf::ppi::IPv4SourceForcingDgramWriter::destination(senf::INet4SocketAddress & dest){ + destination_ = dest.address(); + protocolId_ = dest.port(); +} + +prefix_ void senf::ppi::IPv4SourceForcingDgramWriter::operator()(Handle handle, + Packet const & packet){ + sendtoandfrom( + handle.fd(), + reinterpret_cast (&*packet.data().begin()), + packet.size(), + reinterpret_cast (&destination_), + protocolId_, + reinterpret_cast (&source_)); +} + +prefix_ int senf::ppi::IPv4SourceForcingDgramWriter::sendtoandfrom( + int sock, + const void *data, + size_t dataLen, + const in_addr *dst, + int port, + const in_addr *src) +{ + uint8_t cbuf[CMSG_SPACE(sizeof(struct in_pktinfo))]; + struct cmsghdr *c = (struct cmsghdr *)cbuf; + struct in_pktinfo *pi; + struct iovec iov; + struct msghdr h; + + c->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo)); + c->cmsg_level = IPPROTO_IP; + c->cmsg_type = IP_PKTINFO; + + pi = (struct in_pktinfo *)CMSG_DATA(c); + pi->ipi_ifindex = 0; + memcpy(&pi->ipi_addr, src, 16); + + iov.iov_base = (void *)data; + iov.iov_len = dataLen; + + sockaddr_in dstpeer; + memset(&dstpeer, 0, sizeof(dstpeer)); + dstpeer.sin_family = AF_INET; + dstpeer.sin_addr = *dst; + dstpeer.sin_port = htons(port); + + memset(&h, 0, sizeof(h)); + h.msg_name = (struct sockaddr *)&dstpeer; + h.msg_namelen = sizeof(dstpeer); + h.msg_iov = &iov; + h.msg_iovlen = 1; + h.msg_control = c; + h.msg_controllen = sizeof(cbuf); + + return sendmsg(sock, &h, 0); +} + prefix_ senf::ppi::IPv6SourceForcingDgramWriter::IPv6SourceForcingDgramWriter(){ source_ = senf::INet6Address::from_string("0::0"); destination_ = senf::INet6Address::from_string("0::0"); - protocolId_ = 0; + protocolId_ = 0; } - + prefix_ senf::ppi::IPv6SourceForcingDgramWriter::IPv6SourceForcingDgramWriter(senf::INet6Address sourceAddr, senf::INet6SocketAddress destAddr){ source(sourceAddr); destination(destAddr); } prefix_ void senf::ppi::IPv6SourceForcingDgramWriter::source(senf::INet6Address & source){ - source_ = source; + source_ = source; } prefix_ void senf::ppi::IPv6SourceForcingDgramWriter::destination(senf::INet6SocketAddress & dest){ destination_ = dest.address(); protocolId_ = dest.port(); } -prefix_ void senf::ppi::IPv6SourceForcingDgramWriter::operator()(Handle handle, Packet packet){ +prefix_ void senf::ppi::IPv6SourceForcingDgramWriter::operator()(Handle handle, + Packet const & packet){ sendtoandfrom( - handle.fd(), - reinterpret_cast (&*packet.data().begin()), - packet.size(), - reinterpret_cast (&destination_), - protocolId_, + handle.fd(), + reinterpret_cast (&*packet.data().begin()), + packet.size(), + reinterpret_cast (&destination_), + protocolId_, reinterpret_cast (&source_)); } prefix_ int senf::ppi::IPv6SourceForcingDgramWriter::sendtoandfrom( - int sock, - const void *data, - size_t dataLen, + int sock, + const void *data, + size_t dataLen, const in6_addr *dst, - int port, + int port, const in6_addr *src) { uint8_t cbuf[CMSG_SPACE(sizeof(struct in6_pktinfo))];