2 * Copyright (C) 2014 John Crispin <blogic@openwrt.org>
3 * Copyright (C) 2014 Felix Fietkau <nbd@openwrt.org>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License version 2.1
7 * as published by the Free Software Foundation
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
15 #ifndef __MDNS_INTERFACE_H
16 #define __MDNS_INTERFACE_H
18 #include <sys/types.h>
21 #include <arpa/inet.h>
23 #include <libubox/uloop.h>
24 #include <libubox/vlist.h>
26 extern struct vlist_tree interfaces
;
28 #define SOCKTYPE_BIT_IPV6 (1 << 1)
29 #define SOCKTYPE_BIT_UNICAST (1 << 0)
31 enum umdns_socket_type
{
33 SOCK_UC_IPV4
= SOCKTYPE_BIT_UNICAST
,
34 SOCK_MC_IPV6
= SOCKTYPE_BIT_IPV6
,
35 SOCK_UC_IPV6
= SOCKTYPE_BIT_IPV6
| SOCKTYPE_BIT_UNICAST
,
38 struct interface_addr_list
{
41 struct in_addr addr
, mask
;
44 struct in6_addr addr
, mask
;
51 struct vlist_node node
;
52 struct interface
*peer
;
55 enum umdns_socket_type type
;
58 struct interface_addr_list addrs
;
60 struct uloop_timeout announce_timer
;
64 static inline bool interface_multicast(struct interface
*iface
)
66 return !(iface
->type
& SOCKTYPE_BIT_UNICAST
);
69 static inline bool interface_ipv6(struct interface
*iface
)
71 return !!(iface
->type
& SOCKTYPE_BIT_IPV6
);
74 int interface_add(const char *name
);
75 int interface_init(void);
76 void interface_shutdown(void);
77 int interface_send_packet(struct interface
*iface
, struct sockaddr
*to
, struct iovec
*iov
, int iov_len
);
78 struct interface
* interface_get(const char *name
, enum umdns_socket_type type
);