Mercurial > hg > freeDiameter
annotate extensions/app_radgw/rgwx_sip.c @ 380:6641d6f80cb6
Added test app for Diameter-SIP(client side)
author | Alexandre Westfahl <awestfahl@freediameter.net> |
---|---|
date | Mon, 05 Jul 2010 17:08:51 +0900 |
parents | 350e1cca3782 |
children | 260b8e10f471 |
rev | line source |
---|---|
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
1 /********************************************************************************************************* |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
2 * Software License Agreement (BSD License) * |
363
b8ad6f9a7748
Updated Copyright information of SIP plugin
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
361
diff
changeset
|
3 * Author: Alexandre Westfahl <awestfahl@freediameter.net> * |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
4 * * |
363
b8ad6f9a7748
Updated Copyright information of SIP plugin
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
361
diff
changeset
|
5 * Copyright (c) 2010, Alexandre Westfahl, Teraoka Laboratory (Keio University), and the WIDE Project. * |
b8ad6f9a7748
Updated Copyright information of SIP plugin
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
361
diff
changeset
|
6 * * |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
7 * All rights reserved. * |
363
b8ad6f9a7748
Updated Copyright information of SIP plugin
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
361
diff
changeset
|
8 * Based on rgwx_auth plugin (Sebastien Decugis <sdecugis@nict.go.jp>) * |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
9 * * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
10 * Redistribution and use of this software in source and binary forms, with or without modification, are * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
11 * permitted provided that the following conditions are met: * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
12 * * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
13 * * Redistributions of source code must retain the above * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
14 * copyright notice, this list of conditions and the * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
15 * following disclaimer. * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
16 * * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
17 * * Redistributions in binary form must reproduce the above * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
18 * copyright notice, this list of conditions and the * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
19 * following disclaimer in the documentation and/or other * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
20 * materials provided with the distribution. * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
21 * * |
363
b8ad6f9a7748
Updated Copyright information of SIP plugin
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
361
diff
changeset
|
22 * * Neither the name of the Teraoka Laboratory nor the * |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
23 * names of its contributors may be used to endorse or * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
24 * promote products derived from this software without * |
363
b8ad6f9a7748
Updated Copyright information of SIP plugin
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
361
diff
changeset
|
25 * specific prior written permission of Teraoka Laboratory * |
b8ad6f9a7748
Updated Copyright information of SIP plugin
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
361
diff
changeset
|
26 * * |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
27 * * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
30 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
31 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
32 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
34 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
35 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
36 *********************************************************************************************************/ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
37 |
363
b8ad6f9a7748
Updated Copyright information of SIP plugin
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
361
diff
changeset
|
38 |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
39 /* RADIUS Access-Request messages translation plugin */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
40 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
41 #include "rgw_common.h" |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
42 #include <string.h> |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
43 #include <stdio.h> |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
44 #include <string.h> |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
45 #include <stdlib.h> |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
46 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
47 /* Other constants we use */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
48 #define AI_SIP 6 /* Diameter SIP application */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
49 #define CC_MULTIMEDIA_AUTH_REQUEST 286 /* MAR */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
50 #define CC_MULTIMEDIA_AUTH_ANSWER 286 /* MAA */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
51 #define ACV_ASS_STATE_MAINTAINED 0 /* STATE_MAINTAINED */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
52 #define ACV_ASS_NO_STATE_MAINTAINED 1 /* NO_STATE_MAINTAINED */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
53 #define ER_DIAMETER_MULTI_ROUND_AUTH 1001 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
54 #define ER_DIAMETER_SUCCESS 2001 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
55 #define ER_DIAMETER_LIMITED_SUCCESS 2002 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
56 #define ER_DIAMETER_SUCCESS_AUTH_SENT_SERVER_NOT_STORED 2008 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
57 #define ER_DIAMETER_SUCCESS_SERVER_NAME_NOT_STORED 2006 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
58 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
59 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
60 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
61 /* This macro converts a RADIUS attribute to a Diameter AVP of type OctetString */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
62 #define CONV2DIAM_STR( _dictobj_ ) \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
63 CHECK_PARAMS( attr->length >= 2 ); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
64 /* Create the AVP with the specified dictionary model */ \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
65 CHECK_FCT( fd_msg_avp_new ( cs->dict._dictobj_, 0, &avp ) ); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
66 value.os.len = attr->length - 2; \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
67 value.os.data = (unsigned char *)(attr + 1); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
68 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
69 /* Add the AVP in the Diameter message. */ \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
70 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_LAST_CHILD, avp) ); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
71 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
72 #define CONV2DIAM_STR_AUTH( _dictobj_ ) \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
73 CHECK_PARAMS( attr->length >= 2 ); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
74 /* Create the AVP with the specified dictionary model */ \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
75 CHECK_FCT( fd_msg_avp_new ( cs->dict._dictobj_, 0, &avp ) ); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
76 value.os.len = attr->length - 2; \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
77 value.os.data = (unsigned char *)(attr + 1); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
78 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
79 /* Add the AVP in the Diameter message. */ \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
80 CHECK_FCT( fd_msg_avp_add ( auth, MSG_BRW_LAST_CHILD, avp) ); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
81 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
82 /* Same thing, for scalar AVPs of 32 bits */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
83 #define CONV2DIAM_32B( _dictobj_ ) \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
84 CHECK_PARAMS( attr->length == 6 ); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
85 CHECK_FCT( fd_msg_avp_new ( cs->dict._dictobj_, 0, &avp ) ); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
86 { \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
87 uint8_t * v = (uint8_t *)(attr + 1); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
88 value.u32 = (v[0] << 24) \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
89 | (v[1] << 16) \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
90 | (v[2] << 8) \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
91 | v[3] ; \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
92 } \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
93 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
94 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_LAST_CHILD, avp) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
95 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
96 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
97 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
98 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
99 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
100 /* The state we keep for this plugin */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
101 struct rgwp_config { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
102 struct { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
103 struct dict_object * Session_Id; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
104 struct dict_object * Auth_Application_Id; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
105 struct dict_object * Auth_Session_State; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
106 struct dict_object * Origin_Host; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
107 struct dict_object * Origin_Realm; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
108 struct dict_object * Destination_Realm; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
109 struct dict_object * SIP_AOR; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
110 struct dict_object * SIP_Method; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
111 struct dict_object * Destination_Host; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
112 struct dict_object * User_Name; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
113 struct dict_object * SIP_Server_URI; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
114 struct dict_object * SIP_Number_Auth_Items; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
115 struct dict_object * SIP_Authorization; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
116 struct dict_object * SIP_Authentication_Scheme; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
117 struct dict_object * SIP_Authentication_Info; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
118 struct dict_object * SIP_Auth_Data_Item; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
119 struct dict_object * Proxy_Info; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
120 struct dict_object * Route_Record; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
121 struct dict_object * Service_Type; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
122 struct dict_object * Result_Code; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
123 struct dict_object * Digest_URI; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
124 struct dict_object * Digest_Nonce; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
125 struct dict_object * Digest_CNonce; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
126 struct dict_object * Digest_Nonce_Count; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
127 struct dict_object * Digest_Realm; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
128 struct dict_object * Digest_Response; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
129 struct dict_object * Digest_Method; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
130 struct dict_object * Digest_Response_Auth; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
131 struct dict_object * Digest_Username; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
132 struct dict_object * Digest_Algorithm; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
133 struct dict_object * Digest_QOP; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
134 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
135 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
136 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
137 } dict; /* cache of the dictionary objects we use */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
138 struct session_handler * sess_hdl; /* We store RADIUS request authenticator information in the session */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
139 char * confstr; |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
140 //Chained list of nonce |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
141 struct fd_list listnonce; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
142 //This will be used to lock access to chained list |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
143 pthread_mutex_t nonce_mutex; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
144 }; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
145 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
146 typedef struct noncechain noncechain; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
147 struct noncechain |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
148 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
149 struct fd_list chain; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
150 char * sid; |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
151 size_t sidlen; |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
152 char * nonce; |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
153 size_t noncelen; |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
154 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
155 }; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
156 |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
157 static int nonce_add_element(char * nonce, size_t noncelen,char * sid, size_t sidlen, struct rgwp_config * state) |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
158 { |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
159 CHECK_PARAMS(nonce && state && sid && sidlen && noncelen); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
160 |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
161 noncechain *newelt; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
162 CHECK_MALLOC(newelt=malloc(sizeof(noncechain))); |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
163 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
164 CHECK_MALLOC(newelt->nonce=malloc(noncelen)); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
165 memcpy(newelt->nonce,nonce,noncelen); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
166 newelt->noncelen=noncelen; |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
167 |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
168 CHECK_MALLOC(newelt->sid=malloc(sidlen)); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
169 memcpy(newelt->sid,sid,sidlen); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
170 newelt->sidlen=sidlen; |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
171 |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
172 fd_list_init(&newelt->chain,NULL); |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
173 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
174 CHECK_POSIX(pthread_mutex_lock(&state->nonce_mutex)); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
175 fd_list_insert_before(&state->listnonce,&newelt->chain); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
176 CHECK_POSIX(pthread_mutex_unlock(&state->nonce_mutex)); |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
177 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
178 return 0; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
179 } |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
180 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
181 static void nonce_del_element(char * nonce, struct rgwp_config *state) |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
182 { |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
183 struct fd_list * li; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
184 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
185 CHECK_PARAMS_DO(nonce && state, return); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
186 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
187 for(li=state->listnonce.next;li!=&state->listnonce;li=li->next) |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
188 { |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
189 noncechain *temp=(noncechain *)li; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
190 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
191 if(strcmp(temp->nonce,nonce)==0) |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
192 { |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
193 fd_list_unlink (li); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
194 free(temp->sid); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
195 free(temp->nonce); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
196 free(temp); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
197 break; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
198 } |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
199 } |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
200 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
201 |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
202 //Retrieve sid from nonce |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
203 static char * nonce_get_sid(char * nonce, size_t noncelen, size_t * sidlen, struct rgwp_config *state) |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
204 { |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
205 struct fd_list * li; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
206 char *sid=NULL; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
207 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
208 CHECK_PARAMS_DO(nonce && state && noncelen && sidlen, return); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
209 *sidlen=0; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
210 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
211 //**Start mutex |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
212 CHECK_POSIX_DO(pthread_mutex_lock(&state->nonce_mutex),); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
213 for(li=state->listnonce.next;li!=&state->listnonce;li=li->next) |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
214 { |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
215 noncechain *temp=(noncechain *)li; |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
216 |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
217 if(temp->noncelen==noncelen && strncmp(temp->nonce,nonce, noncelen)==0) |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
218 { |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
219 fd_list_unlink (li); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
220 sid=temp->sid; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
221 *sidlen=temp->sidlen; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
222 free(temp->nonce); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
223 free(temp); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
224 break; |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
225 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
226 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
227 } |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
228 CHECK_POSIX_DO(pthread_mutex_unlock(&state->nonce_mutex),); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
229 //***Stop mutex |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
230 return sid; |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
231 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
232 |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
233 static void nonce_deletelistnonce(struct rgwp_config *state) |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
234 { |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
235 //**Start mutex |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
236 CHECK_POSIX_DO(pthread_mutex_lock(&state->nonce_mutex),); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
237 while(!(FD_IS_LIST_EMPTY(&state->listnonce)) ) |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
238 { |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
239 noncechain *temp=(noncechain *)state->listnonce.next; |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
240 |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
241 fd_list_unlink (&temp->chain); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
242 free(temp->sid); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
243 free(temp->nonce); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
244 free(temp); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
245 |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
246 } |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
247 CHECK_POSIX_DO(pthread_mutex_unlock(&state->nonce_mutex),); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
248 //***Stop mutex |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
249 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
250 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
251 /* Initialize the plugin */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
252 static int sip_conf_parse(char * conffile, struct rgwp_config ** state) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
253 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
254 struct rgwp_config * new; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
255 struct dict_object * app; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
256 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
257 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
258 TRACE_ENTRY("%p %p", conffile, state); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
259 CHECK_PARAMS( state ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
260 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
261 CHECK_MALLOC( new = malloc(sizeof(struct rgwp_config)) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
262 memset(new, 0, sizeof(struct rgwp_config)); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
263 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
264 CHECK_FCT( fd_sess_handler_create( &new->sess_hdl, free ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
265 new->confstr = conffile; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
266 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
267 /* Resolve all dictionary objects we use */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
268 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Session-Id", &new->dict.Session_Id, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
269 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Auth-Application-Id", &new->dict.Auth_Application_Id, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
270 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Auth-Session-State", &new->dict.Auth_Session_State, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
271 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Origin-Host", &new->dict.Origin_Host, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
272 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Origin-Realm", &new->dict.Origin_Realm, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
273 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Destination-Realm", &new->dict.Destination_Realm, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
274 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "SIP-AOR", &new->dict.SIP_AOR, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
275 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "SIP-Method", &new->dict.SIP_Method, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
276 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Destination-Host", &new->dict.Destination_Host, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
277 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "User-Name", &new->dict.User_Name, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
278 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "SIP-Server-URI", &new->dict.SIP_Server_URI, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
279 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "SIP-Number-Auth-Items", &new->dict.SIP_Number_Auth_Items, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
280 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "SIP-Authorization", &new->dict.SIP_Authorization, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
281 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "SIP-Auth-Data-Item", &new->dict.SIP_Auth_Data_Item, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
282 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "SIP-Authentication-Scheme", &new->dict.SIP_Authentication_Scheme, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
283 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "SIP-Authentication-Info", &new->dict.SIP_Authentication_Info, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
284 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Proxy-Info", &new->dict.Proxy_Info, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
285 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Route-Record", &new->dict.Route_Record, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
286 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Result-Code", &new->dict.Result_Code, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
287 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Digest-URI", &new->dict.Digest_URI, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
288 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Digest-Nonce", &new->dict.Digest_Nonce, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
289 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Digest-Method", &new->dict.Digest_Method, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
290 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Digest-CNonce", &new->dict.Digest_CNonce, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
291 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Digest-Nonce-Count", &new->dict.Digest_Nonce_Count, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
292 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Digest-Realm", &new->dict.Digest_Realm, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
293 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Digest-Response", &new->dict.Digest_Response, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
294 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Digest-Response-Auth", &new->dict.Digest_Response_Auth, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
295 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Digest-Username", &new->dict.Digest_Username, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
296 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Digest-Algorithm", &new->dict.Digest_Algorithm, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
297 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Digest-QoP", &new->dict.Digest_QOP, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
298 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
299 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
300 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
301 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_APPLICATION, APPLICATION_BY_NAME, "Diameter Session Initiation Protocol (SIP) Application", &app, ENOENT) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
302 CHECK_FCT( fd_disp_app_support ( app, NULL, 1, 0 ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
303 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
304 //chained list |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
305 fd_list_init(&new->listnonce,NULL); |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
306 CHECK_POSIX(pthread_mutex_init(&new->nonce_mutex,NULL)); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
307 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
308 *state = new; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
309 return 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
310 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
311 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
312 /* deinitialize */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
313 static void sip_conf_free(struct rgwp_config * state) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
314 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
315 TRACE_ENTRY("%p", state); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
316 CHECK_PARAMS_DO( state, return ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
317 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
318 CHECK_FCT_DO( fd_sess_handler_destroy( &state->sess_hdl ), ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
319 |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
320 nonce_deletelistnonce(state); |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
321 CHECK_POSIX_DO(pthread_mutex_destroy(&state->nonce_mutex), /*continue*/); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
322 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
323 free(state); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
324 return; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
325 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
326 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
327 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
328 /* Handle an incoming RADIUS request */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
329 static int sip_rad_req( struct rgwp_config * cs, struct session ** session, struct radius_msg * rad_req, struct radius_msg ** rad_ans, struct msg ** diam_fw, struct rgw_client * cli ) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
330 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
331 int idx; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
332 int got_AOR = 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
333 int got_Dusername = 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
334 int got_Drealm = 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
335 int got_Duri = 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
336 int got_Dmethod = 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
337 int got_Dqop = 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
338 int got_Dnonce_count = 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
339 int got_Dnonce = 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
340 int got_Dcnonce = 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
341 int got_Dresponse = 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
342 int got_Dalgorithm = 0; |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
343 char * sid = NULL; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
344 char * un=NULL; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
345 size_t un_len; |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
346 uint32_t status_type; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
347 size_t nattr_used = 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
348 struct avp *auth_data=NULL, *auth=NULL, *avp = NULL; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
349 union avp_value value; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
350 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
351 TRACE_ENTRY("%p %p %p %p %p %p", cs, session, rad_req, rad_ans, diam_fw, cli); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
352 |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
353 CHECK_PARAMS(rad_req && (rad_req->hdr->code == RADIUS_CODE_ACCESS_REQUEST) && rad_ans && diam_fw && *diam_fw && session); |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
354 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
355 //We check that session is not already filled |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
356 if(*session) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
357 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
358 TRACE_DEBUG(INFO,"We are not supposed to receive a session in radSIP plugin."); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
359 return EINVAL; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
360 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
361 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
362 /* |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
363 RFC5090 RADIUS Extension Digest Application |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
364 */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
365 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
366 /* Check basic information is there */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
367 for (idx = 0; idx < rad_req->attr_used; idx++) { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
368 struct radius_attr_hdr * attr = (struct radius_attr_hdr *)(rad_req->buf + rad_req->attr_pos[idx]); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
369 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
370 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
371 switch (attr->type) { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
372 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
373 case RADIUS_ATTR_USER_NAME: |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
374 if (attr->length>sizeof(struct radius_attr_hdr)) |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
375 { |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
376 TRACE_DEBUG(ANNOYING, "Found a User-Name attribute: '%.*s'", attr->length- sizeof(struct radius_attr_hdr), (char *)(attr+1)); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
377 un = (char *)(attr + 1); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
378 un_len =attr->length - sizeof(struct radius_attr_hdr); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
379 } |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
380 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
381 case RADIUS_ATTR_DIGEST_USERNAME: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
382 got_Dusername = 1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
383 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
384 case RADIUS_ATTR_DIGEST_REALM: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
385 got_Drealm = 1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
386 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
387 case RADIUS_ATTR_DIGEST_URI: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
388 got_Duri = 1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
389 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
390 case RADIUS_ATTR_DIGEST_METHOD: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
391 got_Dmethod = 1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
392 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
393 case RADIUS_ATTR_DIGEST_QOP: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
394 got_Dqop = 1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
395 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
396 case RADIUS_ATTR_DIGEST_NONCE_COUNT: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
397 got_Dnonce_count = 1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
398 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
399 case RADIUS_ATTR_DIGEST_NONCE: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
400 got_Dnonce = 1; |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
401 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
402 size_t sidlen; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
403 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
404 sid=nonce_get_sid((char *)(attr+1),attr->length-2,&sidlen,cs); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
405 if(!sid) |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
406 { |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
407 TRACE_DEBUG(INFO,"We haven't found the session.'"); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
408 return EINVAL; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
409 } |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
410 CHECK_FCT(fd_sess_fromsid (sid, sidlen, session, NULL)); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
411 free(sid); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
412 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
413 |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
414 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
415 case RADIUS_ATTR_DIGEST_CNONCE: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
416 got_Dcnonce = 1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
417 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
418 case RADIUS_ATTR_DIGEST_RESPONSE: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
419 got_Dresponse = 1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
420 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
421 case RADIUS_ATTR_DIGEST_ALGORITHM: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
422 got_Dalgorithm = 1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
423 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
424 case RADIUS_ATTR_SIP_AOR: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
425 got_AOR = 1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
426 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
427 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
428 } |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
429 if(!un) |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
430 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
431 TRACE_DEBUG(INFO,"No Username in request"); |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
432 return EINVAL; |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
433 } |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
434 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
435 /* Create the session if it is not already done */ |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
436 if (!*session) { |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
437 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
438 char * fqdn; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
439 char * realm; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
440 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
441 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
442 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
443 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
444 /* Get information on the RADIUS client */ |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
445 CHECK_FCT( rgw_clients_get_origin(cli, &fqdn, &realm) ); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
446 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
447 int len; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
448 /* Create a new Session-Id. The format is: {fqdn;hi32;lo32;username;diamid} */ |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
449 CHECK_MALLOC( sid = malloc(un_len + 1 /* ';' */ + fd_g_config->cnf_diamid_len + 1 /* '\0' */) ); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
450 len = sprintf(sid, "%.*s;%s", un_len, un, fd_g_config->cnf_diamid); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
451 CHECK_FCT( fd_sess_new(session, fqdn, sid, len) ); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
452 free(sid); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
453 } |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
454 |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
455 /* Add the Destination-Realm AVP */ |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
456 CHECK_FCT( fd_msg_avp_new ( cs->dict.Destination_Realm, 0, &avp ) ); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
457 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
458 int i = 0; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
459 if (un) { |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
460 /* Is there an '@' in the user name? We don't care for decorated NAI here */ |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
461 for (i = un_len - 2; i > 0; i--) { |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
462 if (un[i] == '@') { |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
463 i++; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
464 break; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
465 } |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
466 } |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
467 } |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
468 if (i == 0) { |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
469 /* Not found in the User-Name => we use the local domain of this gateway */ |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
470 value.os.data = fd_g_config->cnf_diamrlm; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
471 value.os.len = fd_g_config->cnf_diamrlm_len; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
472 } else { |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
473 value.os.data = un + i; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
474 value.os.len = un_len - i; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
475 } |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
476 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
477 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
478 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_FIRST_CHILD, avp) ); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
479 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
480 /* Now, add the Session-Id AVP at beginning of Diameter message */ |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
481 CHECK_FCT( fd_sess_getsid(*session, &sid) ); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
482 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
483 TRACE_DEBUG(FULL, "[sip.rgwx] Translating new message for session '%s'...", sid); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
484 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
485 /* Add the Session-Id AVP as first AVP */ |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
486 CHECK_FCT( fd_msg_avp_new ( cs->dict.Session_Id, 0, &avp ) ); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
487 value.os.data = (unsigned char *)sid; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
488 value.os.len = strlen(sid); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
489 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
490 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_FIRST_CHILD, avp) ); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
491 |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
492 /* |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
493 If the RADIUS Access-Request message does not |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
494 contain any Digest-* attribute, then the RADIUS client does not want |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
495 to apply HTTP Digest authentication, in which case, actions at the |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
496 gateway are outside the scope of this document. |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
497 */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
498 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
499 if(!(got_Dmethod && got_Duri)) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
500 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
501 TRACE_DEBUG(INFO,"No Digest attributes in request, we drop it..."); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
502 return 1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
503 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
504 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
505 /* Add the appropriate command code & Auth-Application-Id */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
506 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
507 struct msg_hdr * header = NULL; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
508 CHECK_FCT( fd_msg_hdr ( *diam_fw, &header ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
509 header->msg_flags = CMD_FLAG_REQUEST | CMD_FLAG_PROXIABLE; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
510 header->msg_code = CC_MULTIMEDIA_AUTH_REQUEST; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
511 header->msg_appl = AI_SIP; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
512 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
513 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
514 /* Add the Auth-Application-Id */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
515 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
516 CHECK_FCT( fd_msg_avp_new ( cs->dict.Auth_Application_Id, 0, &avp ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
517 value.i32 = header->msg_appl; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
518 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
519 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_LAST_CHILD, avp) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
520 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
521 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
522 /*Add Auth_Session_State AVP */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
523 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
524 CHECK_FCT( fd_msg_avp_new ( cs->dict.Auth_Session_State, 0, &avp ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
525 value.i32 = ACV_ASS_NO_STATE_MAINTAINED; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
526 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
527 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_LAST_CHILD, avp) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
528 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
529 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
530 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
531 /*Add SIP_Number_Auth_Items AVP */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
532 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
533 CHECK_FCT( fd_msg_avp_new ( cs->dict.SIP_Number_Auth_Items, 0, &avp ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
534 value.i32 = 1; //We just treat one auth per request in gateway |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
535 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
536 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_LAST_CHILD, avp) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
537 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
538 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
539 /* Add SIP_Auth_Data_Item AVP */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
540 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
541 CHECK_FCT( fd_msg_avp_new ( cs->dict.SIP_Auth_Data_Item, 0, &auth_data ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
542 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
543 /* Add SIP_Authentication_Scheme AVP */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
544 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
545 CHECK_FCT( fd_msg_avp_new ( cs->dict.SIP_Authentication_Scheme, 0, &avp ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
546 value.i32=0; //There is only Digest Auth in RFC for now |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
547 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
548 CHECK_FCT( fd_msg_avp_add ( auth_data, MSG_BRW_LAST_CHILD, avp) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
549 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
550 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
551 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
552 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
553 /* Add SIP_Authorization AVP */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
554 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
555 CHECK_FCT( fd_msg_avp_new ( cs->dict.SIP_Authorization, 0, &auth ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
556 CHECK_FCT( fd_msg_avp_add ( auth_data, MSG_BRW_LAST_CHILD, auth) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
557 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
558 char * temp=NULL,*sipuri=NULL; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
559 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
560 for (idx = 0; idx < rad_req->attr_used; idx++) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
561 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
562 struct radius_attr_hdr * attr = (struct radius_attr_hdr *)(rad_req->buf + rad_req->attr_pos[idx]); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
563 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
564 switch (attr->type) { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
565 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
566 case RADIUS_ATTR_USER_NAME: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
567 CONV2DIAM_STR( User_Name ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
568 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
569 if(!got_Dusername) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
570 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
571 CONV2DIAM_STR_AUTH(Digest_Username); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
572 got_Dusername=1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
573 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
574 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
575 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
576 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
577 case RADIUS_ATTR_DIGEST_URI: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
578 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
579 CONV2DIAM_STR_AUTH(Digest_URI); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
580 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
581 //All of these attributes are required by Diameter but not defined in RFC5090 so we provide FAKE values (only in first exchange) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
582 if(!got_AOR) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
583 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
584 CONV2DIAM_STR( SIP_AOR ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
585 got_AOR=1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
586 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
587 /* |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
588 We must provide a fake nonce because of RFC4740 problem |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
589 TODO: remove when RFC is updated |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
590 ==START of FAKE |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
591 */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
592 if(!got_Dresponse) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
593 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
594 CONV2DIAM_STR_AUTH(Digest_Response); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
595 got_Dresponse=1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
596 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
597 /* |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
598 ==END of FAKE |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
599 */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
600 if(!got_Drealm) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
601 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
602 //We extract Realm from Digest_URI |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
603 char *realm=NULL; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
604 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
605 CHECK_MALLOC(temp=malloc(attr->length -1)); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
606 strncpy(temp, (char *)(attr + 1), attr->length -2); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
607 temp[attr->length-2] = '\0'; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
608 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
609 realm = strtok( (char *)(temp), "@" ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
610 realm = strtok( NULL, "@" ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
611 free(temp); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
612 temp=NULL; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
613 if(realm!=NULL) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
614 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
615 CHECK_FCT( fd_msg_avp_new ( cs->dict.Digest_Realm, 0, &avp ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
616 value.os.data=(unsigned char *)realm; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
617 value.os.len=strlen(realm); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
618 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
619 CHECK_FCT( fd_msg_avp_add ( auth, MSG_BRW_LAST_CHILD, avp) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
620 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
621 //We add SIP-Server-URI AVP because SIP server is registrar (through gateway) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
622 CHECK_FCT( fd_msg_avp_new ( cs->dict.SIP_Server_URI, 0, &avp ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
623 value.os.data=(unsigned char *)realm; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
624 value.os.len=strlen(realm); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
625 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
626 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_LAST_CHILD, avp) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
627 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
628 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
629 else |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
630 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
631 TRACE_DEBUG(INFO, "Can't extract domain from URI, droping request..."); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
632 return 1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
633 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
634 got_Drealm=1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
635 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
636 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
637 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
638 case RADIUS_ATTR_DIGEST_METHOD: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
639 CONV2DIAM_STR(SIP_Method); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
640 CONV2DIAM_STR_AUTH(Digest_Method); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
641 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
642 case RADIUS_ATTR_DIGEST_REALM: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
643 CONV2DIAM_STR_AUTH(Digest_Realm); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
644 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
645 //We add SIP-Server-URI AVP because SIP server is registrar (through gateway) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
646 CHECK_FCT( fd_msg_avp_new ( cs->dict.SIP_Server_URI, 0, &avp ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
647 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
648 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
649 CHECK_MALLOC(temp=malloc(attr->length -1)); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
650 strncpy(temp, (char *)(attr + 1), attr->length -2); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
651 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
652 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
653 CHECK_MALLOC(sipuri=malloc(attr->length +3)); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
654 strcpy(sipuri,"sip:"); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
655 strcat(sipuri,(unsigned char *)temp); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
656 value.os.data=(unsigned char *)sipuri; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
657 value.os.len=attr->length +2; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
658 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
659 free(temp); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
660 temp=NULL; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
661 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
662 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_LAST_CHILD, avp) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
663 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
664 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
665 case RADIUS_ATTR_DIGEST_USERNAME: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
666 CONV2DIAM_STR_AUTH(Digest_Username); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
667 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
668 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
669 case RADIUS_ATTR_DIGEST_QOP: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
670 CONV2DIAM_STR_AUTH( Digest_QOP ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
671 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
672 case RADIUS_ATTR_DIGEST_ALGORITHM: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
673 CONV2DIAM_STR_AUTH( Digest_Algorithm ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
674 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
675 case RADIUS_ATTR_DIGEST_CNONCE: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
676 CONV2DIAM_STR_AUTH( Digest_CNonce ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
677 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
678 case RADIUS_ATTR_DIGEST_NONCE: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
679 CONV2DIAM_STR_AUTH( Digest_Nonce ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
680 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
681 case RADIUS_ATTR_DIGEST_NONCE_COUNT: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
682 CONV2DIAM_STR_AUTH( Digest_Nonce_Count ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
683 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
684 case RADIUS_ATTR_DIGEST_RESPONSE: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
685 CONV2DIAM_STR_AUTH( Digest_Response ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
686 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
687 case RADIUS_ATTR_SIP_AOR: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
688 CONV2DIAM_STR( SIP_AOR ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
689 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
690 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
691 default: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
692 if(!got_Dalgorithm) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
693 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
694 //[Note 3] If Digest-Algorithm is missing, 'MD5' is assumed. |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
695 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
696 CHECK_FCT( fd_msg_avp_new ( cs->dict.Digest_Algorithm, 0, &avp ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
697 value.os.len = 3; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
698 value.os.data = "MD5"; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
699 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
700 CHECK_FCT( fd_msg_avp_add ( auth, MSG_BRW_LAST_CHILD, avp) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
701 got_Dalgorithm=1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
702 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
703 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
704 if(!got_Dnonce) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
705 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
706 //We give a fake nonce because it will be calculated at the server. |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
707 CHECK_FCT( fd_msg_avp_new ( cs->dict.Digest_Nonce, 0, &avp ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
708 value.os.data="nonce"; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
709 value.os.len=5; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
710 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
711 CHECK_FCT( fd_msg_avp_add ( auth, MSG_BRW_LAST_CHILD, avp) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
712 got_Dnonce=1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
713 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
714 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
715 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
716 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
717 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
718 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
719 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
720 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_LAST_CHILD, auth_data) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
721 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
722 /* Update the radius message to remove all handled attributes */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
723 rad_req->attr_used = nattr_used; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
724 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
725 //fd_msg_dump_walk(1,*diam_fw); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
726 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
727 /* Store the request identifier in the session (if provided) */ |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
728 if (*session) { |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
729 unsigned char * req_sip; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
730 CHECK_MALLOC(req_sip = malloc(16)); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
731 memcpy(req_sip, &rad_req->hdr->authenticator[0], 16); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
732 |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
733 CHECK_FCT( fd_sess_state_store( cs->sess_hdl, *session, &req_sip ) ); |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
734 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
735 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
736 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
737 return 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
738 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
739 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
740 static int sip_diam_ans( struct rgwp_config * cs, struct session * session, struct msg ** diam_ans, struct radius_msg ** rad_fw, struct rgw_client * cli, int * statefull ) |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
741 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
742 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
743 struct msg_hdr * hdr; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
744 struct avp *avp, *next, *asid; |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
745 struct avp_hdr *ahdr, *sid; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
746 //char buf[254]; /* to store some attributes values (with final '\0') */ |
369
350e1cca3782
Corrected compile bug (Gateway works with OpenSIPS)
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
368
diff
changeset
|
747 unsigned char * req_sip = NULL; |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
748 int in_success=0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
749 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
750 TRACE_ENTRY("%p %p %p %p %p", cs, session, diam_ans, rad_fw, cli); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
751 CHECK_PARAMS(cs && session && diam_ans && *diam_ans && rad_fw && *rad_fw); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
752 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
753 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
754 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
755 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
756 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
757 /* MACROS to help in the process: convert AVP data to RADIUS attributes. */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
758 /* Control large attributes: _trunc_ = 0 => error; _trunc_ = 1 => truncate; _trunc = 2 => create several attributes */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
759 #define CONV2RAD_STR( _attr_, _data_, _len_, _trunc_) { \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
760 size_t __l = (size_t)(_len_); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
761 size_t __off = 0; \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
762 TRACE_DEBUG(FULL, "Converting AVP to "#_attr_); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
763 if ((_trunc_) == 0) { \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
764 CHECK_PARAMS( __l <= 253 ); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
765 } \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
766 if ((__l > 253) && (_trunc_ == 1)) { \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
767 TRACE_DEBUG(INFO, "[authSIP.rgwx] AVP truncated in "#_attr_); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
768 __l = 253; \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
769 } \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
770 do { \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
771 size_t __w = (__l > 253) ? 253 : __l; \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
772 CHECK_MALLOC(radius_msg_add_attr(*rad_fw, (_attr_), (_data_) + __off, __w)); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
773 __off += __w; \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
774 __l -= __w; \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
775 } while (__l); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
776 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
777 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
778 #define CONV2RAD_32B( _attr_, _data_) { \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
779 uint32_t __v = htonl((uint32_t)(_data_)); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
780 TRACE_DEBUG(FULL, "Converting AVP to "#_attr_); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
781 CHECK_MALLOC(radius_msg_add_attr(*rad_fw, (_attr_), (uint8_t *)&__v, sizeof(__v))); \ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
782 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
783 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
784 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
785 /* Search the different AVPs we handle here */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
786 CHECK_FCT( fd_msg_search_avp (*diam_ans, cs->dict.Session_Id, &asid) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
787 CHECK_FCT( fd_msg_avp_hdr ( asid, &sid ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
788 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
789 /* Check the Diameter error code */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
790 CHECK_FCT( fd_msg_search_avp (*diam_ans, cs->dict.Result_Code, &avp) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
791 ASSERT( avp ); /* otherwise the message should have been discarded a lot earlier because of ABNF */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
792 CHECK_FCT( fd_msg_avp_hdr ( avp, &ahdr ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
793 switch (ahdr->avp_value->u32) { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
794 case ER_DIAMETER_MULTI_ROUND_AUTH: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
795 case ER_DIAMETER_SUCCESS_AUTH_SENT_SERVER_NOT_STORED: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
796 (*rad_fw)->hdr->code = RADIUS_CODE_ACCESS_CHALLENGE; |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
797 //struct timespec nowts; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
798 //CHECK_SYS(clock_gettime(CLOCK_REALTIME, &nowts)); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
799 //nowts.tv_sec+=600; |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
800 //CHECK_FCT(fd_sess_settimeout(session, &nowts )); |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
801 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
802 case ER_DIAMETER_SUCCESS_SERVER_NAME_NOT_STORED: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
803 case ER_DIAMETER_SUCCESS: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
804 (*rad_fw)->hdr->code = RADIUS_CODE_ACCESS_ACCEPT; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
805 in_success=1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
806 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
807 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
808 default: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
809 (*rad_fw)->hdr->code = RADIUS_CODE_ACCESS_REJECT; |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
810 fd_log_debug("[sip.rgwx] Received Diameter answer with error code '%d', session %.*s, translating into Access-Reject\n", |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
811 ahdr->avp_value->u32, |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
812 sid->avp_value->os.len, sid->avp_value->os.data); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
813 return 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
814 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
815 /* Remove this Result-Code avp */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
816 CHECK_FCT( fd_msg_free( avp ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
817 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
818 /* Now loop in the list of AVPs and convert those that we know how */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
819 CHECK_FCT( fd_msg_browse(*diam_ans, MSG_BRW_FIRST_CHILD, &next, NULL) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
820 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
821 while (next) { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
822 int handled = 1; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
823 avp = next; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
824 CHECK_FCT( fd_msg_browse(avp, MSG_BRW_WALK, &next, NULL) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
825 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
826 CHECK_FCT( fd_msg_avp_hdr ( avp, &ahdr ) ); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
827 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
828 if (!(ahdr->avp_flags & AVP_FLAG_VENDOR)) { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
829 switch (ahdr->avp_code) { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
830 |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
831 |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
832 case DIAM_ATTR_DIGEST_NONCE: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
833 CONV2RAD_STR(DIAM_ATTR_DIGEST_NONCE, ahdr->avp_value->os.data, ahdr->avp_value->os.len, 0); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
834 /* Retrieve the request identified which was stored in the session */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
835 if (session) { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
836 char *sid=NULL; |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
837 size_t sidlen; |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
838 fd_sess_getsid (session, &sid ); |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
839 sidlen=strlen(sid); |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
840 |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
841 nonce_add_element(ahdr->avp_value->os.data,ahdr->avp_value->os.len, sid,sidlen, cs); |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
842 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
843 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
844 case DIAM_ATTR_DIGEST_REALM: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
845 CONV2RAD_STR(DIAM_ATTR_DIGEST_REALM, ahdr->avp_value->os.data, ahdr->avp_value->os.len, 1); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
846 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
847 case DIAM_ATTR_DIGEST_QOP: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
848 CONV2RAD_STR(DIAM_ATTR_DIGEST_QOP, ahdr->avp_value->os.data, ahdr->avp_value->os.len, 1); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
849 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
850 case DIAM_ATTR_DIGEST_ALGORITHM: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
851 CONV2RAD_STR(DIAM_ATTR_DIGEST_ALGORITHM, ahdr->avp_value->os.data, ahdr->avp_value->os.len, 1); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
852 break; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
853 case DIAM_ATTR_DIGEST_RESPONSE_AUTH: |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
854 CONV2RAD_STR(DIAM_ATTR_DIGEST_RESPONSE_AUTH, ahdr->avp_value->os.data, ahdr->avp_value->os.len, 0); |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
855 break; |
380
6641d6f80cb6
Added test app for Diameter-SIP(client side)
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
369
diff
changeset
|
856 default: |
6641d6f80cb6
Added test app for Diameter-SIP(client side)
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
369
diff
changeset
|
857 handled=0; |
6641d6f80cb6
Added test app for Diameter-SIP(client side)
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
369
diff
changeset
|
858 break; |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
859 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
860 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
861 else |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
862 { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
863 /* Vendor-specific AVPs */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
864 switch (ahdr->avp_vendor) { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
865 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
866 default: /* unknown vendor */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
867 handled = 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
868 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
869 } |
380
6641d6f80cb6
Added test app for Diameter-SIP(client side)
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
369
diff
changeset
|
870 if (handled) { |
6641d6f80cb6
Added test app for Diameter-SIP(client side)
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
369
diff
changeset
|
871 CHECK_FCT( fd_msg_free( avp ) ); |
6641d6f80cb6
Added test app for Diameter-SIP(client side)
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
369
diff
changeset
|
872 } |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
873 } |
368
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
874 |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
875 if (session) |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
876 { |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
877 CHECK_FCT( fd_sess_state_retrieve( cs->sess_hdl, session, &req_sip ) ); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
878 } |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
879 free(req_sip); |
a1f26147ec61
Corrected bugs on app_sip and rgwx_sip
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
363
diff
changeset
|
880 |
361
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
881 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
882 return 0; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
883 } |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
884 |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
885 /* The exported symbol */ |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
886 struct rgw_api rgwp_descriptor = { |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
887 .rgwp_name = "sip", |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
888 .rgwp_conf_parse = sip_conf_parse, |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
889 .rgwp_conf_free = sip_conf_free, |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
890 .rgwp_rad_req = sip_rad_req, |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
891 .rgwp_diam_ans = sip_diam_ans |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
892 }; |
22e7110bf46d
Initial import of SIP plugin for gateway
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff
changeset
|
893 |