Fix SCons 1.2.0 build failure
[senf.git] / senf / PPI / SocketSink.cc
1 // $Id: SocketSink.cc 661 2008-02-05 09:53:54Z dw6 $
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //    David Wagner <dw6@berlios.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \file
24     \brief SocketSink non-inline non-template implementation */
25
26 // Custom includes
27 #include "SocketSink.hh"
28 #include "../Socket/ClientSocketHandle.hh"
29
30 #define prefix_
31
32 prefix_ senf::ppi::IPv4SourceForcingDgramWriter::IPv4SourceForcingDgramWriter(){
33     source_ = senf::INet4Address::from_string("0.0.0.0");
34     destination_ = senf::INet4Address::from_string("0.0.0.0");
35     protocolId_ = 0;
36 }
37
38 prefix_ senf::ppi::IPv4SourceForcingDgramWriter::IPv4SourceForcingDgramWriter(senf::INet4Address sourceAddr, senf::INet4SocketAddress destAddr){
39     source(sourceAddr);
40     destination(destAddr);
41 }
42
43 prefix_ void senf::ppi::IPv4SourceForcingDgramWriter::source(senf::INet4Address & source){
44     source_ = source;
45 }
46 prefix_ void senf::ppi::IPv4SourceForcingDgramWriter::destination(senf::INet4SocketAddress & dest){
47     destination_ = dest.address();
48     protocolId_ = dest.port();
49 }
50
51 prefix_ void senf::ppi::IPv4SourceForcingDgramWriter::operator()(Handle handle, 
52                                                                  Packet const & packet)
53 {
54     sendtoandfrom(
55             handle.fd(),
56             reinterpret_cast<void*> (&*packet.data().begin()),
57             packet.size(),
58             reinterpret_cast<in_addr*> (&destination_),
59             protocolId_,
60             reinterpret_cast<in_addr*> (&source_));
61 }
62
63 prefix_ int senf::ppi::IPv4SourceForcingDgramWriter::sendtoandfrom(
64         int sock,
65         const void *data,
66         size_t dataLen,
67         const in_addr *dst,
68         int port,
69         const in_addr *src)
70 {
71     uint8_t cbuf[CMSG_SPACE(sizeof(struct in_pktinfo))];
72     struct cmsghdr *c = (struct cmsghdr *)cbuf;
73     struct in_pktinfo *pi;
74     struct iovec iov;
75     struct msghdr h;
76
77     c->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
78     c->cmsg_level = IPPROTO_IP;
79     c->cmsg_type = IP_PKTINFO;
80
81     pi = (struct in_pktinfo *)CMSG_DATA(c);
82     pi->ipi_ifindex = 0;
83     memcpy(&pi->ipi_addr, src, 16);
84
85     iov.iov_base = (void *)data;
86     iov.iov_len = dataLen;
87
88     sockaddr_in dstpeer;
89     memset(&dstpeer, 0, sizeof(dstpeer));
90     dstpeer.sin_family = AF_INET;
91     dstpeer.sin_addr = *dst;
92     dstpeer.sin_port = htons(port);
93
94     memset(&h, 0, sizeof(h));
95     h.msg_name = (struct sockaddr *)&dstpeer;
96     h.msg_namelen = sizeof(dstpeer);
97     h.msg_iov = &iov;
98     h.msg_iovlen = 1;
99     h.msg_control = c;
100     h.msg_controllen = sizeof(cbuf);
101
102     return sendmsg(sock, &h, 0);
103 }
104
105 prefix_ senf::ppi::IPv6SourceForcingDgramWriter::IPv6SourceForcingDgramWriter(){
106     source_ = senf::INet6Address::from_string("0::0");
107     destination_ = senf::INet6Address::from_string("0::0");
108     protocolId_ = 0;
109 }
110
111 prefix_ senf::ppi::IPv6SourceForcingDgramWriter::IPv6SourceForcingDgramWriter(senf::INet6Address sourceAddr, senf::INet6SocketAddress destAddr){
112     source(sourceAddr);
113     destination(destAddr);
114 }
115
116 prefix_ void senf::ppi::IPv6SourceForcingDgramWriter::source(senf::INet6Address & source){
117     source_ = source;
118 }
119 prefix_ void senf::ppi::IPv6SourceForcingDgramWriter::destination(senf::INet6SocketAddress & dest){
120     destination_ = dest.address();
121     protocolId_ = dest.port();
122 }
123
124 prefix_ void senf::ppi::IPv6SourceForcingDgramWriter::operator()(Handle handle, 
125                                                                  Packet const & packet){
126     sendtoandfrom(
127             handle.fd(),
128             reinterpret_cast<void*> (&*packet.data().begin()),
129             packet.size(),
130             reinterpret_cast<in6_addr*> (&destination_),
131             protocolId_,
132             reinterpret_cast<in6_addr*> (&source_));
133 }
134
135 prefix_ int senf::ppi::IPv6SourceForcingDgramWriter::sendtoandfrom(
136         int sock,
137         const void *data,
138         size_t dataLen,
139         const in6_addr *dst,
140         int port,
141         const in6_addr *src)
142 {
143     uint8_t cbuf[CMSG_SPACE(sizeof(struct in6_pktinfo))];
144     struct cmsghdr *c = (struct cmsghdr *)cbuf;
145     struct in6_pktinfo *pi;
146     struct iovec iov;
147     struct msghdr h;
148
149     c->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
150     c->cmsg_level = IPPROTO_IPV6;
151     c->cmsg_type = IPV6_PKTINFO;
152
153     pi = (struct in6_pktinfo *)CMSG_DATA(c);
154     pi->ipi6_ifindex = 0;
155     memcpy(&pi->ipi6_addr, src, 16);
156
157     iov.iov_base = (void *)data;
158     iov.iov_len = dataLen;
159
160     sockaddr_in6 dstpeer;
161     memset(&dstpeer, 0, sizeof(dstpeer));
162     dstpeer.sin6_family = AF_INET6;
163     dstpeer.sin6_addr = *dst;
164     dstpeer.sin6_port = htons(port);
165
166     memset(&h, 0, sizeof(h));
167     h.msg_name = (struct sockaddr *)&dstpeer;
168     h.msg_namelen = sizeof(dstpeer);
169     h.msg_iov = &iov;
170     h.msg_iovlen = 1;
171     h.msg_control = c;
172     h.msg_controllen = sizeof(cbuf);
173
174     return sendmsg(sock, &h, 0);
175 }
176
177 #undef prefix_