Modifying the return value of cfg_set* functions, in order to make
[sip-router] / ser_stun.h
1 /*
2  * $Id$
3  *
4  * Copyright (C) 2001-2003 FhG Fokus
5  *
6  * This file is part of ser, a free SIP server.
7  *
8  * ser is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version
12  *
13  * For a license to use the ser software under conditions
14  * other than those described here, or to purchase support for this
15  * software, please contact iptel.org by e-mail at the following addresses:
16  *    info@iptel.org
17  *
18  * ser is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26  *
27  *
28  * History:
29  * --------
30  *  2006-10-13  created (vlada)
31  */
32
33
34 #ifndef _ser_stun_h
35 #define _ser_stun_h
36
37 #ifdef USE_STUN
38
39 #include <openssl/sha.h>
40
41 #include "str.h"
42 #include "tcp_conn.h"
43 #include "ip_addr.h"
44
45 /* type redefinition */
46 typedef unsigned char   UCHAR_T;
47 typedef unsigned short USHORT_T;
48 typedef unsigned int    UINT_T;
49 typedef unsigned long   ULONG_T;
50
51 /* STUN message types supported by SER */
52 #define BINDING_REQUEST                 0x0001
53 #define BINDING_RESPONSE                0x0101
54 #define BINDING_ERROR_RESPONSE  0x0111
55
56 /* common STUN attributes */
57 #define MAPPED_ADDRESS_ATTR             0x0001
58 #define USERNAME_ATTR                   0x0006
59 #define PASSWORD_ATTR                   0x0007
60 #define MESSAGE_INTEGRITY_ATTR  0x0008
61 #define ERROR_CODE_ATTR                 0x0009
62 #define UNKNOWN_ATTRIBUTES_ATTR 0x000A
63
64 /* STUN attributes defined by rfc3489bis */
65 #define REALM_ATTR                              0x0014
66 #define NONCE_ATTR                              0x0015
67 #define XOR_MAPPED_ADDRESS_ATTR 0x0020 
68 #define FINGERPRINT_ATTR                0x0023
69 #define SERVER_ATTR                             0x8022
70 #define ALTERNATE_SERVER_ATTR   0x8023
71 #define REFRESH_INTERVAL_ATTR   0x8024
72
73 /* STUN attributes defined by rfc3489 */
74 #define RESPONSE_ADDRESS_ATTR   0x0002
75 #define CHANGE_REQUEST_ATTR             0x0003
76 #define SOURCE_ADDRESS_ATTR             0x0004
77 #define CHANGED_ADDRESS_ATTR    0x0005
78 #define REFLECTED_FROM_ATTR             0x000b
79
80 /* STUN error codes supported by SER */
81 #define RESPONSE_OK                             200
82 #define TRY_ALTERNATE_ERR               300
83 #define BAD_REQUEST_ERR                 400
84 #define UNAUTHORIZED_ERR                401
85 #define UNKNOWN_ATTRIBUTE_ERR   420
86 #define STALE_CREDENTIALS_ERR   430
87 #define INTEGRITY_CHECK_ERR             431
88 #define MISSING_USERNAME_ERR    432
89 #define USE_TLS_ERR                             433
90 #define MISSING_REALM_ERR               434
91 #define MISSING_NONCE_ERR               435
92 #define UNKNOWN_USERNAME_ERR    436
93 #define STALE_NONCE_ERR                 438
94 #define SERVER_ERROR_ERR                500
95 #define GLOBAL_FAILURE_ERR              600
96
97 #define TRY_ALTERNATE_TXT      "Try Alternate"
98 #define BAD_REQUEST_TXT        "Bad Request"
99 #define UNAUTHORIZED_TXT       "Unauthorized"
100 #define UNKNOWN_ATTRIBUTE_TXT  "Unknown Attribute"
101 #define STALE_CREDENTIALS_TXT  "Stale Credentials"
102 #define INTEGRITY_CHECK_TXT    "Integrity Check Failure"
103 #define MISSING_USERNAME_TXT   "Missing Username"
104 #define USE_TLS_TXT            "Use TLS"
105 #define MISSING_REALM_TXT      "Missing Realm"
106 #define MISSING_NONCE_TXT      "Missing Nonce"
107 #define UNKNOWN_USERNAME_TXT   "Unknown Username"
108 #define STALE_NONCE_TXT        "Stale Nonce"
109 #define SERVER_ERROR_TXT       "Server Error"
110 #define GLOBAL_FAILURE_TXT     "Global Failure"
111
112
113 /* other stuff */
114 #define MAGIC_COOKIE    0x2112A442
115 #define MAGIC_COOKIE_2B 0x2112  /* because of XOR for port */
116 #define MANDATORY_ATTR  0x7fff
117 #define PAD4                    4
118 #define PAD64                   64
119 #define STUN_MSG_LEN    516
120 #define IPV4_LEN                4
121 #define IPV6_LEN                16
122 #define IPV4_FAMILY             0x0001
123 #define IPV6_FAMILY             0x0002
124 #define FATAL_ERROR             -1
125 #define IP_ADDR                 4
126 #define XOR                             1
127 #define TRANSACTION_ID  12
128
129 #define PADDED_TO_FOUR(len) (len == 0) ? 0 : len + (PAD4 - len%PAD4)
130 #define PADDED_TO_SIXTYFOUR(len) (len == 0) ? 0 : len + (PAD64 - len%PAD64)
131
132 struct transaction_id {
133         UINT_T  magic_cookie;
134         UCHAR_T id[TRANSACTION_ID];
135 };
136
137 struct stun_hdr {
138         USHORT_T                                type;
139         USHORT_T                                len;
140         struct transaction_id   id;
141 };
142
143 struct stun_ip_addr {
144         USHORT_T        family; /* 0x01: IPv4; 0x02: IPv6 */
145         USHORT_T        port;
146         UINT_T          ip[IP_ADDR];
147 };
148
149 struct stun_buffer {
150         str                     buf;
151         USHORT_T        empty;  /* number of free bytes in buf before 
152                                                  * it'll be necessary to realloc the buf 
153                                                  */
154 };
155
156 struct stun_unknown_att {
157         USHORT_T                                        type;
158         struct stun_unknown_att*        next;
159 };
160
161 struct stun_attr {
162         USHORT_T        type;
163         USHORT_T        len;
164 };
165
166 struct stun_msg {
167         struct stun_hdr                 hdr;
168         struct stun_ip_addr             ip_addr;                /* XOR values for rfc3489bis, 
169                                                                                         normal values for rfc3489 */
170         char                                    fp[SHA_DIGEST_LENGTH];          /* fingerprint value */
171         struct stun_buffer              msg;
172         UCHAR_T                                 old;            /* true: the format of message is in 
173                                                                                 accordance with rfc3489 */ 
174 };
175
176
177 /*
178  * stun functions called from ser
179  */
180 int stun_process_msg(char* buf, unsigned len, struct receive_info* ri);
181
182 #endif /* USE_STUN */
183
184 #endif  /* _ser_stun_h */