2 EIBD eib bus access and management daemon
3 Copyright (C) 2005-2008 Martin Koegler <mkoegler@auto.tuwien.ac.at>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include <netinet/in.h>
27 #define SEARCH_REQUEST 0x0201
28 #define SEARCH_RESPONSE 0x0202
29 #define DESCRIPTION_REQUEST 0x0203
30 #define DESCRIPTION_RESPONSE 0x0204
32 #define CONNECTION_REQUEST 0x0205
33 #define CONNECTION_RESPONSE 0x0206
34 #define CONNECTIONSTATE_REQUEST 0x0207
35 #define CONNECTIONSTATE_RESPONSE 0x0208
36 #define DISCONNECT_REQUEST 0x0209
37 #define DISCONNECT_RESPONSE 0x020A
39 #define TUNNEL_REQUEST 0x0420
40 #define TUNNEL_RESPONSE 0x0421
42 #define DEVICE_CONFIGURATION_REQUEST 0x0310
43 #define DEVICE_CONFIGURATION_RESPONSE 0x0311
45 #define ROUTING_INDICATION 0x0530
47 /** resolve host name */
48 int GetHostIP (struct sockaddr_in
*sock
, const char *Name
);
49 /** gets source address for a route */
50 int GetSourceAddress (const struct sockaddr_in
*dest
,
51 struct sockaddr_in
*src
);
52 /** convert a to EIBnet/IP format */
53 CArray
IPtoEIBNetIP (const struct sockaddr_in
*a
);
54 /** convert EIBnet/IP IP Address to a */
55 int EIBnettoIP (const CArray
& buf
, struct sockaddr_in
*a
);
57 /** represents a EIBnet/IP packet */
68 /** create from character array */
69 static EIBNetIPPacket
*fromPacket (const CArray
& c
);
70 /** convert to character array */
71 CArray
ToPacket () const;
72 virtual ~ EIBNetIPPacket ()
77 class EIBnet_ConnectRequest
80 EIBnet_ConnectRequest ();
81 struct sockaddr_in caddr
;
82 struct sockaddr_in daddr
;
84 EIBNetIPPacket
ToPacket () const;
87 int parseEIBnet_ConnectRequest (const EIBNetIPPacket
& p
,
88 EIBnet_ConnectRequest
& r
);
90 class EIBnet_ConnectResponse
93 EIBnet_ConnectResponse ();
96 struct sockaddr_in daddr
;
98 EIBNetIPPacket
ToPacket () const;
101 int parseEIBnet_ConnectResponse (const EIBNetIPPacket
& p
,
102 EIBnet_ConnectResponse
& r
);
104 class EIBnet_ConnectionStateRequest
107 EIBnet_ConnectionStateRequest ();
110 struct sockaddr_in caddr
;
111 EIBNetIPPacket
ToPacket () const;
114 int parseEIBnet_ConnectionStateRequest (const EIBNetIPPacket
& p
,
115 EIBnet_ConnectionStateRequest
& r
);
117 class EIBnet_ConnectionStateResponse
120 EIBnet_ConnectionStateResponse ();
123 EIBNetIPPacket
ToPacket () const;
126 int parseEIBnet_ConnectionStateResponse (const EIBNetIPPacket
& p
,
127 EIBnet_ConnectionStateResponse
& r
);
129 class EIBnet_DisconnectRequest
132 EIBnet_DisconnectRequest ();
133 struct sockaddr_in caddr
;
135 EIBNetIPPacket
ToPacket () const;
138 int parseEIBnet_DisconnectRequest (const EIBNetIPPacket
& p
,
139 EIBnet_DisconnectRequest
& r
);
141 class EIBnet_DisconnectResponse
144 EIBnet_DisconnectResponse ();
147 EIBNetIPPacket
ToPacket () const;
150 int parseEIBnet_DisconnectResponse (const EIBNetIPPacket
& p
,
151 EIBnet_DisconnectResponse
& r
);
153 class EIBnet_TunnelRequest
156 EIBnet_TunnelRequest ();
160 EIBNetIPPacket
ToPacket () const;
163 int parseEIBnet_TunnelRequest (const EIBNetIPPacket
& p
,
164 EIBnet_TunnelRequest
& r
);
166 class EIBnet_TunnelACK
173 EIBNetIPPacket
ToPacket () const;
176 int parseEIBnet_TunnelACK (const EIBNetIPPacket
& p
, EIBnet_TunnelACK
& r
);
184 class EIBnet_DescriptionRequest
187 EIBnet_DescriptionRequest ();
188 struct sockaddr_in caddr
;
189 EIBNetIPPacket
ToPacket () const;
192 int parseEIBnet_DescriptionRequest (const EIBNetIPPacket
& p
,
193 EIBnet_DescriptionRequest
& r
);
195 class EIBnet_DescriptionResponse
198 EIBnet_DescriptionResponse ();
201 eibaddr_t individual_addr
;
203 serialnumber_t serial
;
204 Array
< DIB_service_Entry
> services
;
205 struct in_addr multicastaddr
;
209 EIBNetIPPacket
ToPacket () const;
212 int parseEIBnet_DescriptionResponse (const EIBNetIPPacket
& p
,
213 EIBnet_DescriptionResponse
& r
);
215 class EIBnet_SearchRequest
218 EIBnet_SearchRequest ();
219 struct sockaddr_in caddr
;
220 EIBNetIPPacket
ToPacket () const;
223 int parseEIBnet_SearchRequest (const EIBNetIPPacket
& p
,
224 EIBnet_SearchRequest
& r
);
226 class EIBnet_SearchResponse
229 EIBnet_SearchResponse ();
232 eibaddr_t individual_addr
;
234 serialnumber_t serial
;
235 Array
< DIB_service_Entry
> services
;
236 struct in_addr multicastaddr
;
239 struct sockaddr_in caddr
;
240 EIBNetIPPacket
ToPacket () const;
243 int parseEIBnet_SearchResponse (const EIBNetIPPacket
& p
,
244 EIBnet_SearchResponse
& r
);
247 /** represents a EIBnet/IP packet to send*/
248 struct _EIBNetIP_Send
252 /** destination address */
253 struct sockaddr_in addr
;
256 /** EIBnet/IP socket */
257 class EIBNetIPSocket
:private Thread
262 Queue
< struct _EIBNetIP_Send
>inqueue
;
264 Queue
< EIBNetIPPacket
> outqueue
;
265 /** semaphore for inqueue */
267 /** semaphore for outqueue */
269 /** event to wait for outqueue */
271 /** multicast address */
272 struct ip_mreq maddr
;
273 /** file descriptor */
275 /** multicast in use */
278 void Run (pth_sem_t
* stop
);
280 EIBNetIPSocket (struct sockaddr_in bindaddr
, bool reuseaddr
, Trace
* tr
);
281 virtual ~ EIBNetIPSocket ();
283 /** enables multicast */
284 bool SetMulticast (struct ip_mreq multicastaddr
);
285 /** sends a packet */
286 void Send (EIBNetIPPacket p
);
287 /** waits for an packet; aborts if stop occurs */
288 EIBNetIPPacket
*Get (pth_event_t stop
);
290 /** default send address */
291 struct sockaddr_in sendaddr
;
292 /** addres to accept packets from */
293 struct sockaddr_in recvaddr
;
294 /** addres to accept packets from */
295 struct sockaddr_in localaddr
;
296 /** accept all packets*/