|
@@ -1,25 +1,23 @@
|
|
/*
|
|
/*
|
|
- * $Id$
|
|
|
|
- *
|
|
|
|
* Copyright (C) 2012 Smile Communications, [email protected]
|
|
* Copyright (C) 2012 Smile Communications, [email protected]
|
|
* Copyright (C) 2012 Smile Communications, [email protected]
|
|
* Copyright (C) 2012 Smile Communications, [email protected]
|
|
- *
|
|
|
|
|
|
+ *
|
|
* The initial version of this code was written by Dragos Vingarzan
|
|
* The initial version of this code was written by Dragos Vingarzan
|
|
* (dragos(dot)vingarzan(at)fokus(dot)fraunhofer(dot)de and the
|
|
* (dragos(dot)vingarzan(at)fokus(dot)fraunhofer(dot)de and the
|
|
* Fruanhofer Institute. It was and still is maintained in a separate
|
|
* Fruanhofer Institute. It was and still is maintained in a separate
|
|
* branch of the original SER. We are therefore migrating it to
|
|
* branch of the original SER. We are therefore migrating it to
|
|
* Kamailio/SR and look forward to maintaining it from here on out.
|
|
* Kamailio/SR and look forward to maintaining it from here on out.
|
|
* 2011/2012 Smile Communications, Pty. Ltd.
|
|
* 2011/2012 Smile Communications, Pty. Ltd.
|
|
- * ported/maintained/improved by
|
|
|
|
|
|
+ * ported/maintained/improved by
|
|
* Jason Penton (jason(dot)penton(at)smilecoms.com and
|
|
* Jason Penton (jason(dot)penton(at)smilecoms.com and
|
|
- * Richard Good (richard(dot)good(at)smilecoms.com) as part of an
|
|
|
|
|
|
+ * Richard Good (richard(dot)good(at)smilecoms.com) as part of an
|
|
* effort to add full IMS support to Kamailio/SR using a new and
|
|
* effort to add full IMS support to Kamailio/SR using a new and
|
|
* improved architecture
|
|
* improved architecture
|
|
- *
|
|
|
|
|
|
+ *
|
|
* NB: Alot of this code was originally part of OpenIMSCore,
|
|
* NB: Alot of this code was originally part of OpenIMSCore,
|
|
- * FhG Fokus.
|
|
|
|
|
|
+ * FhG Fokus.
|
|
* Copyright (C) 2004-2006 FhG Fokus
|
|
* Copyright (C) 2004-2006 FhG Fokus
|
|
- * Thanks for great work! This is an effort to
|
|
|
|
|
|
+ * Thanks for great work! This is an effort to
|
|
* break apart the various CSCF functions into logically separate
|
|
* break apart the various CSCF functions into logically separate
|
|
* components. We hope this will drive wider use. We also feel
|
|
* components. We hope this will drive wider use. We also feel
|
|
* that in this way the architecture is more complete and thereby easier
|
|
* that in this way the architecture is more complete and thereby easier
|
|
@@ -37,13 +35,13 @@
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
* GNU General Public License for more details.
|
|
*
|
|
*
|
|
- * You should have received a copy of the GNU General Public License
|
|
|
|
- * along with this program; if not, write to the Free Software
|
|
|
|
|
|
+ * You should have received a copy of the GNU General Public License
|
|
|
|
+ * along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
- *
|
|
|
|
|
|
+ *
|
|
*/
|
|
*/
|
|
|
|
|
|
-#include <sys/socket.h>
|
|
|
|
|
|
+#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
#include <netinet/in.h>
|
|
#include <unistd.h>
|
|
#include <unistd.h>
|
|
|
|
|
|
@@ -86,10 +84,10 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
int result_code;
|
|
int result_code;
|
|
peer_event_t next_event;
|
|
peer_event_t next_event;
|
|
int msg_received=0;
|
|
int msg_received=0;
|
|
-
|
|
|
|
|
|
+
|
|
if (!peer_locked) lock_get(p->lock);
|
|
if (!peer_locked) lock_get(p->lock);
|
|
LM_DBG("sm_process(): Peer %.*s \tState %s \tEvent %s\n",
|
|
LM_DBG("sm_process(): Peer %.*s \tState %s \tEvent %s\n",
|
|
- p->fqdn.len,p->fqdn.s,dp_states[p->state],dp_events[event-101]);
|
|
|
|
|
|
+ p->fqdn.len,p->fqdn.s,dp_states[p->state],dp_events[event-101]);
|
|
|
|
|
|
switch (p->state){
|
|
switch (p->state){
|
|
case Closed:
|
|
case Closed:
|
|
@@ -100,9 +98,10 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
if (next_event==I_Rcv_Conn_NAck)
|
|
if (next_event==I_Rcv_Conn_NAck)
|
|
sm_process(p,next_event,0,1,p->I_sock);
|
|
sm_process(p,next_event,0,1,p->I_sock);
|
|
else{
|
|
else{
|
|
- /* wait for fd to be transmitted to the respective receiver, in order to get a send pipe opened */
|
|
|
|
|
|
+ /* wait for fd to be transmitted to the respective receiver,
|
|
|
|
+ * in order to get a send pipe opened */
|
|
}
|
|
}
|
|
- break;
|
|
|
|
|
|
+ break;
|
|
case R_Conn_CER:
|
|
case R_Conn_CER:
|
|
R_Accept(p,sock);
|
|
R_Accept(p,sock);
|
|
result_code = Process_CER(p,msg);
|
|
result_code = Process_CER(p,msg);
|
|
@@ -122,16 +121,16 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
- dp_states[p->state],dp_events[event-101]);
|
|
|
|
|
|
+ dp_states[p->state],dp_events[event-101]);
|
|
goto error;
|
|
goto error;
|
|
}
|
|
}
|
|
- break;
|
|
|
|
|
|
+ break;
|
|
case Wait_Conn_Ack:
|
|
case Wait_Conn_Ack:
|
|
switch(event){
|
|
switch(event){
|
|
case I_Rcv_Conn_Ack:
|
|
case I_Rcv_Conn_Ack:
|
|
I_Snd_CER(p);
|
|
I_Snd_CER(p);
|
|
p->state = Wait_I_CEA;
|
|
p->state = Wait_I_CEA;
|
|
- break;
|
|
|
|
|
|
+ break;
|
|
case I_Rcv_Conn_NAck:
|
|
case I_Rcv_Conn_NAck:
|
|
Cleanup(p,p->I_sock);
|
|
Cleanup(p,p->I_sock);
|
|
p->state = Closed;
|
|
p->state = Closed;
|
|
@@ -156,17 +155,17 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
p->state = Closed;
|
|
p->state = Closed;
|
|
default:
|
|
default:
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
- dp_states[p->state],dp_events[event-101]);
|
|
|
|
|
|
+ dp_states[p->state],dp_events[event-101]);
|
|
goto error;
|
|
goto error;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case Wait_I_CEA:
|
|
case Wait_I_CEA:
|
|
switch(event){
|
|
switch(event){
|
|
case I_Rcv_CEA:
|
|
case I_Rcv_CEA:
|
|
result_code = Process_CEA(p,msg);
|
|
result_code = Process_CEA(p,msg);
|
|
if (result_code>=2000 && result_code<3000)
|
|
if (result_code>=2000 && result_code<3000)
|
|
- p->state = I_Open;
|
|
|
|
|
|
+ p->state = I_Open;
|
|
else {
|
|
else {
|
|
Cleanup(p,p->I_sock);
|
|
Cleanup(p,p->I_sock);
|
|
p->state = Closed;
|
|
p->state = Closed;
|
|
@@ -196,7 +195,7 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
I_Disc(p);
|
|
I_Disc(p);
|
|
p->state=Closed;
|
|
p->state=Closed;
|
|
break;
|
|
break;
|
|
- }
|
|
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
case I_Peer_Disc:
|
|
case I_Peer_Disc:
|
|
I_Disc(p);
|
|
I_Disc(p);
|
|
@@ -212,11 +211,11 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
- dp_states[p->state],dp_events[event-101]);
|
|
|
|
|
|
+ dp_states[p->state],dp_events[event-101]);
|
|
goto error;
|
|
goto error;
|
|
}
|
|
}
|
|
- break;
|
|
|
|
-
|
|
|
|
|
|
+ break;
|
|
|
|
+
|
|
case Wait_Conn_Ack_Elect:
|
|
case Wait_Conn_Ack_Elect:
|
|
switch(event){
|
|
switch(event){
|
|
case I_Rcv_Conn_Ack:
|
|
case I_Rcv_Conn_Ack:
|
|
@@ -249,7 +248,7 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
else {
|
|
else {
|
|
R_Disc(p);
|
|
R_Disc(p);
|
|
p->state = Closed;
|
|
p->state = Closed;
|
|
- // p->state = R_Open; /* Or maybe I should disconnect it?*/
|
|
|
|
|
|
+ // p->state = R_Open; /* Or maybe I should disconnect it?*/
|
|
}
|
|
}
|
|
}else{
|
|
}else{
|
|
LM_ERR("sm_process():Wait_Conn_Ack_Elect, I_Rcv_Conn_NAck No R-CER ! \n");
|
|
LM_ERR("sm_process():Wait_Conn_Ack_Elect, I_Rcv_Conn_NAck No R-CER ! \n");
|
|
@@ -271,11 +270,11 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
- dp_states[p->state],dp_events[event-101]);
|
|
|
|
|
|
+ dp_states[p->state],dp_events[event-101]);
|
|
goto error;
|
|
goto error;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case Wait_Returns:
|
|
case Wait_Returns:
|
|
switch(event){
|
|
switch(event){
|
|
case Win_Election:
|
|
case Win_Election:
|
|
@@ -304,7 +303,7 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
p->state = Closed;
|
|
p->state = Closed;
|
|
}
|
|
}
|
|
}else {
|
|
}else {
|
|
- LM_ERR("sm_process():Wait_Returns, I_Peer_Disc No R-CER ! \n");
|
|
|
|
|
|
+ LM_ERR("sm_process():Wait_Returns, I_Peer_Disc No R-CER ! \n");
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
case I_Rcv_CEA:
|
|
case I_Rcv_CEA:
|
|
@@ -313,7 +312,7 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
R_Disc(p);
|
|
R_Disc(p);
|
|
result_code = Process_CEA(p,msg);
|
|
result_code = Process_CEA(p,msg);
|
|
if (result_code>=2000 && result_code<3000)
|
|
if (result_code>=2000 && result_code<3000)
|
|
- p->state = I_Open;
|
|
|
|
|
|
+ p->state = I_Open;
|
|
else {
|
|
else {
|
|
Cleanup(p,p->I_sock);
|
|
Cleanup(p,p->I_sock);
|
|
p->state = Closed;
|
|
p->state = Closed;
|
|
@@ -334,7 +333,7 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
p->state = Closed;
|
|
p->state = Closed;
|
|
default:
|
|
default:
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
- dp_states[p->state],dp_events[event-101]);
|
|
|
|
|
|
+ dp_states[p->state],dp_events[event-101]);
|
|
goto error;
|
|
goto error;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
@@ -401,10 +400,10 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
- dp_states[p->state],dp_events[event-101]);
|
|
|
|
|
|
+ dp_states[p->state],dp_events[event-101]);
|
|
goto error;
|
|
goto error;
|
|
}
|
|
}
|
|
- break;
|
|
|
|
|
|
+ break;
|
|
case I_Open:
|
|
case I_Open:
|
|
switch (event){
|
|
switch (event){
|
|
case Send_Message:
|
|
case Send_Message:
|
|
@@ -419,7 +418,7 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
break;
|
|
break;
|
|
case I_Rcv_DWR:
|
|
case I_Rcv_DWR:
|
|
result_code = Process_DWR(p,msg);
|
|
result_code = Process_DWR(p,msg);
|
|
- Snd_DWA(p,msg,result_code,p->I_sock);
|
|
|
|
|
|
+ Snd_DWA(p,msg,result_code,p->I_sock);
|
|
p->state =I_Open;
|
|
p->state =I_Open;
|
|
break;
|
|
break;
|
|
case I_Rcv_DWA:
|
|
case I_Rcv_DWA:
|
|
@@ -467,10 +466,10 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
- dp_states[p->state],dp_events[event-101]);
|
|
|
|
|
|
+ dp_states[p->state],dp_events[event-101]);
|
|
goto error;
|
|
goto error;
|
|
}
|
|
}
|
|
- break;
|
|
|
|
|
|
+ break;
|
|
case Closing:
|
|
case Closing:
|
|
switch(event){
|
|
switch(event){
|
|
case I_Rcv_DPA:
|
|
case I_Rcv_DPA:
|
|
@@ -496,20 +495,20 @@ int sm_process(peer *p,peer_event_t event,AAAMessage *msg,int peer_locked,int so
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
LM_ERR("sm_process(): In state %s invalid event %s\n",
|
|
- dp_states[p->state],dp_events[event-101]);
|
|
|
|
|
|
+ dp_states[p->state],dp_events[event-101]);
|
|
goto error;
|
|
goto error;
|
|
}
|
|
}
|
|
- break;
|
|
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
if (!peer_locked) lock_release(p->lock);
|
|
if (!peer_locked) lock_release(p->lock);
|
|
-
|
|
|
|
|
|
+
|
|
if (msg_received)
|
|
if (msg_received)
|
|
Rcv_Process(p,msg);
|
|
Rcv_Process(p,msg);
|
|
-
|
|
|
|
- return 1;
|
|
|
|
|
|
+
|
|
|
|
+ return 1;
|
|
error:
|
|
error:
|
|
if (!peer_locked) lock_release(p->lock);
|
|
if (!peer_locked) lock_release(p->lock);
|
|
- return 0;
|
|
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -523,7 +522,7 @@ error:
|
|
peer_state_t I_Snd_Conn_Req(peer *p)
|
|
peer_state_t I_Snd_Conn_Req(peer *p)
|
|
{
|
|
{
|
|
LM_INFO("I_Snd_Conn_Req(): Peer %.*s \n",
|
|
LM_INFO("I_Snd_Conn_Req(): Peer %.*s \n",
|
|
- p->fqdn.len,p->fqdn.s);
|
|
|
|
|
|
+ p->fqdn.len,p->fqdn.s);
|
|
|
|
|
|
if (p->I_sock>0) close(p->I_sock);
|
|
if (p->I_sock>0) close(p->I_sock);
|
|
p->I_sock = -1;
|
|
p->I_sock = -1;
|
|
@@ -531,7 +530,7 @@ peer_state_t I_Snd_Conn_Req(peer *p)
|
|
if (p->I_sock<0){
|
|
if (p->I_sock<0){
|
|
return I_Rcv_Conn_NAck;
|
|
return I_Rcv_Conn_NAck;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
return I_Rcv_Conn_Ack;
|
|
return I_Rcv_Conn_Ack;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -575,37 +574,37 @@ static inline void Snd_CE_add_applications(AAAMessage *msg,peer *p)
|
|
AAA_AVP_LIST list;
|
|
AAA_AVP_LIST list;
|
|
str group;
|
|
str group;
|
|
list.head=0;list.tail=0;
|
|
list.head=0;list.tail=0;
|
|
-
|
|
|
|
|
|
+
|
|
for(i=0;i<config->applications_cnt;i++){
|
|
for(i=0;i<config->applications_cnt;i++){
|
|
app = config->applications+i;
|
|
app = config->applications+i;
|
|
if (app->vendor==0){
|
|
if (app->vendor==0){
|
|
set_4bytes(x,app->id);
|
|
set_4bytes(x,app->id);
|
|
AAACreateAndAddAVPToMessage(msg,
|
|
AAACreateAndAddAVPToMessage(msg,
|
|
- (app->type==DP_AUTHORIZATION?AVP_Auth_Application_Id:AVP_Acct_Application_Id),
|
|
|
|
- AAA_AVP_FLAG_MANDATORY,0,x,4);
|
|
|
|
|
|
+ (app->type==DP_AUTHORIZATION?AVP_Auth_Application_Id:AVP_Acct_Application_Id),
|
|
|
|
+ AAA_AVP_FLAG_MANDATORY,0,x,4);
|
|
}else{
|
|
}else{
|
|
set_4bytes(x,app->vendor);
|
|
set_4bytes(x,app->vendor);
|
|
- avp1 = AAACreateAVP(AVP_Vendor_Id,AAA_AVP_FLAG_MANDATORY,0,x,4, AVP_DUPLICATE_DATA);
|
|
|
|
|
|
+ avp1 = AAACreateAVP(AVP_Vendor_Id,AAA_AVP_FLAG_MANDATORY,0,x,4, AVP_DUPLICATE_DATA);
|
|
AAAAddAVPToList(&list,avp1);
|
|
AAAAddAVPToList(&list,avp1);
|
|
-
|
|
|
|
|
|
+
|
|
set_4bytes(x,app->id);
|
|
set_4bytes(x,app->id);
|
|
avp2 = AAACreateAVP((app->type==DP_AUTHORIZATION?AVP_Auth_Application_Id:AVP_Acct_Application_Id),
|
|
avp2 = AAACreateAVP((app->type==DP_AUTHORIZATION?AVP_Auth_Application_Id:AVP_Acct_Application_Id),
|
|
- AAA_AVP_FLAG_MANDATORY,0,x,4,AVP_DUPLICATE_DATA);
|
|
|
|
|
|
+ AAA_AVP_FLAG_MANDATORY,0,x,4,AVP_DUPLICATE_DATA);
|
|
AAAAddAVPToList(&list,avp2);
|
|
AAAAddAVPToList(&list,avp2);
|
|
-
|
|
|
|
- group = AAAGroupAVPS(list);
|
|
|
|
|
|
+
|
|
|
|
+ group = AAAGroupAVPS(list);
|
|
AAAFreeAVPList(&list);
|
|
AAAFreeAVPList(&list);
|
|
-
|
|
|
|
|
|
+
|
|
AAACreateAndAddAVPToMessage(msg,
|
|
AAACreateAndAddAVPToMessage(msg,
|
|
- AVP_Vendor_Specific_Application_Id,
|
|
|
|
- AAA_AVP_FLAG_MANDATORY,0,group.s,group.len);
|
|
|
|
|
|
+ AVP_Vendor_Specific_Application_Id,
|
|
|
|
+ AAA_AVP_FLAG_MANDATORY,0,group.s,group.len);
|
|
shm_free(group.s);
|
|
shm_free(group.s);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(i=0;i<config->supported_vendors_cnt;i++){
|
|
for(i=0;i<config->supported_vendors_cnt;i++){
|
|
set_4bytes(x,config->supported_vendors[i]);
|
|
set_4bytes(x,config->supported_vendors[i]);
|
|
- AAACreateAndAddAVPToMessage(msg,AVP_Supported_Vendor_Id,AAA_AVP_FLAG_MANDATORY,0,x,4);
|
|
|
|
- }
|
|
|
|
|
|
+ AAACreateAndAddAVPToMessage(msg,AVP_Supported_Vendor_Id,AAA_AVP_FLAG_MANDATORY,0,x,4);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -616,7 +615,7 @@ static inline void Snd_CE_add_applications(AAAMessage *msg,peer *p)
|
|
void I_Snd_CER(peer *p)
|
|
void I_Snd_CER(peer *p)
|
|
{
|
|
{
|
|
AAAMessage *cer=0;
|
|
AAAMessage *cer=0;
|
|
-// AAA_AVP *avp;
|
|
|
|
|
|
+ // AAA_AVP *avp;
|
|
unsigned long ip;
|
|
unsigned long ip;
|
|
union {
|
|
union {
|
|
struct sockaddr addr;
|
|
struct sockaddr addr;
|
|
@@ -625,13 +624,13 @@ void I_Snd_CER(peer *p)
|
|
} addr_u ;
|
|
} addr_u ;
|
|
socklen_t addrlen;
|
|
socklen_t addrlen;
|
|
char x[18];
|
|
char x[18];
|
|
-
|
|
|
|
|
|
+
|
|
cer = AAANewMessage(Code_CE,0,0,0);
|
|
cer = AAANewMessage(Code_CE,0,0,0);
|
|
if (!cer) return;
|
|
if (!cer) return;
|
|
cer->hopbyhopId = next_hopbyhop();
|
|
cer->hopbyhopId = next_hopbyhop();
|
|
cer->endtoendId = next_endtoend();
|
|
cer->endtoendId = next_endtoend();
|
|
addrlen = sizeof(addr_u);
|
|
addrlen = sizeof(addr_u);
|
|
- if (getsockname(p->I_sock,&(addr_u.addr), &addrlen) == -1) {
|
|
|
|
|
|
+ if (getsockname(p->I_sock,&(addr_u.addr), &addrlen) == -1) {
|
|
LM_ERR("I_Snd_CER(): Error on finding local host address > %s\n",strerror(errno));
|
|
LM_ERR("I_Snd_CER(): Error on finding local host address > %s\n",strerror(errno));
|
|
}else{
|
|
}else{
|
|
switch(addr_u.addr.sa_family){
|
|
switch(addr_u.addr.sa_family){
|
|
@@ -653,11 +652,11 @@ void I_Snd_CER(peer *p)
|
|
|
|
|
|
set_4bytes(x,config->vendor_id);
|
|
set_4bytes(x,config->vendor_id);
|
|
AAACreateAndAddAVPToMessage(cer,AVP_Vendor_Id,AAA_AVP_FLAG_MANDATORY,0,x,4);
|
|
AAACreateAndAddAVPToMessage(cer,AVP_Vendor_Id,AAA_AVP_FLAG_MANDATORY,0,x,4);
|
|
-
|
|
|
|
|
|
+
|
|
AAACreateAndAddAVPToMessage(cer,AVP_Product_Name,AAA_AVP_FLAG_MANDATORY,0,config->product_name.s,config->product_name.len);
|
|
AAACreateAndAddAVPToMessage(cer,AVP_Product_Name,AAA_AVP_FLAG_MANDATORY,0,config->product_name.s,config->product_name.len);
|
|
|
|
|
|
Snd_CE_add_applications(cer,p);
|
|
Snd_CE_add_applications(cer,p);
|
|
-// peer_send(p,p->I_sock,cer,1);
|
|
|
|
|
|
+ // peer_send(p,p->I_sock,cer,1);
|
|
peer_send_msg(p,cer);
|
|
peer_send_msg(p,cer);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -668,20 +667,20 @@ void add_peer_application(peer *p, int id, int vendor, app_type type)
|
|
if (!p->applications) return;
|
|
if (!p->applications) return;
|
|
for(i=0;i<p->applications_cnt;i++)
|
|
for(i=0;i<p->applications_cnt;i++)
|
|
if (p->applications[i].id == id &&
|
|
if (p->applications[i].id == id &&
|
|
- p->applications[i].vendor == vendor &&
|
|
|
|
- p->applications[i].type == type) return;
|
|
|
|
|
|
+ p->applications[i].vendor == vendor &&
|
|
|
|
+ p->applications[i].type == type) return;
|
|
|
|
|
|
p->applications[p->applications_cnt].id = id;
|
|
p->applications[p->applications_cnt].id = id;
|
|
p->applications[p->applications_cnt].vendor = vendor;
|
|
p->applications[p->applications_cnt].vendor = vendor;
|
|
p->applications[p->applications_cnt].type = type;
|
|
p->applications[p->applications_cnt].type = type;
|
|
- p->applications_cnt++;
|
|
|
|
|
|
+ p->applications_cnt++;
|
|
}
|
|
}
|
|
|
|
|
|
int count_Supported_Vendor_Id_AVPS(AAAMessage *msg)
|
|
int count_Supported_Vendor_Id_AVPS(AAAMessage *msg)
|
|
{
|
|
{
|
|
AAA_AVP* avp_vendor;
|
|
AAA_AVP* avp_vendor;
|
|
int avp_vendor_cnt;
|
|
int avp_vendor_cnt;
|
|
-
|
|
|
|
|
|
+
|
|
avp_vendor = AAAFindMatchingAVP(msg,0,AVP_Supported_Vendor_Id,0,0);
|
|
avp_vendor = AAAFindMatchingAVP(msg,0,AVP_Supported_Vendor_Id,0,0);
|
|
avp_vendor_cnt = 0;
|
|
avp_vendor_cnt = 0;
|
|
while (avp_vendor) {
|
|
while (avp_vendor) {
|
|
@@ -707,9 +706,9 @@ void save_peer_applications(peer *p,AAAMessage *msg)
|
|
p->applications = 0;
|
|
p->applications = 0;
|
|
p->applications_cnt = 0;
|
|
p->applications_cnt = 0;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
supported_vendor_id_avp_cnt = count_Supported_Vendor_Id_AVPS(msg);
|
|
supported_vendor_id_avp_cnt = count_Supported_Vendor_Id_AVPS(msg);
|
|
-
|
|
|
|
|
|
+
|
|
for(avp=msg->avpList.head;avp;avp = avp->next)
|
|
for(avp=msg->avpList.head;avp;avp = avp->next)
|
|
|
|
|
|
switch (avp->code){
|
|
switch (avp->code){
|
|
@@ -719,38 +718,38 @@ void save_peer_applications(peer *p,AAAMessage *msg)
|
|
case AVP_Acct_Application_Id:
|
|
case AVP_Acct_Application_Id:
|
|
total_cnt += supported_vendor_id_avp_cnt;
|
|
total_cnt += supported_vendor_id_avp_cnt;
|
|
break;
|
|
break;
|
|
- case AVP_Vendor_Specific_Application_Id:
|
|
|
|
- total_cnt+=2;/* wasteful, but let's skip decoding */
|
|
|
|
- break;
|
|
|
|
|
|
+ case AVP_Vendor_Specific_Application_Id:
|
|
|
|
+ total_cnt+=2;/* wasteful, but let's skip decoding */
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
p->applications_cnt = 0;
|
|
p->applications_cnt = 0;
|
|
p->applications = shm_malloc(sizeof(app_config)*total_cnt);
|
|
p->applications = shm_malloc(sizeof(app_config)*total_cnt);
|
|
- if (!p->applications){
|
|
|
|
|
|
+ if (!p->applications){
|
|
LM_ERR("save_peer_applications(): Error allocating %ld bytes! No applications saved...\n",
|
|
LM_ERR("save_peer_applications(): Error allocating %ld bytes! No applications saved...\n",
|
|
- (long int)(sizeof(app_config)*total_cnt));
|
|
|
|
|
|
+ (long int)(sizeof(app_config)*total_cnt));
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
for(avp=msg->avpList.head;avp;avp = avp->next)
|
|
for(avp=msg->avpList.head;avp;avp = avp->next)
|
|
{
|
|
{
|
|
-
|
|
|
|
|
|
+
|
|
switch (avp->code){
|
|
switch (avp->code){
|
|
case AVP_Auth_Application_Id:
|
|
case AVP_Auth_Application_Id:
|
|
id = get_4bytes(avp->data.s);
|
|
id = get_4bytes(avp->data.s);
|
|
add_peer_application(p,id,0,DP_AUTHORIZATION);
|
|
add_peer_application(p,id,0,DP_AUTHORIZATION);
|
|
avp_vendor = AAAFindMatchingAVP(msg,0,AVP_Supported_Vendor_Id,0,0);
|
|
avp_vendor = AAAFindMatchingAVP(msg,0,AVP_Supported_Vendor_Id,0,0);
|
|
while (avp_vendor) {
|
|
while (avp_vendor) {
|
|
-
|
|
|
|
|
|
+
|
|
vendor = get_4bytes(avp_vendor->data.s);
|
|
vendor = get_4bytes(avp_vendor->data.s);
|
|
LM_DBG("Found Supported Vendor for Application %i: %i\n", DP_AUTHORIZATION, vendor);
|
|
LM_DBG("Found Supported Vendor for Application %i: %i\n", DP_AUTHORIZATION, vendor);
|
|
add_peer_application(p,id,vendor,DP_AUTHORIZATION);
|
|
add_peer_application(p,id,vendor,DP_AUTHORIZATION);
|
|
if (!avp_vendor->next)
|
|
if (!avp_vendor->next)
|
|
break;
|
|
break;
|
|
avp_vendor = AAAFindMatchingAVP(msg,avp_vendor->next,AVP_Supported_Vendor_Id,0,AAA_FORWARD_SEARCH);
|
|
avp_vendor = AAAFindMatchingAVP(msg,avp_vendor->next,AVP_Supported_Vendor_Id,0,AAA_FORWARD_SEARCH);
|
|
- }
|
|
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
case AVP_Acct_Application_Id:
|
|
case AVP_Acct_Application_Id:
|
|
- id = get_4bytes(avp->data.s);
|
|
|
|
- add_peer_application(p,id,0,DP_ACCOUNTING);
|
|
|
|
|
|
+ id = get_4bytes(avp->data.s);
|
|
|
|
+ add_peer_application(p,id,0,DP_ACCOUNTING);
|
|
avp_vendor = AAAFindMatchingAVP(msg,0,AVP_Supported_Vendor_Id,0,0);
|
|
avp_vendor = AAAFindMatchingAVP(msg,0,AVP_Supported_Vendor_Id,0,0);
|
|
while (avp_vendor) {
|
|
while (avp_vendor) {
|
|
vendor = get_4bytes(avp_vendor->data.s);
|
|
vendor = get_4bytes(avp_vendor->data.s);
|
|
@@ -759,28 +758,28 @@ void save_peer_applications(peer *p,AAAMessage *msg)
|
|
if (!avp_vendor->next)
|
|
if (!avp_vendor->next)
|
|
break;
|
|
break;
|
|
avp_vendor = AAAFindMatchingAVP(msg,avp_vendor->next,AVP_Supported_Vendor_Id,0,AAA_FORWARD_SEARCH);
|
|
avp_vendor = AAAFindMatchingAVP(msg,avp_vendor->next,AVP_Supported_Vendor_Id,0,AAA_FORWARD_SEARCH);
|
|
- }
|
|
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
case AVP_Vendor_Specific_Application_Id:
|
|
case AVP_Vendor_Specific_Application_Id:
|
|
group = AAAUngroupAVPS(avp->data);
|
|
group = AAAUngroupAVPS(avp->data);
|
|
- avp_vendor = AAAFindMatchingAVPList(group,group.head,AVP_Vendor_Id,0,0);
|
|
|
|
- avp2 = AAAFindMatchingAVPList(group,group.head,AVP_Auth_Application_Id,0,AAA_FORWARD_SEARCH);
|
|
|
|
|
|
+ avp_vendor = AAAFindMatchingAVPList(group,group.head,AVP_Vendor_Id,0,0);
|
|
|
|
+ avp2 = AAAFindMatchingAVPList(group,group.head,AVP_Auth_Application_Id,0,AAA_FORWARD_SEARCH);
|
|
if (avp_vendor&&avp2){
|
|
if (avp_vendor&&avp2){
|
|
vendor = get_4bytes(avp_vendor->data.s);
|
|
vendor = get_4bytes(avp_vendor->data.s);
|
|
id = get_4bytes(avp2->data.s);
|
|
id = get_4bytes(avp2->data.s);
|
|
- add_peer_application(p,id,vendor,DP_AUTHORIZATION);
|
|
|
|
|
|
+ add_peer_application(p,id,vendor,DP_AUTHORIZATION);
|
|
}
|
|
}
|
|
- avp2 = AAAFindMatchingAVPList(group,group.head,AVP_Acct_Application_Id,0,AAA_FORWARD_SEARCH);
|
|
|
|
|
|
+ avp2 = AAAFindMatchingAVPList(group,group.head,AVP_Acct_Application_Id,0,AAA_FORWARD_SEARCH);
|
|
if (avp_vendor&&avp2){
|
|
if (avp_vendor&&avp2){
|
|
vendor = get_4bytes(avp_vendor->data.s);
|
|
vendor = get_4bytes(avp_vendor->data.s);
|
|
id = get_4bytes(avp2->data.s);
|
|
id = get_4bytes(avp2->data.s);
|
|
- add_peer_application(p,id,vendor,DP_ACCOUNTING);
|
|
|
|
|
|
+ add_peer_application(p,id,vendor,DP_ACCOUNTING);
|
|
}
|
|
}
|
|
AAAFreeAVPList(&group);
|
|
AAAFreeAVPList(&group);
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -789,7 +788,7 @@ void save_peer_applications(peer *p,AAAMessage *msg)
|
|
* @param p - the peer that the CEA was received from
|
|
* @param p - the peer that the CEA was received from
|
|
* @param cea - the CEA message
|
|
* @param cea - the CEA message
|
|
* @returns the result-code from CEA or AAA_UNABLE_TO_COMPLY if no result-code found
|
|
* @returns the result-code from CEA or AAA_UNABLE_TO_COMPLY if no result-code found
|
|
- */
|
|
|
|
|
|
+ */
|
|
int Process_CEA(peer *p,AAAMessage *cea)
|
|
int Process_CEA(peer *p,AAAMessage *cea)
|
|
{
|
|
{
|
|
AAA_AVP *avp;
|
|
AAA_AVP *avp;
|
|
@@ -798,7 +797,7 @@ int Process_CEA(peer *p,AAAMessage *cea)
|
|
AAAFreeMessage(&cea);
|
|
AAAFreeMessage(&cea);
|
|
if (!avp) return AAA_UNABLE_TO_COMPLY;
|
|
if (!avp) return AAA_UNABLE_TO_COMPLY;
|
|
else return get_4bytes(avp->data.s);
|
|
else return get_4bytes(avp->data.s);
|
|
-}
|
|
|
|
|
|
+}
|
|
|
|
|
|
/**
|
|
/**
|
|
* Initiator - disconnect peer.
|
|
* Initiator - disconnect peer.
|
|
@@ -833,7 +832,7 @@ void R_Disc(peer *p)
|
|
* @param p - the peer that the DWR was received from
|
|
* @param p - the peer that the DWR was received from
|
|
* @param dwr - the DWR message
|
|
* @param dwr - the DWR message
|
|
* @returns AAA_SUCCESS
|
|
* @returns AAA_SUCCESS
|
|
- */
|
|
|
|
|
|
+ */
|
|
int Process_DWR(peer *p,AAAMessage *dwr)
|
|
int Process_DWR(peer *p,AAAMessage *dwr)
|
|
{
|
|
{
|
|
return AAA_SUCCESS;
|
|
return AAA_SUCCESS;
|
|
@@ -845,7 +844,7 @@ int Process_DWR(peer *p,AAAMessage *dwr)
|
|
* \note Must be called with a lock on the peer.
|
|
* \note Must be called with a lock on the peer.
|
|
* @param p - the peer that the DWR was received from
|
|
* @param p - the peer that the DWR was received from
|
|
* @param dwa - the DWA message
|
|
* @param dwa - the DWA message
|
|
- */
|
|
|
|
|
|
+ */
|
|
void Process_DWA(peer *p,AAAMessage *dwa)
|
|
void Process_DWA(peer *p,AAAMessage *dwa)
|
|
{
|
|
{
|
|
p->waitingDWA = 0;
|
|
p->waitingDWA = 0;
|
|
@@ -857,19 +856,19 @@ void Process_DWA(peer *p,AAAMessage *dwa)
|
|
* The flag for waiting a DWA is set.
|
|
* The flag for waiting a DWA is set.
|
|
* \note Must be called with a lock on the peer.
|
|
* \note Must be called with a lock on the peer.
|
|
* @param p - the peer that the DWR was received from
|
|
* @param p - the peer that the DWR was received from
|
|
- */
|
|
|
|
|
|
+ */
|
|
void Snd_DWR(peer *p)
|
|
void Snd_DWR(peer *p)
|
|
{
|
|
{
|
|
AAAMessage *dwr=0;
|
|
AAAMessage *dwr=0;
|
|
-
|
|
|
|
|
|
+
|
|
dwr = AAANewMessage(Code_DW,0,0,0);
|
|
dwr = AAANewMessage(Code_DW,0,0,0);
|
|
- if (!dwr) return;
|
|
|
|
|
|
+ if (!dwr) return;
|
|
dwr->hopbyhopId = next_hopbyhop();
|
|
dwr->hopbyhopId = next_hopbyhop();
|
|
dwr->endtoendId = next_endtoend();
|
|
dwr->endtoendId = next_endtoend();
|
|
if (p->state==I_Open)
|
|
if (p->state==I_Open)
|
|
- peer_send_msg(p,dwr);
|
|
|
|
|
|
+ peer_send_msg(p,dwr);
|
|
else
|
|
else
|
|
- peer_send_msg(p,dwr);
|
|
|
|
|
|
+ peer_send_msg(p,dwr);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -879,20 +878,20 @@ void Snd_DWR(peer *p)
|
|
* @param dwr - the DWR message
|
|
* @param dwr - the DWR message
|
|
* @param result_code - the Result-Code to attach to DWA
|
|
* @param result_code - the Result-Code to attach to DWA
|
|
* @param sock - socket to send on
|
|
* @param sock - socket to send on
|
|
- */
|
|
|
|
|
|
+ */
|
|
void Snd_DWA(peer *p,AAAMessage *dwr,int result_code,int sock)
|
|
void Snd_DWA(peer *p,AAAMessage *dwr,int result_code,int sock)
|
|
{
|
|
{
|
|
AAAMessage *dwa;
|
|
AAAMessage *dwa;
|
|
- char x[4];
|
|
|
|
|
|
+ char x[4];
|
|
|
|
|
|
dwa = AAANewMessage(Code_DW,0,0,dwr);
|
|
dwa = AAANewMessage(Code_DW,0,0,dwr);
|
|
- if (!dwa) goto done;
|
|
|
|
|
|
+ if (!dwa) goto done;
|
|
|
|
|
|
set_4bytes(x,result_code);
|
|
set_4bytes(x,result_code);
|
|
AAACreateAndAddAVPToMessage(dwa,AVP_Result_Code,AAA_AVP_FLAG_MANDATORY,0,x,4);
|
|
AAACreateAndAddAVPToMessage(dwa,AVP_Result_Code,AAA_AVP_FLAG_MANDATORY,0,x,4);
|
|
-
|
|
|
|
|
|
+
|
|
peer_send_msg(p,dwa);
|
|
peer_send_msg(p,dwa);
|
|
-done:
|
|
|
|
|
|
+done:
|
|
AAAFreeMessage(&dwr);
|
|
AAAFreeMessage(&dwr);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -905,8 +904,8 @@ void Snd_DPR(peer *p)
|
|
{
|
|
{
|
|
AAAMessage *dpr=0;
|
|
AAAMessage *dpr=0;
|
|
char x[4];
|
|
char x[4];
|
|
-
|
|
|
|
- dpr = AAANewMessage(Code_DP,0,0,0);
|
|
|
|
|
|
+
|
|
|
|
+ dpr = AAANewMessage(Code_DP,0,0,0);
|
|
if (!dpr) return;
|
|
if (!dpr) return;
|
|
dpr->hopbyhopId = next_hopbyhop();
|
|
dpr->hopbyhopId = next_hopbyhop();
|
|
dpr->endtoendId = next_endtoend();
|
|
dpr->endtoendId = next_endtoend();
|
|
@@ -915,9 +914,9 @@ void Snd_DPR(peer *p)
|
|
AAACreateAndAddAVPToMessage(dpr,AVP_Disconnect_Cause,AAA_AVP_FLAG_MANDATORY,0,x,4);
|
|
AAACreateAndAddAVPToMessage(dpr,AVP_Disconnect_Cause,AAA_AVP_FLAG_MANDATORY,0,x,4);
|
|
|
|
|
|
if (p->state==I_Open)
|
|
if (p->state==I_Open)
|
|
- peer_send_msg(p,dpr);
|
|
|
|
|
|
+ peer_send_msg(p,dpr);
|
|
else
|
|
else
|
|
- peer_send_msg(p,dpr);
|
|
|
|
|
|
+ peer_send_msg(p,dpr);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -932,7 +931,7 @@ void Snd_DPA(peer *p,AAAMessage *dpr,int result_code,int sock)
|
|
{
|
|
{
|
|
AAAMessage *dpa;
|
|
AAAMessage *dpa;
|
|
|
|
|
|
- dpa = AAANewMessage(Code_DP,0,0,dpr);
|
|
|
|
|
|
+ dpa = AAANewMessage(Code_DP,0,0,dpr);
|
|
if (dpa) peer_send_msg(p,dpa);
|
|
if (dpa) peer_send_msg(p,dpa);
|
|
AAAFreeMessage(&dpr);
|
|
AAAFreeMessage(&dpr);
|
|
}
|
|
}
|
|
@@ -978,53 +977,53 @@ int Process_CER(peer *p,AAAMessage *cer)
|
|
{
|
|
{
|
|
switch (avp->code){
|
|
switch (avp->code){
|
|
case AVP_Auth_Application_Id:
|
|
case AVP_Auth_Application_Id:
|
|
- id = get_4bytes(avp->data.s);
|
|
|
|
|
|
+ id = get_4bytes(avp->data.s);
|
|
for(i=0;i<config->applications_cnt;i++)
|
|
for(i=0;i<config->applications_cnt;i++)
|
|
if (id == config->applications[i].id &&
|
|
if (id == config->applications[i].id &&
|
|
- config->applications[i].vendor==0 &&
|
|
|
|
- config->applications[i].type==DP_AUTHORIZATION) common_app++;
|
|
|
|
|
|
+ config->applications[i].vendor==0 &&
|
|
|
|
+ config->applications[i].type==DP_AUTHORIZATION) common_app++;
|
|
break;
|
|
break;
|
|
case AVP_Acct_Application_Id:
|
|
case AVP_Acct_Application_Id:
|
|
- id = get_4bytes(avp->data.s);
|
|
|
|
|
|
+ id = get_4bytes(avp->data.s);
|
|
for(i=0;i<config->applications_cnt;i++)
|
|
for(i=0;i<config->applications_cnt;i++)
|
|
if (id == config->applications[i].id &&
|
|
if (id == config->applications[i].id &&
|
|
- config->applications[i].vendor==0 &&
|
|
|
|
- config->applications[i].type==DP_ACCOUNTING) common_app++;
|
|
|
|
|
|
+ config->applications[i].vendor==0 &&
|
|
|
|
+ config->applications[i].type==DP_ACCOUNTING) common_app++;
|
|
break;
|
|
break;
|
|
case AVP_Vendor_Specific_Application_Id:
|
|
case AVP_Vendor_Specific_Application_Id:
|
|
group = AAAUngroupAVPS(avp->data);
|
|
group = AAAUngroupAVPS(avp->data);
|
|
- avp_vendor = AAAFindMatchingAVPList(group,group.head,AVP_Vendor_Id,0,0);
|
|
|
|
- avp2 = AAAFindMatchingAVPList(group,group.head,AVP_Auth_Application_Id,0,0);
|
|
|
|
|
|
+ avp_vendor = AAAFindMatchingAVPList(group,group.head,AVP_Vendor_Id,0,0);
|
|
|
|
+ avp2 = AAAFindMatchingAVPList(group,group.head,AVP_Auth_Application_Id,0,0);
|
|
if (avp_vendor&&avp2){
|
|
if (avp_vendor&&avp2){
|
|
vendor = get_4bytes(avp_vendor->data.s);
|
|
vendor = get_4bytes(avp_vendor->data.s);
|
|
id = get_4bytes(avp2->data.s);
|
|
id = get_4bytes(avp2->data.s);
|
|
for(i=0;i<config->applications_cnt;i++)
|
|
for(i=0;i<config->applications_cnt;i++)
|
|
if (id == config->applications[i].id &&
|
|
if (id == config->applications[i].id &&
|
|
- config->applications[i].vendor==vendor &&
|
|
|
|
- config->applications[i].type==DP_AUTHORIZATION) common_app++;
|
|
|
|
-
|
|
|
|
|
|
+ config->applications[i].vendor==vendor &&
|
|
|
|
+ config->applications[i].type==DP_AUTHORIZATION) common_app++;
|
|
|
|
+
|
|
}
|
|
}
|
|
- avp2 = AAAFindMatchingAVPList(group,group.head,AVP_Acct_Application_Id,0,0);
|
|
|
|
|
|
+ avp2 = AAAFindMatchingAVPList(group,group.head,AVP_Acct_Application_Id,0,0);
|
|
if (avp_vendor&&avp2){
|
|
if (avp_vendor&&avp2){
|
|
vendor = get_4bytes(avp_vendor->data.s);
|
|
vendor = get_4bytes(avp_vendor->data.s);
|
|
id = get_4bytes(avp2->data.s);
|
|
id = get_4bytes(avp2->data.s);
|
|
for(i=0;i<config->applications_cnt;i++)
|
|
for(i=0;i<config->applications_cnt;i++)
|
|
if (id == config->applications[i].id &&
|
|
if (id == config->applications[i].id &&
|
|
- config->applications[i].vendor==vendor &&
|
|
|
|
- config->applications[i].type==DP_ACCOUNTING) common_app++;
|
|
|
|
-
|
|
|
|
|
|
+ config->applications[i].vendor==vendor &&
|
|
|
|
+ config->applications[i].type==DP_ACCOUNTING) common_app++;
|
|
|
|
+
|
|
}
|
|
}
|
|
AAAFreeAVPList(&group);
|
|
AAAFreeAVPList(&group);
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
if (common_app!=0){
|
|
if (common_app!=0){
|
|
save_peer_applications(p,cer);
|
|
save_peer_applications(p,cer);
|
|
return AAA_SUCCESS;
|
|
return AAA_SUCCESS;
|
|
- }else
|
|
|
|
- return AAA_NO_COMMON_APPLICATION;
|
|
|
|
|
|
+ }else
|
|
|
|
+ return AAA_NO_COMMON_APPLICATION;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -1047,12 +1046,12 @@ void Snd_CEA(peer *p,AAAMessage *cer,int result_code,int sock)
|
|
} addr_u ;
|
|
} addr_u ;
|
|
socklen_t addrlen;
|
|
socklen_t addrlen;
|
|
char x[18];
|
|
char x[18];
|
|
-
|
|
|
|
- cea = AAANewMessage(Code_CE,0,0,cer);
|
|
|
|
|
|
+
|
|
|
|
+ cea = AAANewMessage(Code_CE,0,0,cer);
|
|
if (!cea) goto done;
|
|
if (!cea) goto done;
|
|
-
|
|
|
|
|
|
+
|
|
addrlen = sizeof(addr_u);
|
|
addrlen = sizeof(addr_u);
|
|
- if (getsockname(sock, &(addr_u.addr), &addrlen) == -1) {
|
|
|
|
|
|
+ if (getsockname(sock, &(addr_u.addr), &addrlen) == -1) {
|
|
LM_ERR("Snd_CEA(): Error on finding local host address > %s\n",strerror(errno));
|
|
LM_ERR("Snd_CEA(): Error on finding local host address > %s\n",strerror(errno));
|
|
}else{
|
|
}else{
|
|
switch(addr_u.addr.sa_family){
|
|
switch(addr_u.addr.sa_family){
|
|
@@ -1074,7 +1073,7 @@ void Snd_CEA(peer *p,AAAMessage *cer,int result_code,int sock)
|
|
|
|
|
|
set_4bytes(x,config->vendor_id);
|
|
set_4bytes(x,config->vendor_id);
|
|
AAACreateAndAddAVPToMessage(cea,AVP_Vendor_Id,AAA_AVP_FLAG_MANDATORY,0,x,4);
|
|
AAACreateAndAddAVPToMessage(cea,AVP_Vendor_Id,AAA_AVP_FLAG_MANDATORY,0,x,4);
|
|
-
|
|
|
|
|
|
+
|
|
AAACreateAndAddAVPToMessage(cea,AVP_Product_Name,AAA_AVP_FLAG_MANDATORY,0,config->product_name.s,config->product_name.len);
|
|
AAACreateAndAddAVPToMessage(cea,AVP_Product_Name,AAA_AVP_FLAG_MANDATORY,0,config->product_name.s,config->product_name.len);
|
|
|
|
|
|
set_4bytes(x,result_code);
|
|
set_4bytes(x,result_code);
|
|
@@ -1083,7 +1082,7 @@ void Snd_CEA(peer *p,AAAMessage *cer,int result_code,int sock)
|
|
Snd_CE_add_applications(cea,p);
|
|
Snd_CE_add_applications(cea,p);
|
|
|
|
|
|
peer_send(p,sock,cea,1);
|
|
peer_send(p,sock,cea,1);
|
|
-done:
|
|
|
|
|
|
+done:
|
|
AAAFreeMessage(&cer);
|
|
AAAFreeMessage(&cer);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1097,7 +1096,7 @@ done:
|
|
* @param p - peer identification
|
|
* @param p - peer identification
|
|
* @param cer - the CER message
|
|
* @param cer - the CER message
|
|
* @returns 1 if winning, 0 if loosing
|
|
* @returns 1 if winning, 0 if loosing
|
|
- */
|
|
|
|
|
|
+ */
|
|
int Elect(peer *p,AAAMessage *cer)
|
|
int Elect(peer *p,AAAMessage *cer)
|
|
{
|
|
{
|
|
/* returns if we win the election */
|
|
/* returns if we win the election */
|
|
@@ -1110,7 +1109,7 @@ int Elect(peer *p,AAAMessage *cer)
|
|
// return lose
|
|
// return lose
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
local = config->fqdn;
|
|
local = config->fqdn;
|
|
|
|
|
|
avp = AAAFindMatchingAVP(cer,cer->avpList.head,AVP_Origin_Host,0,0);
|
|
avp = AAAFindMatchingAVP(cer,cer->avpList.head,AVP_Origin_Host,0,0);
|
|
@@ -1140,9 +1139,9 @@ void Snd_Message(peer *p, AAAMessage *msg)
|
|
int rcode;
|
|
int rcode;
|
|
int send_message_before_session_sm=0;
|
|
int send_message_before_session_sm=0;
|
|
LM_DBG("Snd_Message called to peer [%.*s] for %s with code %d \n",
|
|
LM_DBG("Snd_Message called to peer [%.*s] for %s with code %d \n",
|
|
- p->fqdn.len,p->fqdn.s,is_req(msg)?"request":"response",msg->commandCode);
|
|
|
|
|
|
+ p->fqdn.len,p->fqdn.s,is_req(msg)?"request":"response",msg->commandCode);
|
|
if (msg->sessionId) session = cdp_get_session(msg->sessionId->data);
|
|
if (msg->sessionId) session = cdp_get_session(msg->sessionId->data);
|
|
-
|
|
|
|
|
|
+
|
|
if (session){
|
|
if (session){
|
|
LM_DBG("There is a session of type %d\n",session->type);
|
|
LM_DBG("There is a session of type %d\n",session->type);
|
|
switch (session->type){
|
|
switch (session->type){
|
|
@@ -1182,7 +1181,7 @@ void Snd_Message(peer *p, AAAMessage *msg)
|
|
session = 0;
|
|
session = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
}else {
|
|
}else {
|
|
auth_client_statefull_sm_process(session,AUTH_EV_SEND_ANS,msg);
|
|
auth_client_statefull_sm_process(session,AUTH_EV_SEND_ANS,msg);
|
|
session = 0;
|
|
session = 0;
|
|
@@ -1216,14 +1215,14 @@ void Snd_Message(peer *p, AAAMessage *msg)
|
|
session = 0;
|
|
session = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- break;
|
|
|
|
|
|
+ break;
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
if (session) AAASessionsUnlock(session->hash);
|
|
if (session) AAASessionsUnlock(session->hash);
|
|
}
|
|
}
|
|
if (!send_message_before_session_sm) peer_send_msg(p,msg);
|
|
if (!send_message_before_session_sm) peer_send_msg(p,msg);
|
|
-
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -1233,7 +1232,7 @@ void Snd_Message(peer *p, AAAMessage *msg)
|
|
* \note Must be called with a lock on the peer.
|
|
* \note Must be called with a lock on the peer.
|
|
* @param p - peer received from
|
|
* @param p - peer received from
|
|
* @param msg - the message received
|
|
* @param msg - the message received
|
|
- */
|
|
|
|
|
|
+ */
|
|
void Rcv_Process(peer *p, AAAMessage *msg)
|
|
void Rcv_Process(peer *p, AAAMessage *msg)
|
|
{
|
|
{
|
|
AAASession *session=0;
|
|
AAASession *session=0;
|
|
@@ -1256,7 +1255,7 @@ void Rcv_Process(peer *p, AAAMessage *msg)
|
|
if (is_req(msg)){
|
|
if (is_req(msg)){
|
|
if (msg->commandCode==IMS_ASR)
|
|
if (msg->commandCode==IMS_ASR)
|
|
auth_client_statefull_sm_process(session,AUTH_EV_RECV_ASR,msg);
|
|
auth_client_statefull_sm_process(session,AUTH_EV_RECV_ASR,msg);
|
|
- else
|
|
|
|
|
|
+ else
|
|
auth_client_statefull_sm_process(session,AUTH_EV_RECV_REQ,msg);
|
|
auth_client_statefull_sm_process(session,AUTH_EV_RECV_REQ,msg);
|
|
session = 0;
|
|
session = 0;
|
|
}else {
|
|
}else {
|
|
@@ -1267,44 +1266,44 @@ void Rcv_Process(peer *p, AAAMessage *msg)
|
|
session = 0;
|
|
session = 0;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
- case AUTH_SERVER_STATEFULL:
|
|
|
|
- if (is_req(msg))
|
|
|
|
- {
|
|
|
|
- if (msg->commandCode==IMS_STR)
|
|
|
|
- {
|
|
|
|
- auth_server_statefull_sm_process(session,AUTH_EV_RECV_STR,msg);
|
|
|
|
- } else {
|
|
|
|
- auth_server_statefull_sm_process(session,AUTH_EV_RECV_REQ,msg);
|
|
|
|
- }
|
|
|
|
- session = 0;
|
|
|
|
- }else{
|
|
|
|
- if (msg->commandCode==IMS_ASA)
|
|
|
|
- auth_server_statefull_sm_process(session,AUTH_EV_RECV_ASA,msg);
|
|
|
|
- else
|
|
|
|
- auth_server_statefull_sm_process(session,AUTH_EV_RECV_ANS,msg);
|
|
|
|
- session = 0;
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
|
|
+ case AUTH_SERVER_STATEFULL:
|
|
|
|
+ if (is_req(msg))
|
|
|
|
+ {
|
|
|
|
+ if (msg->commandCode==IMS_STR)
|
|
|
|
+ {
|
|
|
|
+ auth_server_statefull_sm_process(session,AUTH_EV_RECV_STR,msg);
|
|
|
|
+ } else {
|
|
|
|
+ auth_server_statefull_sm_process(session,AUTH_EV_RECV_REQ,msg);
|
|
|
|
+ }
|
|
|
|
+ session = 0;
|
|
|
|
+ }else{
|
|
|
|
+ if (msg->commandCode==IMS_ASA)
|
|
|
|
+ auth_server_statefull_sm_process(session,AUTH_EV_RECV_ASA,msg);
|
|
|
|
+ else
|
|
|
|
+ auth_server_statefull_sm_process(session,AUTH_EV_RECV_ANS,msg);
|
|
|
|
+ session = 0;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
default:
|
|
default:
|
|
AAASessionsUnlock(session->hash);
|
|
AAASessionsUnlock(session->hash);
|
|
session =0;
|
|
session =0;
|
|
- break;
|
|
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
}else{
|
|
}else{
|
|
if (msg->sessionId){
|
|
if (msg->sessionId){
|
|
- if (msg->commandCode == IMS_ASR)
|
|
|
|
|
|
+ if (msg->commandCode == IMS_ASR)
|
|
auth_client_statefull_sm_process(0,AUTH_EV_RECV_ASR,msg);
|
|
auth_client_statefull_sm_process(0,AUTH_EV_RECV_ASR,msg);
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|
|
if (!nput && !put_task(p,msg)){
|
|
if (!nput && !put_task(p,msg)){
|
|
LM_ERR("Rcv_Process(): Queue refused task\n");
|
|
LM_ERR("Rcv_Process(): Queue refused task\n");
|
|
- if (msg) AAAFreeMessage(&msg);
|
|
|
|
|
|
+ if (msg) AAAFreeMessage(&msg);
|
|
}
|
|
}
|
|
//if (msg) LM_ERR("Rcv_Process(): task added to queue command %d, flags %#1x endtoend %u hopbyhop %u\n",msg->commandCode,msg->flags,msg->endtoendId,msg->hopbyhopId);
|
|
//if (msg) LM_ERR("Rcv_Process(): task added to queue command %d, flags %#1x endtoend %u hopbyhop %u\n",msg->commandCode,msg->flags,msg->endtoendId,msg->hopbyhopId);
|
|
-
|
|
|
|
-// AAAPrintMessage(msg);
|
|
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ // AAAPrintMessage(msg);
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|