f703dd1cb0676b49cd54bd0a3af1bd9454634ffa
[oonf.git] / include / oonf / subsystems / oonf_socket.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 OONF_SOCKET_H_
47 #define OONF_SOCKET_H_
48
49 #include <oonf/libcommon/avl.h>
50 #include <oonf/oonf.h>
51 #include <oonf/libcommon/list.h>
52 #include <oonf/libcommon/netaddr_acl.h>
53 #include <oonf/subsystems/os_fd.h>
54
55 /*! subsystem identifier */
56 #define OONF_SOCKET_SUBSYSTEM "socket"
57
58 /**
59  * registered socket handler
60  */
61 struct oonf_socket_entry {
62   /*! name of socket handler */
63   const char *name;
64
65   /*! file descriptor of the socket */
66   struct os_fd fd;
67
68   /**
69    * Callback when read or write event happens to socket
70    * @param fd file descriptor of socket
71    */
72   void (*process)(struct oonf_socket_entry *entry);
73
74   /*! usage counter, will be increased every times the socket receives data */
75   uint32_t _stat_recv;
76
77   /*! usage counter, will be increased every times the socket sends data */
78   uint32_t _stat_send;
79
80   /*!
81    * usage counter, will be increased every times a socket processing takes
82    * more than a TIMER slice
83    */
84   uint32_t _stat_long;
85
86   /*! list of socket handlers */
87   struct list_entity _node;
88 };
89
90 EXPORT void oonf_socket_add(struct oonf_socket_entry *);
91 EXPORT void oonf_socket_remove(struct oonf_socket_entry *);
92 EXPORT void oonf_socket_set_read(struct oonf_socket_entry *entry, bool event_read);
93 EXPORT void oonf_socket_set_write(struct oonf_socket_entry *entry, bool event_write);
94 EXPORT struct list_entity *oonf_socket_get_list(void);
95
96 /**
97  * @param entry socket entry
98  * @return true if socket has a read event, false otherwise
99  */
100 static INLINE bool
101 oonf_socket_is_read(struct oonf_socket_entry *entry) {
102   return os_fd_event_is_read(&entry->fd);
103 }
104
105 /**
106  * @param entry socket entry
107  * @return true if socket has a write event, false otherwise
108  */
109 static INLINE bool
110 oonf_socket_is_write(struct oonf_socket_entry *entry) {
111   return os_fd_event_is_write(&entry->fd);
112 }
113
114 /**
115  * Registers a direct send (without select) to a socket
116  * @param entry socket entry
117  */
118 static INLINE void
119 oonf_socket_register_direct_send(struct oonf_socket_entry *entry) {
120   entry->_stat_send++;
121 }
122
123 /**
124  * @param sock pointer to socket entry
125  * @return number of recv events of socket
126  */
127 static INLINE uint32_t
128 oonf_socket_get_recv(struct oonf_socket_entry *sock) {
129   return sock->_stat_recv;
130 }
131
132 /**
133  * @param sock pointer to socket entry
134  * @return number of send events of socket
135  */
136 static INLINE uint32_t
137 oonf_socket_get_send(struct oonf_socket_entry *sock) {
138   return sock->_stat_send;
139 }
140
141 /**
142  * @param sock pointer to socket entry
143  * @return number of times socket handling took more than a timer slice
144  */
145 static INLINE uint32_t
146 oonf_socket_get_long(struct oonf_socket_entry *sock) {
147   return sock->_stat_long;
148 }
149
150 #endif /* OONF_SOCKET_H_ */