36 #if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__Darwin__)
37 #include <net/if_dl.h>
41 #include <sys/sockio.h>
42 #elif defined(HAVE_GETIFADDRS)
78 memset(list, 0,
sizeof(*list));
94 struct sockaddr_in *sa)
114 const int reuseFlag = 1;
117 netsocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
123 if (setsockopt(netsocket, SOL_SOCKET, SO_REUSEADDR, (
char *)&reuseFlag,
sizeof reuseFlag) < 0) {
126 if (bind(netsocket,(
struct sockaddr *)bindaddr,
sizeof(
struct sockaddr_in))) {
162 if ((res = setsockopt(netsocket, IPPROTO_IP, IP_TOS, &tos,
sizeof(tos))))
163 ast_log(
LOG_WARNING,
"Unable to set %s TOS to %d, may be you have no root privileges\n", desc, tos);
165 ast_verb(2,
"Using %s TOS bits %d\n", desc, tos);
168 if (setsockopt(netsocket, SOL_SOCKET, SO_PRIORITY, &cos,
sizeof(cos)))
171 ast_verb(2,
"Using %s CoS mark %d\n", desc, cos);
180 struct sockaddr_in sin;
186 memset(&sin, 0,
sizeof(sin));
187 sin.sin_family = AF_INET;
188 sin.sin_port = htons(defaultport);
194 if (port && ((portno = atoi(port)) > 0))
195 sin.sin_port = htons(portno);
204 return ns ? ns-> sockfd : -1;
227 if (s && (maxlen > 0))
230 for (x = 0; x < 5; x++) {
231 sprintf(s,
"%02x:", (
unsigned)eid->
eid[x]);
234 sprintf(s,
"%02x", (
unsigned)eid->
eid[5]);
241 #if defined(SIOCGIFHWADDR) && defined(HAVE_STRUCT_IFREQ_IFR_IFRU_IFRU_HWADDR)
245 static const unsigned int MAXIF = 10;
247 s = socket(AF_INET, SOCK_STREAM, 0);
250 for (x = 0; x < MAXIF; x++) {
251 static const char *prefixes[] = {
"eth",
"em" };
254 for (i = 0; i <
ARRAY_LEN(prefixes); i++) {
255 memset(&ifr, 0,
sizeof(ifr));
256 snprintf(ifr.ifr_name,
sizeof(ifr.ifr_name),
"%s%d", prefixes[i], x);
257 if (!ioctl(s, SIOCGIFHWADDR, &ifr)) {
264 for (i = 0; i < MAXIF; i++) {
265 memset(&ifr, 0,
sizeof(ifr));
266 snprintf(ifr.ifr_name,
sizeof(ifr.ifr_name),
"pci%d#%u", x, i);
267 if (!ioctl(s, SIOCGIFHWADDR, &ifr)) {
276 memcpy(eid, ((
unsigned char *)&ifr.ifr_hwaddr) + 2,
sizeof(*eid));
277 ast_debug(1,
"Seeding global EID '%s' from '%s' using 'siocgifhwaddr'\n",
ast_eid_to_str(eid_str,
sizeof(eid_str), eid), ifr.ifr_name);
283 #if defined(ifa_broadaddr) && !defined(SOLARIS)
285 struct ifaddrs *ifap;
287 if (getifaddrs(&ifap) == 0) {
289 for (p = ifap; p; p = p->ifa_next) {
290 if ((p->ifa_addr->sa_family == AF_LINK) && !(p->ifa_flags & IFF_LOOPBACK) && (p->ifa_flags & IFF_RUNNING)) {
291 struct sockaddr_dl* sdp = (
struct sockaddr_dl*) p->ifa_addr;
292 memcpy(&(eid->
eid), sdp->sdl_data + sdp->sdl_nlen, 6);
293 ast_debug(1,
"Seeding global EID '%s' from '%s' using 'getifaddrs'\n",
ast_eid_to_str(eid_str,
sizeof(eid_str), eid), p->ifa_name);
302 ast_debug(1,
"No ethernet interface found for seeding global EID. You will have to set it manually.\n");
307 unsigned int eid_int[6];
310 if (sscanf(s,
"%2x:%2x:%2x:%2x:%2x:%2x", &eid_int[0], &eid_int[1], &eid_int[2],
311 &eid_int[3], &eid_int[4], &eid_int[5]) != 6)
314 for (x = 0; x < 6; x++)
315 eid->
eid[x] = eid_int[x];
322 return memcmp(eid1, eid2,
sizeof(*eid1));
void ast_enable_packet_fragmentation(int sock)
Disable PMTU discovery on a socket.
Asterisk main include file. File version handling, generic pbx functions.
char * strsep(char **str, const char *delims)
char * ast_eid_to_str(char *s, int maxlen, struct ast_eid *eid)
int ast_netsock_sockfd(const struct ast_netsock *ns)
int ast_netsock_release(struct ast_netsock_list *list)
static struct ast_netsock_list * netsock
static force_inline int inaddrcmp(const struct sockaddr_in *sin1, const struct sockaddr_in *sin2)
Compares the source address and port of two sockaddr_in.
int ast_netsock_set_qos(int netsocket, int tos, int cos, const char *desc)
int * ast_io_add(struct io_context *ioc, int fd, ast_io_cb callback, short events, void *data)
Adds an IO context.
struct ast_netsock_list * ast_netsock_list_alloc(void)
struct ast_netsock * ast_netsock_bindaddr(struct ast_netsock_list *list, struct io_context *ioc, struct sockaddr_in *bindaddr, int tos, int cos, ast_io_cb callback, void *data)
void ast_set_default_eid(struct ast_eid *eid)
Fill in an ast_eid with the default eid of this machine.
struct ast_netsock * ast_netsock_find(struct ast_netsock_list *list, struct sockaddr_in *sa)
An Entity ID is essentially a MAC address, brief and unique.
#define ast_verb(level,...)
struct ast_netsock * ast_netsock_bind(struct ast_netsock_list *list, struct io_context *ioc, const char *bindinfo, int defaultport, int tos, int cos, ast_io_cb callback, void *data)
int ast_eid_cmp(const struct ast_eid *eid1, const struct ast_eid *eid2)
Compare two EIDs.
#define ASTOBJ_COMPONENTS(type)
Add ASTOBJ components to a struct (with locking support).
#define ASTOBJ_CONTAINER_INIT(container)
Initialize a container.
#define ast_debug(level,...)
Log a DEBUG message.
void ast_netsock_unref(struct ast_netsock *ns)
Global IO variables are now in a struct in order to be made threadsafe.
int ast_str_to_eid(struct ast_eid *eid, const char *s)
Convert a string into an EID.
#define ASTOBJ_INIT(object)
Initialize an object.
struct sockaddr_in * ast_netsock_boundaddr(const struct ast_netsock *ns)
#define ASTOBJ_UNREF(object, destructor)
Decrement the reference count on an object.
#define ast_strdupa(s)
duplicate a string in memory from the stack
#define ASTOBJ_CONTAINER_DESTROY(container)
Destroy a container.
#define ASTOBJ_CONTAINER_DESTROYALL(container, destructor)
Empty a container.
A set of macros implementing objects and containers. Macros are used for maximum performance, to support multiple inheritance, and to be easily integrated into existing structures without additional malloc calls, etc.
#define ASTOBJ_CONTAINER_LINK(container, newobj)
Add an object to a container.
struct ast_sockaddr bindaddr
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
#define ASTOBJ_CONTAINER_TRAVERSE(container, continue, eval)
Iterate through the objects in a container.
struct sockaddr_in bindaddr
const char * ast_inet_ntoa(struct in_addr ia)
thread-safe replacement for inet_ntoa().
#define ASTOBJ_UNLOCK(object)
Unlock a locked object.
int ast_io_remove(struct io_context *ioc, int *id)
Removes an IO context.
int ast_netsock_init(struct ast_netsock_list *list)
#define ASTOBJ_RDLOCK(object)
Lock an ASTOBJ for reading.
int(* ast_io_cb)(int *id, int fd, short events, void *cbdata)
ASTOBJ_CONTAINER_COMPONENTS(struct ast_netsock)
void * ast_netsock_data(const struct ast_netsock *ns)
int inet_aton(const char *cp, struct in_addr *pin)
static void ast_netsock_destroy(struct ast_netsock *netsock)
#define ASTERISK_FILE_VERSION(file, version)
Register/unregister a source code file with the core.