core: Changed WS from being a flag on a TCP/TLS connection to a protocol in its own...
[sip-router] / socket_info.h
1 /* $Id$
2  *
3  * find & manage listen addresses 
4  *
5  * Copyright (C) 2001-2003 FhG Fokus
6  *
7  * This file is part of ser, a free SIP server.
8  *
9  * ser is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version
13  *
14  * For a license to use the ser software under conditions
15  * other than those described here, or to purchase support for this
16  * software, please contact iptel.org by e-mail at the following addresses:
17  *    info@iptel.org
18  *
19  * ser is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License 
25  * along with this program; if not, write to" the Free Software 
26  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
27  */
28 /*
29  * This file contains code that initializes and handles ser listen addresses
30  * lists (struct socket_info). It is used mainly on startup.
31  * 
32  * History:
33  * --------
34  *  2003-10-22  created by andrei
35  *  2008-08-08  sctp support (andrei)
36  */
37
38
39 #ifndef socket_info_h
40 #define socket_info_h
41
42 #include "ip_addr.h" 
43 #include "dprint.h"
44 #include "globals.h"
45
46 /* This macro evaluates to the maximum length of string buffer needed to print
47  * the text description of any socket, not counting the terminating zero added
48  * by socket2str */
49 #define MAX_SOCKET_STR (sizeof("unknown") - 1 + IP_ADDR_MAX_STR_SIZE + \
50         INT2STR_MAX_LEN + 2 + 2)
51
52 int socket2str(char* s, int* len, struct socket_info* si);
53 int socketinfo2str(char* s, int* len, struct socket_info* si, int mode);
54
55
56 /* struct socket_info is defined in ip_addr.h */
57
58 extern struct socket_info* udp_listen;
59 #ifdef USE_TCP
60 extern struct socket_info* tcp_listen;
61 #endif
62 #ifdef USE_TLS
63 extern struct socket_info* tls_listen;
64 #endif
65 #ifdef USE_SCTP
66 extern struct socket_info* sctp_listen;
67 #endif
68
69 extern enum sip_protos nxt_proto[PROTO_LAST+1];
70
71
72
73 /* flags for finding out the address types */
74 #define SOCKET_T_IPV4  1
75 #define SOCKET_T_IPV6  2
76 #define SOCKET_T_UDP   4
77 #define SOCKET_T_TCP   8
78 #define SOCKET_T_TLS  16
79 #define SOCKET_T_SCTP 32
80
81 extern int socket_types;
82
83 void init_proto_order(void);
84
85 int add_listen_iface(char* name, struct name_lst* nlst,
86                                                 unsigned short port, unsigned short proto,
87                                                 enum si_flags flags);
88 int add_listen_advertise_iface(char* name, struct name_lst* nlst,
89                                                 unsigned short port, unsigned short proto,
90                                                 char *useaddr, unsigned short useport,
91                                                 enum si_flags flags);
92 int fix_all_socket_lists(void);
93 void print_all_socket_lists(void);
94 void print_aliases(void);
95
96 struct socket_info* grep_sock_info(str* host, unsigned short port,
97                                                                                 unsigned short proto);
98 struct socket_info* grep_sock_info_by_port(unsigned short port,
99                                                                                         unsigned short proto);
100 struct socket_info* find_si(struct ip_addr* ip, unsigned short port,
101                                                                                                 unsigned short proto);
102
103 struct socket_info** get_sock_info_list(unsigned short proto);
104
105 int parse_phostport(char* s, char** host, int* hlen,
106                                                                  int* port, int* proto);
107
108 /* helper function:
109  * returns next protocol, if the last one is reached return 0
110  * useful for cycling on the supported protocols
111  * order: udp, tcp, tls, sctp */
112 static inline int next_proto(unsigned short proto)
113 {
114         if (proto>PROTO_LAST)
115                         LOG(L_ERR, "ERROR: next_proto: unknown proto %d\n", proto);
116         else
117                 return nxt_proto[proto];
118         return 0;
119 }
120
121
122
123 /* gets first non-null socket_info structure
124  * (useful if for. e.g we are not listening on any udp sockets )
125  */
126 inline static struct socket_info* get_first_socket(void)
127 {
128         if (udp_listen) return udp_listen;
129 #ifdef USE_TCP
130         else if (tcp_listen) return tcp_listen;
131 #endif
132 #ifdef USE_SCTP
133         else if (sctp_listen) return sctp_listen;
134 #endif
135 #ifdef USE_TCP
136 #ifdef USE_TLS
137         else if (tls_listen) return tls_listen;
138 #endif
139 #endif
140         return 0;
141 }
142
143
144 #endif