9e21c91675d4bbd2a80bd60fea419998a5ba5b19
[oonf.git] / include / oonf / subsystems / os_fd.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon version 2 (olsrd2)
4  * Copyright (c) 2004-2015, the olsr.org team - see HISTORY file
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 /**
43  * @file
44  */
45
46 #ifndef OS_FD_H_
47 #define OS_FD_H_
48
49 #include <sys/select.h>
50 #include <unistd.h>
51
52 #include <oonf/libcommon/avl.h>
53 #include <oonf/oonf.h>
54 #include <oonf/libcommon/list.h>
55 #include <oonf/libcommon/netaddr.h>
56 #include <oonf/libcore/oonf_logging.h>
57 #include <oonf/subsystems/oonf_timer.h>
58 #include <oonf/subsystems/os_interface.h>
59
60 /*! subsystem identifier */
61 #define OONF_OS_FD_SUBSYSTEM "os_fd"
62
63 /* pre-definition of structs */
64 struct os_fd;
65 struct os_fd_select;
66
67 /* pre-declare inlines */
68 static INLINE int os_fd_init(struct os_fd *, int fd);
69 static INLINE int os_fd_copy(struct os_fd *dst, struct os_fd *from);
70 static INLINE int os_fd_get_fd(struct os_fd *);
71 static INLINE int os_fd_invalidate(struct os_fd *);
72 static INLINE bool os_fd_is_initialized(struct os_fd *);
73
74 static INLINE int os_fd_bindto_interface(struct os_fd *, struct os_interface *);
75 static INLINE int os_fd_close(struct os_fd *);
76 static INLINE int os_fd_listen(struct os_fd *, int n);
77
78 static INLINE int os_fd_event_add(struct os_fd_select *);
79 static INLINE int os_fd_event_socket_add(struct os_fd_select *, struct os_fd *);
80 static INLINE int os_fd_event_socket_read(struct os_fd_select *, struct os_fd *, bool want_read);
81 static INLINE int os_fd_event_is_read(struct os_fd *);
82 static INLINE int os_fd_event_socket_write(struct os_fd_select *, struct os_fd *, bool want_write);
83 static INLINE int os_fd_event_is_write(struct os_fd *);
84 static INLINE int os_fd_event_socket_remove(struct os_fd_select *, struct os_fd *);
85 static INLINE int os_fd_event_set_deadline(struct os_fd_select *, uint64_t deadline);
86 static INLINE uint64_t os_fd_event_get_deadline(struct os_fd_select *);
87 static INLINE int os_fd_event_wait(struct os_fd_select *);
88 static INLINE struct os_fd *os_fd_event_get(struct os_fd_select *, int idx);
89 static INLINE int os_fd_event_remove(struct os_fd_select *);
90
91 static INLINE int os_fd_connect(struct os_fd *, const union netaddr_socket *remote);
92 static INLINE int os_fd_accept(struct os_fd *client, struct os_fd *server, union netaddr_socket *incoming);
93 static INLINE int os_fd_get_socket_error(struct os_fd *, int *value);
94 static INLINE ssize_t os_fd_sendto(
95   struct os_fd *, const void *buf, size_t length, const union netaddr_socket *dst, bool dont_route);
96 static INLINE ssize_t os_fd_recvfrom(
97   struct os_fd *, void *buf, size_t length, union netaddr_socket *source, const struct os_interface *);
98 static INLINE const char *os_fd_get_loopback_name(void);
99 static INLINE ssize_t os_fd_sendfile(struct os_fd *, struct os_fd *, size_t offset, size_t count);
100
101 static INLINE int os_fd_getsocket(struct os_fd *, const union netaddr_socket *bindto, bool tcp, size_t recvbuf,
102   const struct os_interface *, enum oonf_log_source log_src);
103 static INLINE int os_fd_getrawsocket(struct os_fd *, const union netaddr_socket *bindto, int protocol, size_t recvbuf,
104   const struct os_interface *, enum oonf_log_source log_src);
105 static INLINE int os_fd_configsocket(struct os_fd *, const union netaddr_socket *bindto, size_t recvbuf, bool rawip,
106   const struct os_interface *, enum oonf_log_source log_src);
107 static INLINE int os_fd_set_nonblocking(struct os_fd *);
108 static INLINE int os_fd_join_mcast_recv(
109   struct os_fd *, const struct netaddr *multicast, const struct os_interface *, enum oonf_log_source log_src);
110 static INLINE int os_fd_join_mcast_send(struct os_fd *, const struct netaddr *multicast, const struct os_interface *,
111   bool loop, uint8_t ttl, enum oonf_log_source log_src);
112 static INLINE int os_fd_set_dscp(struct os_fd *, int dscp, bool ipv6);
113 static INLINE uint8_t *os_fd_skip_rawsocket_prefix(uint8_t *ptr, ssize_t *len, int af_type);
114
115 /* include os-specific headers */
116 #if defined(__linux__)
117 #include <oonf/subsystems/os_linux/os_fd_linux.h>
118 #elif defined(BSD)
119 #include <oonf/subsystems/os_bsd/os_fd_bsd.h>
120 #elif defined(_WIN32)
121 #include <oonf/subsystems/os_win32/os_fd_win32.h>
122 #else
123 #error "Unknown operation system"
124 #endif
125
126 #endif /* OS_FD_H_ */