static inline avp_t *avp_dup(avp_t *avp) { avp_value_t val; avp_name_t name; str *s; if (avp) { get_avp_val(avp, &val); if (avp->flags & AVP_NAME_STR) { s = get_avp_name(avp); if (s) name.s = *s; else { name.s.s = NULL; name.s.len = 0; } } else name.n = avp->id; return create_avp(avp->flags, name, val); } return NULL; }
static pana_avp_list_t paa_avplist_create(pana_session_t * pacs, uint32_t AVP, ...) { va_list ap; pana_avp_codes_t reqAVP = AVP; pana_avp_t * tmp_avp = NULL; paa_ctx_t * ctx = NULL; pana_avp_list_t tmpavplist = NULL; uint8_t * tmpval = NULL; if (!pacs) { return NULL; } ctx=pacs->ctx; if(!ctx) { return NULL; } va_start(ap,AVP); do { switch (reqAVP & 0xffff) { case PAVP_NONCE: if (pacs->sa == NULL) { break; } if (os_get_random(pacs->sa->PaC_nonce, sizeof(pacs->sa->PaC_nonce)) < 0) { DEBUG("Nonce couldn't be generated"); } dbg_hexdump(MSG_SEC, "Generated Nonce contents", pacs->sa->PaC_nonce, sizeof(pacs->sa->PaC_nonce)); tmp_avp = create_avp(PAVP_NONCE, FAVP_FLAG_CLEARED, 0, pacs->sa->PaC_nonce, sizeof(pacs->sa->PaC_nonce)); tmpavplist = avp_list_insert(tmpavplist, avp_node_create(tmp_avp)); break; case PAVP_EAP_PAYLOAD: if (ctx->eap_resp_payload == NULL) { break; } tmp_avp = create_avp(PAVP_EAP_PAYLOAD, FAVP_FLAG_CLEARED, 0, bytebuff_data(ctx->eap_resp_payload), ctx->eap_resp_payload->used); tmpavplist = avp_list_insert(tmpavplist, avp_node_create(tmp_avp)); break; case PAVP_RESULT_CODE: tmpval = szalloc(uint32_t); buff_insert_be32(tmpval, (reqAVP >> 16) & 0xffff); tmp_avp = create_avp(PAVP_RESULT_CODE, FAVP_FLAG_CLEARED, 0, tmpval, sizeof(uint32_t)); tmpavplist = avp_list_insert(tmpavplist, avp_node_create(tmp_avp)); break; } reqAVP = va_arg(ap, pana_avp_codes_t); } while (reqAVP != PAVP_NULL); va_end(ap); return tmpavplist; }