e2_avp.c

Go to the documentation of this file.
00001 
00061 #include "e2_avp.h"
00062 #include "../../mem/shm_mem.h"
00063 #include <stdio.h>
00064 
00065 extern struct cdp_binds cdpb;            
00079 static inline int e2_add_avp(AAAMessage *m,char *d,int len,int avp_code,
00080     int flags,int vendorid,int data_do,const char *func)
00081 {
00082     AAA_AVP *avp;
00083     if (vendorid!=0) flags |= AAA_AVP_FLAG_VENDOR_SPECIFIC;
00084     avp = cdpb.AAACreateAVP(avp_code,flags,vendorid,d,len,data_do);
00085     if (!avp) {
00086         LOG(L_ERR,"ERR:"M_NAME":%s: Failed creating avp\n",func);
00087         return 0;
00088     }
00089     if (cdpb.AAAAddAVPToMessage(m,avp,m->avpList.tail)!=AAA_ERR_SUCCESS) {
00090         LOG(L_ERR,"ERR:"M_NAME":%s: Failed adding avp to message\n",func);
00091         cdpb.AAAFreeAVP(&avp);
00092         return 0;
00093     }
00094     return 1;
00095 }
00096 
00109 static inline int e2_add_avp_list(AAA_AVP_LIST *list,char *d,int len,int avp_code,
00110     int flags,int vendorid,int data_do,const char *func)
00111 {
00112     AAA_AVP *avp;
00113     if (vendorid!=0) flags |= AAA_AVP_FLAG_VENDOR_SPECIFIC;
00114     avp = cdpb.AAACreateAVP(avp_code,flags,vendorid,d,len,data_do);
00115     if (!avp) {
00116         LOG(L_ERR,"ERR:"M_NAME":%s: Failed creating avp\n",func);
00117         return 0;
00118     }
00119     if (list->tail) {
00120         avp->prev=list->tail;
00121         avp->next=0;    
00122         list->tail->next = avp;
00123         list->tail=avp;
00124     } else {
00125         list->head = avp;
00126         list->tail = avp;
00127         avp->next=0;
00128         avp->prev=0;
00129     }
00130     
00131     return 1;
00132 }
00133 
00142 static inline str e2_get_avp(AAAMessage *msg,int avp_code,int vendor_id,
00143                             const char *func)
00144 {
00145     AAA_AVP *avp;
00146     str r={0,0};
00147     
00148     avp = cdpb.AAAFindMatchingAVP(msg,0,avp_code,vendor_id,0);
00149     if (avp==0){
00150         LOG(L_INFO,"INFO:"M_NAME":%s: Failed finding avp\n",func);
00151         return r;
00152     }
00153     else 
00154         return avp->data;
00155 }
00156 
00157 
00158 
00159 
00166 inline int e2_add_user_name(AAAMessage *msg,str data)
00167 {
00168     return 
00169     e2_add_avp(msg,data.s,data.len,
00170         AVP_User_Name,
00171         AAA_AVP_FLAG_MANDATORY,
00172         0,
00173         AVP_DUPLICATE_DATA,
00174         __FUNCTION__);
00175 }
00176 
00183 inline int e2_add_public_identity(AAAMessage *msg,str data)
00184 {
00185     return 
00186     e2_add_avp(msg,data.s,data.len,
00187         AVP_IMS_Public_Identity,
00188         AAA_AVP_FLAG_MANDATORY|AAA_AVP_FLAG_VENDOR_SPECIFIC,
00189         IMS_vendor_id_3GPP,
00190         AVP_DUPLICATE_DATA,
00191         __FUNCTION__);
00192 }
00193 
00194 
00201 inline int e2_add_authorization_type(AAAMessage *msg,unsigned int data)
00202 {
00203     char x[4];
00204     set_4bytes(x,data);
00205     return 
00206     e2_add_avp(msg,x,4,
00207         AVP_IMS_User_Authorization_Type,
00208         AAA_AVP_FLAG_MANDATORY|AAA_AVP_FLAG_VENDOR_SPECIFIC,
00209         IMS_vendor_id_3GPP,
00210         AVP_DUPLICATE_DATA,
00211         __FUNCTION__);
00212 }
00213 
00214 
00221 inline int e2_add_server_name(AAAMessage *msg,str data)
00222 {
00223     return 
00224     e2_add_avp(msg,data.s,data.len,
00225         AVP_IMS_Server_Name,
00226         AAA_AVP_FLAG_MANDATORY|AAA_AVP_FLAG_VENDOR_SPECIFIC,
00227         IMS_vendor_id_3GPP,
00228         AVP_DUPLICATE_DATA,
00229         __FUNCTION__);
00230 }
00231 
00238 inline int e2_add_result_code(AAAMessage *msg,unsigned int data)
00239 {
00240     char x[4];
00241     set_4bytes(x,data);
00242     return 
00243     e2_add_avp(msg,x,4,
00244         AVP_Result_Code,
00245         AAA_AVP_FLAG_MANDATORY,
00246         0,
00247         AVP_DUPLICATE_DATA,
00248         __FUNCTION__);
00249 }
00250 
00257 inline int e2_add_experimental_result_code(AAAMessage *msg,unsigned int data)
00258 {
00259     AAA_AVP_LIST list;
00260     str group;
00261     char x[4];
00262     list.head=0;list.tail=0;
00263         
00264     set_4bytes(x,data);
00265     e2_add_avp_list(&list,
00266         x,4,
00267         AVP_IMS_Experimental_Result_Code,
00268         AAA_AVP_FLAG_MANDATORY,
00269         0,
00270         AVP_DUPLICATE_DATA,
00271         __FUNCTION__);
00272     
00273     set_4bytes(x,IMS_vendor_id_3GPP);
00274     e2_add_avp_list(&list,
00275         x,4,
00276         AVP_IMS_Vendor_Id,
00277         AAA_AVP_FLAG_MANDATORY,
00278         0,
00279         AVP_DUPLICATE_DATA,
00280         __FUNCTION__);
00281     
00282     
00283     group = cdpb.AAAGroupAVPS(list);
00284     
00285     cdpb.AAAFreeAVPList(&list);
00286     
00287     return 
00288     e2_add_avp(msg,group.s,group.len,
00289         AVP_IMS_Experimental_Result,
00290         AAA_AVP_FLAG_MANDATORY,
00291         0,
00292         AVP_FREE_DATA,
00293         __FUNCTION__);
00294 }
00295 
00304 inline int e2_add_vendor_specific_appid(AAAMessage *msg,unsigned int vendor_id,
00305     unsigned int auth_id,unsigned int acct_id)
00306 {
00307     AAA_AVP_LIST list;
00308     str group;
00309     char x[4];
00310 
00311     list.head=0;list.tail=0;
00312         
00313     set_4bytes(x,vendor_id);
00314     e2_add_avp_list(&list,
00315         x,4,
00316         AVP_Vendor_Id,
00317         AAA_AVP_FLAG_MANDATORY,
00318         0,
00319         AVP_DUPLICATE_DATA,
00320         __FUNCTION__);
00321 
00322     if (auth_id) {
00323         set_4bytes(x,auth_id);
00324         e2_add_avp_list(&list,
00325             x,4,
00326             AVP_Auth_Application_Id,
00327             AAA_AVP_FLAG_MANDATORY,
00328             0,
00329             AVP_DUPLICATE_DATA,
00330             __FUNCTION__);
00331     }
00332     if (acct_id) {
00333         set_4bytes(x,acct_id);
00334         e2_add_avp_list(&list,
00335             x,4,
00336             AVP_Acct_Application_Id,
00337             AAA_AVP_FLAG_MANDATORY,
00338             0,
00339             AVP_DUPLICATE_DATA,
00340             __FUNCTION__);
00341     }   
00342     
00343     group = cdpb.AAAGroupAVPS(list);
00344     
00345     cdpb.AAAFreeAVPList(&list);
00346     
00347     return 
00348     e2_add_avp(msg,group.s,group.len,
00349         AVP_Vendor_Specific_Application_Id,
00350         AAA_AVP_FLAG_MANDATORY,
00351         0,
00352         AVP_FREE_DATA,
00353         __FUNCTION__);
00354 }
00355 
00356 
00363 inline int e2_add_auth_session_state(AAAMessage *msg,unsigned int data)
00364 {
00365     char x[4];
00366     set_4bytes(x,data);
00367     return 
00368     e2_add_avp(msg,x,4,
00369         AVP_Auth_Session_State,
00370         AAA_AVP_FLAG_MANDATORY,
00371         0,
00372         AVP_DUPLICATE_DATA,
00373         __FUNCTION__);
00374 }
00375 
00382 inline int e2_add_destination_realm(AAAMessage *msg,str data)
00383 {
00384     return 
00385     e2_add_avp(msg,data.s,data.len,
00386         AVP_Destination_Realm,
00387         AAA_AVP_FLAG_MANDATORY,
00388         0,
00389         AVP_DUPLICATE_DATA,
00390         __FUNCTION__);
00391 }
00392 
00400 inline int e2_add_g_unique_address(AAAMessage *msg, str ip,str realm) 
00401 {
00402     AAA_AVP_LIST list;
00403     str group;
00404     char x[6];
00405     int i,j,k;
00406     list.head=0;list.tail=0;
00407     
00408     if (ip.len>0){      
00409         memset(x,0,4);
00410         x[1]=1;
00411         i=2;k=0;        
00412         for(j=0;j<ip.len;j++){
00413             if (ip.s[j]=='.') {x[i++]=k;k=0;}
00414             else if (ip.s[j]>='0' && ip.s[j]<='9')
00415                     k = k*10 + ip.s[j]-'0';
00416         }
00417         x[i]=k;     
00418         
00419         e2_add_avp_list(&list,
00420             x,6,
00421             AVP_Framed_IP_Address,
00422             0,
00423             0,
00424             AVP_DUPLICATE_DATA,
00425             __FUNCTION__);
00426     }
00427     
00428     if (realm.len)
00429     {
00430         e2_add_avp_list(&list,
00431             realm.s,realm.len,
00432             AVP_ETSI_Address_Realm,
00433             AAA_AVP_FLAG_MANDATORY|AAA_AVP_FLAG_VENDOR_SPECIFIC,
00434             IMS_vendor_id_ETSI,
00435             AVP_DUPLICATE_DATA,
00436             __FUNCTION__);
00437     }
00438     
00439     group = cdpb.AAAGroupAVPS(list);
00440     
00441     cdpb.AAAFreeAVPList(&list);
00442     
00443     return 
00444     e2_add_avp(msg,group.s,group.len,
00445         AVP_ETSI_Globally_Unique_Address,
00446         AAA_AVP_FLAG_MANDATORY|AAA_AVP_FLAG_VENDOR_SPECIFIC,
00447         IMS_vendor_id_ETSI,
00448         AVP_FREE_DATA,
00449         __FUNCTION__);
00450 }
00451 
00452 
00459 inline int e2_add_app_identifier(AAAMessage *msg, str data) 
00460 {
00461     return 
00462         e2_add_avp(msg,data.s,data.len,
00463             AVP_IMS_AF_Application_Identifier,
00464             AAA_AVP_FLAG_MANDATORY|AAA_AVP_FLAG_VENDOR_SPECIFIC,
00465             IMS_vendor_id_3GPP,
00466             AVP_DUPLICATE_DATA,
00467             __FUNCTION__);
00468 }
00469 
00470 
00476 inline str e2_get_session_id(AAAMessage *msg)
00477 {
00478     return e2_get_avp(msg,
00479         AVP_Session_Id,
00480         0,
00481         __FUNCTION__);
00482 }
00483 
00484 
00490 inline str e2_get_user_name(AAAMessage *msg)
00491 {
00492     return e2_get_avp(msg,
00493         AVP_User_Name,
00494         0,
00495         __FUNCTION__);
00496 }
00497 
00498 inline str e2_get_terminal_type(AAAMessage *msg)
00499 {
00500     return 
00501     e2_get_avp(msg,
00502         AVP_ETSI_Terminal_Type,
00503         IMS_vendor_id_ETSI,
00504         __FUNCTION__);
00505 }
00506 
00507 
00508 int e2_get_access_net(AAAMessage *msg, int *data)
00509 {
00510     AAA_AVP_LIST list;
00511     AAA_AVP *avp;
00512     str grp;
00513     grp = e2_get_avp(msg,
00514         AVP_ETSI_Access_Network_Type,
00515         IMS_vendor_id_ETSI,
00516         __FUNCTION__);
00517     
00518     if (!grp.s) return 0;
00519 
00520     list = cdpb.AAAUngroupAVPS(grp);
00521 
00522     avp = cdpb.AAAFindMatchingAVPList(list,0,AVP_NAS_Port_Type,0,0);
00523     if (!avp||!avp->data.s) {
00524         cdpb.AAAFreeAVPList(&list);
00525         return 0;
00526     }   
00527     *data = atoi(avp->data.s);
00528     return 1;
00529 }
00530 
00531 int e2_get_location_info(AAAMessage *msg, str *data)
00532 {
00533     AAA_AVP_LIST list;
00534     AAA_AVP *avp;
00535     str grp;
00536     data->len = 0;
00537     grp = e2_get_avp(msg,
00538          AVP_ETSI_Location_Information,
00539         IMS_vendor_id_ETSI,
00540         __FUNCTION__);
00541     
00542     if (!grp.s) return 0;
00543 
00544     list = cdpb.AAAUngroupAVPS(grp);
00545 
00546     avp = cdpb.AAAFindMatchingAVPList(list,0,AVP_Line_Identifier,IMS_vendor_id_ETSI,0);
00547     if (!avp||!avp->data.s) {
00548         cdpb.AAAFreeAVPList(&list);
00549         return 0;
00550     }
00551     
00552     *data = avp->data;
00553     return 1;
00554 }

Generated on Thu Oct 23 04:14:38 2008 for Open IMS Core CSCFs by  doxygen 1.5.2