259 lines
8.5 KiB
C
259 lines
8.5 KiB
C
/*********************************************************************************************************
|
|
* Software License Agreement (BSD License) *
|
|
* Author: Francois Bard <francois@tera.ics.keio.ac.jp> *
|
|
* *
|
|
* Copyright (c) 2010, Teraoka Laboratory, Keio University *
|
|
* All rights reserved. *
|
|
* *
|
|
* Redistribution and use of this software in source and binary forms, with or without modification, are *
|
|
* permitted provided that the following conditions are met: *
|
|
* *
|
|
* * Redistributions of source code must retain the above *
|
|
* copyright notice, this list of conditions and the *
|
|
* following disclaimer. *
|
|
* *
|
|
* * Redistributions in binary form must reproduce the above *
|
|
* copyright notice, this list of conditions and the *
|
|
* following disclaimer in the documentation and/or other *
|
|
* materials provided with the distribution. *
|
|
* *
|
|
* * Neither the name of the Teraoka Laboratory nor the *
|
|
* names of its contributors may be used to endorse or *
|
|
* promote products derived from this software without *
|
|
* specific prior written permission of Teraoka Laboratory *
|
|
* *
|
|
* *
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
|
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
|
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT *
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
|
|
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF *
|
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
|
|
*********************************************************************************************************/
|
|
|
|
/*
|
|
|
|
The following table lists the AVPs needed for the NAS to HAAA server interaction.
|
|
We try to keep the structure of the grouped AVP by declaring the contained AVPs just before the grouped AVP they depend on.
|
|
The number of '+' indicates the depth of the contained AVP.
|
|
|
|
DEPTH NAME AVP CODE RFC TYPE IMPLEMENTED NOTES
|
|
|
|
MIP6-Feature-Vector 124 5447 Unsigned64 yes
|
|
+ MIP-Home-Agent-Address 334 4004 Address not yet
|
|
++ Destination-Host 293 3588 DiameterIdentity no (Base)
|
|
++ Destination-Realm 283 3588 DiameterIdentity no (Base)
|
|
+ MIP-Home-Agent-Host 348 4004 Grouped not yet
|
|
+ MIP6-Home-Link-Prefix 125 5447 OctetString yes
|
|
MIP6-Agent-Info 486 5447 Grouped yes
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <freeDiameter/extension.h>
|
|
|
|
/* The content of this file follows the same structure as dict_base_proto.c */
|
|
|
|
#define CHECK_dict_new( _type, _data, _parent, _ref ) \
|
|
CHECK_FCT( fd_dict_new( fd_g_config->cnf_dict, (_type), (_data), (_parent), (_ref)) );
|
|
|
|
#define CHECK_dict_search( _type, _criteria, _what, _result ) \
|
|
CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, (_type), (_criteria), (_what), (_result), ENOENT) );
|
|
|
|
struct local_rules_definition {
|
|
char *avp_name;
|
|
enum rule_position position;
|
|
int min;
|
|
int max;
|
|
};
|
|
|
|
#define RULE_ORDER( _position ) ((((_position) == RULE_FIXED_HEAD) || ((_position) == RULE_FIXED_TAIL)) ? 1 : 0 )
|
|
|
|
#define PARSE_loc_rules( _rulearray, _parent) { \
|
|
int __ar; \
|
|
for (__ar=0; __ar < sizeof(_rulearray) / sizeof((_rulearray)[0]); __ar++) { \
|
|
struct dict_rule_data __data = { NULL, \
|
|
(_rulearray)[__ar].position, \
|
|
0, \
|
|
(_rulearray)[__ar].min, \
|
|
(_rulearray)[__ar].max}; \
|
|
__data.rule_order = RULE_ORDER(__data.rule_position); \
|
|
CHECK_FCT( fd_dict_search( \
|
|
fd_g_config->cnf_dict, \
|
|
DICT_AVP, \
|
|
AVP_BY_NAME, \
|
|
(_rulearray)[__ar].avp_name, \
|
|
&__data.rule_avp, 0 ) ); \
|
|
if ( !__data.rule_avp ) { \
|
|
TRACE_DEBUG(INFO, "AVP Not found: '%s'", (_rulearray)[__ar].avp_name ); \
|
|
return ENOENT; \
|
|
} \
|
|
CHECK_FCT_DO( fd_dict_new( fd_g_config->cnf_dict, DICT_RULE, &__data, _parent, NULL), \
|
|
{ \
|
|
TRACE_DEBUG(INFO, "Error on rule with AVP '%s'", \
|
|
(_rulearray)[__ar].avp_name ); \
|
|
return EINVAL; \
|
|
} ); \
|
|
} \
|
|
}
|
|
|
|
#define enumval_def_u32( _val_, _str_ ) \
|
|
{ _str_, { .u32 = _val_ }}
|
|
|
|
#define enumval_def_os( _len_, _val_, _str_ ) \
|
|
{ _str_, { .os = { .data = (unsigned char *)_val_, .len = _len_ }}}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Defines if there are any */
|
|
|
|
/* Define Flags for MIP6-Feature-Vector*/
|
|
|
|
#define MIP6_INTEGRATED 0x0000000000000001
|
|
#define LOCAL_HOME_AGENT_ASSIGNMENT 0x0000000000000002
|
|
|
|
/* Dictionary */
|
|
|
|
int dict_nas_mipv6_init(char * conffile)
|
|
{
|
|
struct dict_object * nas_mipv6;
|
|
{
|
|
struct dict_application_data data = { 5447, "MIPv6 NAS-to-HAAA Interaction" };
|
|
CHECK_dict_new( DICT_APPLICATION, &data , NULL, &nas_mipv6);
|
|
}
|
|
|
|
/* AVP section */
|
|
{
|
|
/* Loading the derived data formats */
|
|
|
|
struct dict_object * Address_type;
|
|
CHECK_dict_search( DICT_TYPE, TYPE_BY_NAME, "Address", &Address_type);
|
|
|
|
/* MIP6-Feature-Vector */
|
|
{
|
|
/*
|
|
|
|
*/
|
|
|
|
struct dict_avp_data data = {
|
|
124, /* Code */
|
|
0, /* Vendor */
|
|
"MIP6-Feature-Vector", /* Name */
|
|
AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */
|
|
AVP_FLAG_MANDATORY, /* Fixed flag values */
|
|
AVP_TYPE_UNSIGNED64 /* base type of data */
|
|
};
|
|
|
|
CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
|
|
}
|
|
|
|
/* MIP-Home-Agent-Address - RFC 4004 */
|
|
{
|
|
/*
|
|
|
|
*/
|
|
|
|
struct dict_avp_data data = {
|
|
334, /* Code */
|
|
0, /* Vendor */
|
|
"MIP-Home-Agent-Address", /* Name */
|
|
AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */
|
|
AVP_FLAG_MANDATORY, /* Fixed flag values */
|
|
AVP_TYPE_OCTETSTRING /* base type of data */
|
|
};
|
|
|
|
CHECK_dict_new( DICT_AVP, &data , Address_type, NULL);
|
|
}
|
|
|
|
/* Destination-Host - Base Protocol */
|
|
|
|
/* Destination-Realm - Base Protocol */
|
|
|
|
/* MIP-Home-Agent-Host - RFC 4004 */
|
|
{
|
|
/*
|
|
The MIP-Home-Agent-Host AVP (AVP Code 348) is of type Grouped and
|
|
contains the identity of the assigned Home Agent. If the MIP-Home-
|
|
Agent-Host AVP is present in the AMR, the AAAH MUST copy it into the
|
|
HAR.
|
|
|
|
MIP-Home-Agent-Host ::= < AVP Header: 348 >
|
|
{ Destination-Realm }
|
|
{ Destination-Host }
|
|
* [ AVP ]
|
|
*/
|
|
|
|
struct dict_object * avp;
|
|
struct dict_avp_data data = {
|
|
348, /* Code */
|
|
0, /* Vendor */
|
|
"MIP-Home-Agent-Host", /* Name */
|
|
AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */
|
|
AVP_FLAG_MANDATORY, /* Fixed flag values */
|
|
AVP_TYPE_GROUPED /* base type of data */
|
|
};
|
|
|
|
struct local_rules_definition rules[] =
|
|
{ { "Destination-Realm", RULE_REQUIRED, -1, 1 }
|
|
,{ "Destination-Host", RULE_REQUIRED, -1, 1 }
|
|
};
|
|
|
|
CHECK_dict_new( DICT_AVP, &data , NULL, &avp);
|
|
PARSE_loc_rules( rules, avp );
|
|
}
|
|
|
|
/* MIP6-Home-Link-Prefix */
|
|
{
|
|
/*
|
|
|
|
*/
|
|
|
|
struct dict_avp_data data = {
|
|
125, /* Code */
|
|
0, /* Vendor */
|
|
"MIP6-Home-Link-Prefix", /* Name */
|
|
AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */
|
|
AVP_FLAG_MANDATORY, /* Fixed flag values */
|
|
AVP_TYPE_OCTETSTRING /* base type of data */
|
|
};
|
|
|
|
CHECK_dict_new( DICT_AVP, &data , NULL, NULL);
|
|
}
|
|
|
|
/* MIP6-Agent-Info */
|
|
{
|
|
/*
|
|
|
|
*/
|
|
struct dict_object * avp;
|
|
struct dict_avp_data data = {
|
|
486, /* Code */
|
|
0, /* Vendor */
|
|
"MIP6-Agent-Info", /* Name */
|
|
AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */
|
|
AVP_FLAG_MANDATORY, /* Fixed flag values */
|
|
AVP_TYPE_GROUPED /* base type of data */
|
|
};
|
|
|
|
struct local_rules_definition rules[] =
|
|
{ { "MIP-Home-Agent-Address", RULE_OPTIONAL, -1, 2 }
|
|
,{ "MIP-Home-Agent-Host", RULE_OPTIONAL, -1, 1 }
|
|
,{ "MIP6-Home-Link-Prefix", RULE_OPTIONAL, -1, 1 }
|
|
};
|
|
|
|
CHECK_dict_new( DICT_AVP, &data , NULL, &avp);
|
|
PARSE_loc_rules( rules, avp );
|
|
}
|
|
}
|
|
|
|
LOG_D( "Dictionary Extension 'MIPv6 NAS-to-HAAA Interaction' initialized");
|
|
return 0;
|
|
}
|
|
EXTENSION_ENTRY("dict_nas_mipv6", dict_nas_mipv6_init);
|