Mercurial > hg > freeDiameter
diff libfdproto/dictionary.c @ 903:4382d7420e65
Add new AVP_BY_STRUCT method for searching vendor-specific AVPs. This allows more flexibility and superseeds AVP_BY_NAME_AND_VENDOR and AVP_BY_CODE_AND_VENDOR.
author | Sebastien Decugis <sdecugis@freediameter.net> |
---|---|
date | Fri, 14 Dec 2012 21:24:34 +0100 |
parents | 84a23e90519d |
children | ebe479bfcd4b |
line wrap: on
line diff
--- a/libfdproto/dictionary.c Fri Dec 14 20:42:28 2012 +0100 +++ b/libfdproto/dictionary.c Fri Dec 14 21:24:34 2012 +0100 @@ -976,6 +976,43 @@ } break; + case AVP_BY_STRUCT: + { + struct dict_avp_request_ex * _what = (struct dict_avp_request_ex *) what; + struct dict_object * vendor = NULL; + + CHECK_PARAMS( _what->avp_vendor.vendor || _what->avp_vendor.vendor_id || _what->avp_vendor.vendor_name ); + CHECK_PARAMS( _what->avp_data.avp_code || _what->avp_data.avp_name ); + + /* Now look for the vendor first */ + if (_what->avp_vendor.vendor) { + CHECK_PARAMS( ! _what->avp_vendor.vendor_id && ! _what->avp_vendor.vendor_name ); + vendor = _what->avp_vendor.vendor; + } else if (_what->avp_vendor.vendor_id) { + CHECK_PARAMS( ! _what->avp_vendor.vendor_name ); + CHECK_FCT( search_vendor( dict, VENDOR_BY_ID, &_what->avp_vendor.vendor_id, &vendor ) ); + } else { + CHECK_FCT( search_vendor( dict, VENDOR_BY_NAME, &_what->avp_vendor.vendor_name, &vendor ) ); + } + + if (vendor == NULL) { + if (result) + *result = NULL; + else + ret = ENOENT; + goto end; + } + + /* We now have our vendor = head of the appropriate avp list */ + if (_what->avp_data.avp_code) { + CHECK_PARAMS( ! _what->avp_data.avp_name ); + SEARCH_scalar( _what->avp_data.avp_code, &vendor->list[1], avp.avp_code, 1, (struct dict_object *)NULL ); + } else { + SEARCH_os0( _what->avp_data.avp_name, &vendor->list[2], avp.avp_name, 1); + } + } + break; + case AVP_BY_NAME_ALL_VENDORS: { struct fd_list * li;