1/* Network-related functions for internal library use.
2 Copyright (C) 2016-2017 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
18
19#ifndef _NET_INTERNAL_H
20#define _NET_INTERNAL_H 1
21
22#include <arpa/inet.h>
23#include <stdbool.h>
24#include <stdint.h>
25#include <sys/time.h>
26
27int __inet6_scopeid_pton (const struct in6_addr *address,
28 const char *scope, uint32_t *result);
29libc_hidden_proto (__inet6_scopeid_pton)
30
31
32/* Deadline handling for enforcing timeouts.
33
34 Code should call __deadline_current_time to obtain the current time
35 and cache it locally. The cache needs updating after every
36 long-running or potentially blocking operation. Deadlines relative
37 to the current time can be computed using __deadline_from_timeval.
38 The deadlines may have to be recomputed in response to certain
39 events (such as an incoming packet), but they are absolute (not
40 relative to the current time). A timeout suitable for use with the
41 poll function can be computed from such a deadline using
42 __deadline_to_ms.
43
44 The fields in the structs defined belowed should only be used
45 within the implementation. */
46
47/* Cache of the current time. Used to compute deadlines from relative
48 timeouts and vice versa. */
49struct deadline_current_time
50{
51 struct timespec current;
52};
53
54/* Return the current time. Terminates the process if the current
55 time is not available. */
56struct deadline_current_time __deadline_current_time (void)
57 internal_function attribute_hidden;
58
59/* Computed absolute deadline. */
60struct deadline
61{
62 struct timespec absolute;
63};
64
65
66/* For internal use only. */
67static inline bool
68__deadline_is_infinite (struct deadline deadline)
69{
70 return deadline.absolute.tv_nsec < 0;
71}
72
73/* Return true if the current time is at the deadline or past it. */
74static inline bool
75__deadline_elapsed (struct deadline_current_time current,
76 struct deadline deadline)
77{
78 return !__deadline_is_infinite (deadline)
79 && (current.current.tv_sec > deadline.absolute.tv_sec
80 || (current.current.tv_sec == deadline.absolute.tv_sec
81 && current.current.tv_nsec >= deadline.absolute.tv_nsec));
82}
83
84/* Return the deadline which occurs first. */
85static inline struct deadline
86__deadline_first (struct deadline left, struct deadline right)
87{
88 if (__deadline_is_infinite (right)
89 || left.absolute.tv_sec < right.absolute.tv_sec
90 || (left.absolute.tv_sec == right.absolute.tv_sec
91 && left.absolute.tv_nsec < right.absolute.tv_nsec))
92 return left;
93 else
94 return right;
95}
96
97/* Add TV to the current time and return it. Returns a special
98 infinite absolute deadline on overflow. */
99struct deadline __deadline_from_timeval (struct deadline_current_time,
100 struct timeval tv)
101 internal_function attribute_hidden;
102
103/* Compute the number of milliseconds until the specified deadline,
104 from the current time in the argument. The result is mainly for
105 use with poll. If the deadline has already passed, return 0. If
106 the result would overflow an int, return INT_MAX. */
107int __deadline_to_ms (struct deadline_current_time, struct deadline)
108 internal_function attribute_hidden;
109
110/* Return true if TV.tv_sec is non-negative and TV.tv_usec is in the
111 interval [0, 999999]. */
112static inline bool
113__is_timeval_valid_timeout (struct timeval tv)
114{
115 return tv.tv_sec >= 0 && tv.tv_usec >= 0 && tv.tv_usec < 1000 * 1000;
116}
117
118#endif /* _NET_INTERNAL_H */
119