]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc. | |
3 | * | |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | * you may not use this file except in compliance with the License. | |
6 | * You may obtain a copy of the License at: | |
7 | * | |
8 | * http://www.apache.org/licenses/LICENSE-2.0 | |
9 | * | |
10 | * Unless required by applicable law or agreed to in writing, software | |
11 | * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | * See the License for the specific language governing permissions and | |
14 | * limitations under the License. | |
15 | */ | |
16 | ||
17 | #ifndef SOCKET_UTIL_H | |
18 | #define SOCKET_UTIL_H 1 | |
19 | ||
20 | #include <errno.h> | |
21 | #include <sys/types.h> | |
22 | #include <sys/socket.h> | |
23 | #include <sys/time.h> | |
24 | #include <sys/un.h> | |
25 | #include <netinet/in.h> | |
26 | #include <stdbool.h> | |
27 | #include "openvswitch/types.h" | |
28 | #include <netinet/in_systm.h> | |
29 | #include <netinet/ip.h> | |
30 | ||
31 | int set_nonblocking(int fd); | |
32 | void xset_nonblocking(int fd); | |
33 | void setsockopt_tcp_nodelay(int fd); | |
34 | int set_dscp(int fd, int family, uint8_t dscp); | |
35 | ||
36 | bool addr_is_ipv6(const char *host_name); | |
37 | int lookup_ip(const char *host_name, struct in_addr *address); | |
38 | int lookup_ipv6(const char *host_name, struct in6_addr *address); | |
39 | ||
40 | int lookup_hostname(const char *host_name, struct in_addr *); | |
41 | ||
42 | int get_socket_rcvbuf(int sock); | |
43 | int check_connection_completion(int fd); | |
44 | void drain_fd(int fd, size_t n_packets); | |
45 | ovs_be32 guess_netmask(ovs_be32 ip); | |
46 | ||
47 | bool inet_parse_active(const char *target, uint16_t default_port, | |
48 | struct sockaddr_storage *ssp); | |
49 | int inet_open_active(int style, const char *target, uint16_t default_port, | |
50 | struct sockaddr_storage *ssp, int *fdp, uint8_t dscp); | |
51 | ||
52 | bool inet_parse_passive(const char *target, int default_port, | |
53 | struct sockaddr_storage *ssp); | |
54 | int inet_open_passive(int style, const char *target, int default_port, | |
55 | struct sockaddr_storage *ssp, uint8_t dscp, | |
56 | bool kernel_print_port); | |
57 | ||
58 | int read_fully(int fd, void *, size_t, size_t *bytes_read); | |
59 | int write_fully(int fd, const void *, size_t, size_t *bytes_written); | |
60 | ||
61 | int fsync_parent_dir(const char *file_name); | |
62 | int get_mtime(const char *file_name, struct timespec *mtime); | |
63 | ||
64 | char *describe_fd(int fd); | |
65 | ||
66 | /* Default value of dscp bits for connection between controller and manager. | |
67 | * Value of IPTOS_PREC_INTERNETCONTROL = 0xc0 which is defined | |
68 | * in <netinet/ip.h> is used. */ | |
69 | #define DSCP_DEFAULT (IPTOS_PREC_INTERNETCONTROL >> 2) | |
70 | ||
71 | /* Functions for working with sockaddr_storage that might contain an IPv4 or | |
72 | * IPv6 address. */ | |
73 | uint16_t ss_get_port(const struct sockaddr_storage *); | |
74 | #define SS_NTOP_BUFSIZE (1 + INET6_ADDRSTRLEN + 1) | |
75 | char *ss_format_address(const struct sockaddr_storage *, | |
76 | char *buf, size_t bufsize); | |
77 | size_t ss_length(const struct sockaddr_storage *); | |
78 | const char *sock_strerror(int error); | |
79 | ||
80 | #ifndef _WIN32 | |
81 | void xpipe(int fds[2]); | |
82 | void xpipe_nonblocking(int fds[2]); | |
83 | ||
84 | int drain_rcvbuf(int fd); | |
85 | ||
86 | int make_unix_socket(int style, bool nonblock, | |
87 | const char *bind_path, const char *connect_path); | |
88 | int get_unix_name_len(const struct sockaddr_un *sun, socklen_t sun_len); | |
89 | ||
90 | /* Helpers for calling ioctl() on an AF_INET socket. */ | |
91 | struct ifreq; | |
92 | int af_inet_ioctl(unsigned long int command, const void *arg); | |
93 | int af_inet_ifreq_ioctl(const char *name, struct ifreq *, | |
94 | unsigned long int cmd, const char *cmd_name); | |
95 | ||
96 | #define closesocket close | |
97 | #endif | |
98 | ||
99 | #ifdef _WIN32 | |
100 | static inline int make_unix_socket(int style, bool nonblock, | |
101 | const char *bind_path, | |
102 | const char *connect_path) | |
103 | { | |
104 | return -EINVAL; | |
105 | } | |
106 | ||
107 | /* Windows defines the 'optval' argument as char * instead of void *. */ | |
108 | #define setsockopt(sock, level, optname, optval, optlen) \ | |
109 | rpl_setsockopt(sock, level, optname, optval, optlen) | |
110 | static inline int rpl_setsockopt(int sock, int level, int optname, | |
111 | const void *optval, socklen_t optlen) | |
112 | { | |
113 | return (setsockopt)(sock, level, optname, optval, optlen); | |
114 | } | |
115 | ||
116 | #define getsockopt(sock, level, optname, optval, optlen) \ | |
117 | rpl_getsockopt(sock, level, optname, optval, optlen) | |
118 | static inline int rpl_getsockopt(int sock, int level, int optname, | |
119 | void *optval, socklen_t *optlen) | |
120 | { | |
121 | return (getsockopt)(sock, level, optname, optval, optlen); | |
122 | } | |
123 | #endif | |
124 | ||
125 | /* In Windows platform, errno is not set for socket calls. | |
126 | * The last error has to be gotten from WSAGetLastError(). */ | |
127 | static inline int sock_errno(void) | |
128 | { | |
129 | #ifdef _WIN32 | |
130 | return WSAGetLastError(); | |
131 | #else | |
132 | return errno; | |
133 | #endif | |
134 | } | |
135 | ||
136 | #endif /* socket-util.h */ |