Revised OpenFlow Library  v0.6.0dev
 All Classes Files Functions Variables Friends Groups Pages
csockaddr.h
1 /*
2  * csockaddr.h
3  *
4  * Created on: 10.06.2014
5  * Author: andreas
6  */
7 
8 #ifndef CSOCKADDR_H_
9 #define CSOCKADDR_H_
10 
11 #include <sys/types.h>
12 #include <sys/socket.h>
13 #include <sys/un.h>
14 #include <arpa/inet.h>
15 
16 #include <iostream>
17 
18 #include "rofl/common/caddress.h"
19 #include "rofl/common/cmemory.h"
20 #include "rofl/common/logging.h"
21 #include "rofl/common/croflexception.h"
22 
23 namespace rofl {
24 
25 class eSockAddrBase : public RoflException {
26 public:
27  eSockAddrBase(const std::string& __arg) : RoflException(__arg) {};
28 };
29 
30 class eSockAddrInval : public eSockAddrBase {
31 public:
32  eSockAddrInval(const std::string& __arg) : eSockAddrBase(__arg) {};
33 };
34 
35 
36 
37 
38 class csockaddr : public rofl::cmemory {
39 public:
40 
41  union {
42  uint8_t* addru_mem;
43  struct sockaddr* addru_saddr;
44  struct sockaddr_in* addru_s4addr;
45  struct sockaddr_in6* addru_s6addr;
46  } addr_addru;
47 
48 #define ca_mem addr_addru.addru_mem
49 #define ca_saddr addr_addru.addru_saddr // generic sockaddr
50 #define ca_s4addr addr_addru.addru_s4addr // sockaddr_in
51 #define ca_s6addr addr_addru.addru_s6addr // sockaddr_in6
52 
53  socklen_t salen;
54 
55 public:
56 
60  csockaddr(
61  int family, const std::string& addr, uint16_t port_no);
62 
66  csockaddr(
67  const caddress_in4& addr, uint16_t port_no);
68 
72  csockaddr(
73  const caddress_in6& addr, uint16_t port_no);
74 
78  csockaddr() :
79  rofl::cmemory(sizeof(struct sockaddr_un)),
80  salen(sizeof(struct sockaddr_un)) {
81  ca_mem = cmemory::somem();
82  };
83 
87  virtual
88  ~csockaddr() {};
89 
93  csockaddr(
94  const csockaddr& sockaddr) { *this = sockaddr; };
95 
99  csockaddr&
100  operator= (
101  const csockaddr& sockaddr) {
102  if (this == &sockaddr)
103  return *this;
104  cmemory::operator= (sockaddr);
105  ca_mem = cmemory::somem();
106  salen = sockaddr.salen;
107  return *this;
108  };
109 
110 public:
111 
115  int
116  get_family() const;
117 
118 public:
119 
123  virtual size_t
124  length() const;
125 
129  virtual void
130  pack(
131  uint8_t* sa, size_t salen);
132 
136  virtual void
137  unpack(
138  uint8_t* sa, size_t salen);
139 
140 public:
141 
142  friend std::ostream&
143  operator<<(std::ostream& os, const csockaddr& sockaddr) {
144  os << rofl::indent(0) << "<csockaddr >" << std::endl;
145  switch (sockaddr.ca_saddr->sa_family) {
146  case AF_INET: {
147  caddress_in4 addr; addr.set_addr_nbo(sockaddr.ca_s4addr->sin_addr.s_addr);
148  rofl::indent i(2);
149  os << addr;
150  os << rofl::indent(0) << "<portno: " << (unsigned int)be16toh(sockaddr.ca_s4addr->sin_port) << " >" << std::endl;
151  } break;
152  case AF_INET6: {
153  caddress_in6 addr; addr.unpack(sockaddr.ca_s6addr->sin6_addr.s6_addr, 16);
154  rofl::indent i(2);
155  os << addr;
156  os << rofl::indent(0) << "<portno: " << (unsigned int)be16toh(sockaddr.ca_s6addr->sin6_port) << " >" << std::endl;
157  } break;
158  }
159  return os;
160  };
161 
162  std::string
163  str() const {
164  std::stringstream sstr;
165  switch (ca_saddr->sa_family) {
166  case AF_INET: {
167  caddress_in4 addr; addr.set_addr_nbo(ca_s4addr->sin_addr.s_addr);
168  sstr << "inet4:" << addr.str() << ":" << (unsigned int)be16toh(ca_s4addr->sin_port);
169  } break;
170  case AF_INET6: {
171  caddress_in6 addr; addr.unpack(ca_s6addr->sin6_addr.s6_addr, 16);
172  sstr << "inet6:" << addr.str() << ":" << (unsigned int)be16toh(ca_s6addr->sin6_port);
173  } break;
174  }
175  return sstr.str();
176  };
177 };
178 
179 
180 }; // end of namespace rofl
181 
182 #endif /* CSOCKADDR_H_ */
Definition: caddress.h:589
Definition: csockaddr.h:38
Definition: csockaddr.h:25
uint8_t * somem() const
Returns pointer to start of allocated memory area.
Definition: cmemory.cc:101
virtual void unpack(uint8_t *sa, size_t salen)
Copies content of specified buffer into this cmemory instance .
Definition: csockaddr.cc:103
virtual void unpack(uint8_t *buf, size_t buflen)
Copies content of specified buffer into this cmemory instance .
Definition: caddress.cc:31
Definition: caddress.h:415
C++ abstraction for malloc'ed memory areas.
Definition: cmemory.h:44
cmemory & operator=(cmemory const &m)
Assignment operator.
Definition: cmemory.cc:85
Definition: logging.h:76
virtual void pack(uint8_t *sa, size_t salen)
Copies content of this cmemory instance to specified buffer.
Definition: csockaddr.cc:88
Definition: csockaddr.h:30
Definition: croflexception.h:27