/*
EIBD eib bus access and management daemon
Copyright (C) 2005-2007 Martin Koegler <mkoegler@auto.tuwien.ac.at>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef EIBNETIP_H
#define EIBNETIP_H
#include <netinet/in.h>
#include "common.h"
#include "lpdu.h"
#define SEARCH_REQUEST 0x0201
#define SEARCH_RESPONSE 0x0202
#define DESCRIPTION_REQUEST 0x0203
#define DESCRIPTION_RESPONSE 0x0204
#define CONNECTION_REQUEST 0x0205
#define CONNECTION_RESPONSE 0x0206
#define CONNECTIONSTATE_REQUEST 0x0207
#define CONNECTIONSTATE_RESPONSE 0x0208
#define DISCONNECT_REQUEST 0x0209
#define DISCONNECT_RESPONSE 0x020A
#define TUNNEL_REQUEST 0x0420
#define TUNNEL_RESPONSE 0x0421
#define DEVICE_CONFIGURATION_REQUEST 0x0310
#define DEVICE_CONFIGURATION_RESPONSE 0x0311
#define ROUTING_INDICATION 0x0530
/** resolve host name */
int GetHostIP (struct sockaddr_in *sock, const char *Name);
/** gets source address for a route */
int GetSourceAddress (const struct sockaddr_in *dest,
struct sockaddr_in *src);
/** convert a to EIBnet/IP format */
CArray IPtoEIBNetIP (const struct sockaddr_in *a);
/** convert EIBnet/IP IP Address to a */
int EIBnettoIP (const CArray & buf, struct sockaddr_in *a);
/** represents a EIBnet/IP packet */
class EIBNetIPPacket
{
public:
/** service code*/
int service;
/** payload */
CArray data;
EIBNetIPPacket ();
/** create from character array */
static EIBNetIPPacket *fromPacket (const CArray & c);
/** convert to character array */
CArray ToPacket () const;
virtual ~ EIBNetIPPacket ()
{
}
};
class EIBnet_ConnectRequest
{
public:
EIBnet_ConnectRequest ();
struct sockaddr_in caddr;
struct sockaddr_in daddr;
CArray CRI;
EIBNetIPPacket ToPacket () const;
};
int parseEIBnet_ConnectRequest (const EIBNetIPPacket & p,
EIBnet_ConnectRequest & r);
class EIBnet_ConnectResponse
{
public:
EIBnet_ConnectResponse ();
uchar channel;
uchar status;
struct sockaddr_in daddr;
CArray CRD;
EIBNetIPPacket ToPacket () const;
};
int parseEIBnet_ConnectResponse (const EIBNetIPPacket & p,
EIBnet_ConnectResponse & r);
class EIBnet_ConnectionStateRequest
{
public:
EIBnet_ConnectionStateRequest ();
uchar channel;
uchar status;
struct sockaddr_in caddr;
EIBNetIPPacket ToPacket () const;
};
int parseEIBnet_ConnectionStateRequest (const EIBNetIPPacket & p,
EIBnet_ConnectionStateRequest & r);
class EIBnet_ConnectionStateResponse
{
public:
EIBnet_ConnectionStateResponse ();
uchar channel;
uchar status;
EIBNetIPPacket ToPacket () const;
};
int parseEIBnet_ConnectionStateResponse (const EIBNetIPPacket & p,
EIBnet_ConnectionStateResponse & r);
class EIBnet_DisconnectRequest
{
public:
EIBnet_DisconnectRequest ();
struct sockaddr_in caddr;
uchar channel;
EIBNetIPPacket ToPacket () const;
};
int parseEIBnet_DisconnectRequest (const EIBNetIPPacket & p,
EIBnet_DisconnectRequest & r);
class EIBnet_DisconnectResponse
{
public:
EIBnet_DisconnectResponse ();
uchar channel;
uchar status;
EIBNetIPPacket ToPacket () const;
};
int parseEIBnet_DisconnectResponse (const EIBNetIPPacket & p,
EIBnet_DisconnectResponse & r);
class EIBnet_TunnelRequest
{
public:
EIBnet_TunnelRequest ();
uchar channel;
uchar seqno;
CArray CEMI;
EIBNetIPPacket ToPacket () const;
};
int parseEIBnet_TunnelRequest (const EIBNetIPPacket & p,
EIBnet_TunnelRequest & r);
class EIBnet_TunnelACK
{
public:
EIBnet_TunnelACK ();
uchar channel;
uchar seqno;
uchar status;
EIBNetIPPacket ToPacket () const;
};
int parseEIBnet_TunnelACK (const EIBNetIPPacket & p, EIBnet_TunnelACK & r);
typedef struct
{
uchar family;
uchar version;
} DIB_service_Entry;
class EIBnet_DescriptionRequest
{
public:
EIBnet_DescriptionRequest ();
struct sockaddr_in caddr;
EIBNetIPPacket ToPacket () const;
};
int parseEIBnet_DescriptionRequest (const EIBNetIPPacket & p,
EIBnet_DescriptionRequest & r);
class EIBnet_DescriptionResponse
{
public:
EIBnet_DescriptionResponse ();
uchar KNXmedium;
uchar devicestatus;
eibaddr_t individual_addr;
uint16_t installid;
serialnumber_t serial;
Array < DIB_service_Entry > services;
struct in_addr multicastaddr;
uchar MAC[6];
uchar name[30];
CArray optional;
EIBNetIPPacket ToPacket () const;
};
int parseEIBnet_DescriptionResponse (const EIBNetIPPacket & p,
EIBnet_DescriptionResponse & r);
class EIBnet_SearchRequest
{
public:
EIBnet_SearchRequest ();
struct sockaddr_in caddr;
EIBNetIPPacket ToPacket () const;
};
int parseEIBnet_SearchRequest (const EIBNetIPPacket & p,
EIBnet_SearchRequest & r);
class EIBnet_SearchResponse
{
public:
EIBnet_SearchResponse ();
uchar KNXmedium;
uchar devicestatus;
eibaddr_t individual_addr;
uint16_t installid;
serialnumber_t serial;
Array < DIB_service_Entry > services;
struct in_addr multicastaddr;
uchar MAC[6];
uchar name[30];
struct sockaddr_in caddr;
EIBNetIPPacket ToPacket () const;
};
int parseEIBnet_SearchResponse (const EIBNetIPPacket & p,
EIBnet_SearchResponse & r);
/** represents a EIBnet/IP packet to send*/
struct _EIBNetIP_Send
{
/** packat */
EIBNetIPPacket data;
/** destination address */
struct sockaddr_in addr;
};
/** EIBnet/IP socket */
class EIBNetIPSocket:private Thread
{
/** debug output */
Trace *t;
/** input queue */
Queue < struct _EIBNetIP_Send >inqueue;
/** output queue */
Queue < EIBNetIPPacket > outqueue;
/** semaphore for inqueue */
pth_sem_t insignal;
/** semaphore for outqueue */
pth_sem_t outsignal;
/** event to wait for outqueue */
pth_event_t getwait;
/** multicast address */
struct ip_mreq maddr;
/** file descriptor */
int fd;
/** multicast in use */
int multicast;
void Run (pth_sem_t * stop);
public:
EIBNetIPSocket (struct sockaddr_in bindaddr, bool reuseaddr, Trace * tr);
virtual ~ EIBNetIPSocket ();
/** enables multicast */
void SetMulticast (struct ip_mreq multicastaddr);
/** sends a packet */
void Send (EIBNetIPPacket p);
/** waits for an packet; aborts if stop occurs */
EIBNetIPPacket *Get (pth_event_t stop);
/** default send address */
struct sockaddr_in sendaddr;
/** addres to accept packets from */
struct sockaddr_in recvaddr;
/** addres to accept packets from */
struct sockaddr_in localaddr;
/** accept all packets*/
uchar recvall;
};
#endif
syntax highlighted by Code2HTML, v. 0.9.1