SetMulticast: don't use exceptions
[bcusdk.git] / eibd / libserver / eibnetip.h
blobeec322316b37d8a584f7cb5f17e4262a1184cbbe
1 /*
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
20 #ifndef EIBNETIP_H
21 #define EIBNETIP_H
23 #include <netinet/in.h>
24 #include "common.h"
25 #include "lpdu.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 */
58 class EIBNetIPPacket
61 public:
62 /** service code*/
63 int service;
64 /** payload */
65 CArray data;
67 EIBNetIPPacket ();
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
79 public:
80 EIBnet_ConnectRequest ();
81 struct sockaddr_in caddr;
82 struct sockaddr_in daddr;
83 CArray CRI;
84 EIBNetIPPacket ToPacket () const;
87 int parseEIBnet_ConnectRequest (const EIBNetIPPacket & p,
88 EIBnet_ConnectRequest & r);
90 class EIBnet_ConnectResponse
92 public:
93 EIBnet_ConnectResponse ();
94 uchar channel;
95 uchar status;
96 struct sockaddr_in daddr;
97 CArray CRD;
98 EIBNetIPPacket ToPacket () const;
101 int parseEIBnet_ConnectResponse (const EIBNetIPPacket & p,
102 EIBnet_ConnectResponse & r);
104 class EIBnet_ConnectionStateRequest
106 public:
107 EIBnet_ConnectionStateRequest ();
108 uchar channel;
109 uchar status;
110 struct sockaddr_in caddr;
111 EIBNetIPPacket ToPacket () const;
114 int parseEIBnet_ConnectionStateRequest (const EIBNetIPPacket & p,
115 EIBnet_ConnectionStateRequest & r);
117 class EIBnet_ConnectionStateResponse
119 public:
120 EIBnet_ConnectionStateResponse ();
121 uchar channel;
122 uchar status;
123 EIBNetIPPacket ToPacket () const;
126 int parseEIBnet_ConnectionStateResponse (const EIBNetIPPacket & p,
127 EIBnet_ConnectionStateResponse & r);
129 class EIBnet_DisconnectRequest
131 public:
132 EIBnet_DisconnectRequest ();
133 struct sockaddr_in caddr;
134 uchar channel;
135 EIBNetIPPacket ToPacket () const;
138 int parseEIBnet_DisconnectRequest (const EIBNetIPPacket & p,
139 EIBnet_DisconnectRequest & r);
141 class EIBnet_DisconnectResponse
143 public:
144 EIBnet_DisconnectResponse ();
145 uchar channel;
146 uchar status;
147 EIBNetIPPacket ToPacket () const;
150 int parseEIBnet_DisconnectResponse (const EIBNetIPPacket & p,
151 EIBnet_DisconnectResponse & r);
153 class EIBnet_TunnelRequest
155 public:
156 EIBnet_TunnelRequest ();
157 uchar channel;
158 uchar seqno;
159 CArray CEMI;
160 EIBNetIPPacket ToPacket () const;
163 int parseEIBnet_TunnelRequest (const EIBNetIPPacket & p,
164 EIBnet_TunnelRequest & r);
166 class EIBnet_TunnelACK
168 public:
169 EIBnet_TunnelACK ();
170 uchar channel;
171 uchar seqno;
172 uchar status;
173 EIBNetIPPacket ToPacket () const;
176 int parseEIBnet_TunnelACK (const EIBNetIPPacket & p, EIBnet_TunnelACK & r);
178 typedef struct
180 uchar family;
181 uchar version;
182 } DIB_service_Entry;
184 class EIBnet_DescriptionRequest
186 public:
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
197 public:
198 EIBnet_DescriptionResponse ();
199 uchar KNXmedium;
200 uchar devicestatus;
201 eibaddr_t individual_addr;
202 uint16_t installid;
203 serialnumber_t serial;
204 Array < DIB_service_Entry > services;
205 struct in_addr multicastaddr;
206 uchar MAC[6];
207 uchar name[30];
208 CArray optional;
209 EIBNetIPPacket ToPacket () const;
212 int parseEIBnet_DescriptionResponse (const EIBNetIPPacket & p,
213 EIBnet_DescriptionResponse & r);
215 class EIBnet_SearchRequest
217 public:
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
228 public:
229 EIBnet_SearchResponse ();
230 uchar KNXmedium;
231 uchar devicestatus;
232 eibaddr_t individual_addr;
233 uint16_t installid;
234 serialnumber_t serial;
235 Array < DIB_service_Entry > services;
236 struct in_addr multicastaddr;
237 uchar MAC[6];
238 uchar name[30];
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
250 /** packat */
251 EIBNetIPPacket data;
252 /** destination address */
253 struct sockaddr_in addr;
256 /** EIBnet/IP socket */
257 class EIBNetIPSocket:private Thread
259 /** debug output */
260 Trace *t;
261 /** input queue */
262 Queue < struct _EIBNetIP_Send >inqueue;
263 /** output queue */
264 Queue < EIBNetIPPacket > outqueue;
265 /** semaphore for inqueue */
266 pth_sem_t insignal;
267 /** semaphore for outqueue */
268 pth_sem_t outsignal;
269 /** event to wait for outqueue */
270 pth_event_t getwait;
271 /** multicast address */
272 struct ip_mreq maddr;
273 /** file descriptor */
274 int fd;
275 /** multicast in use */
276 int multicast;
278 void Run (pth_sem_t * stop);
279 public:
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*/
297 uchar recvall;
300 #endif