Utils/Console: Add short help to 'ls' output
[senf.git] / PPI / SocketSink.cc
index 5c13c6c..f3b724d 100644 (file)
 
 #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<void*> (&*packet.data().begin()),
+            packet.size(),
+            reinterpret_cast<in_addr*> (&destination_),
+            protocolId_,
+            reinterpret_cast<in_addr*> (&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<void*> (&*packet.data().begin()), 
-            packet.size(), 
-            reinterpret_cast<in6_addr*> (&destination_), 
-            protocolId_, 
+            handle.fd(),
+            reinterpret_cast<void*> (&*packet.data().begin()),
+            packet.size(),
+            reinterpret_cast<in6_addr*> (&destination_),
+            protocolId_,
             reinterpret_cast<in6_addr*> (&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))];