/** Helper function for adding media component AVPs - uses previously stored flow descriptions not SDP from messages*/ int add_media_components_using_current_flow_description(AAAMessage* aar, rx_authsessiondata_t *p_session_data) { flow_description_t *flow_description; int add_flow = 1; flow_description = p_session_data->first_current_flow_description; if(!flow_description) { return -1; } while (flow_description) { if(!authorize_video_flow) { if (strncmp(flow_description->media.s, "video", 5) == 0) { add_flow = 0; } } if(add_flow) { rx_add_media_component_description_avp(aar, flow_description->stream_num, &flow_description->media, &flow_description->req_sdp_ip_addr, &flow_description->req_sdp_port, &flow_description->rpl_sdp_ip_addr, &flow_description->rpl_sdp_port, &flow_description->rpl_sdp_transport, &flow_description->req_sdp_raw_stream, &flow_description->rpl_sdp_raw_stream, flow_description->direction); } flow_description = flow_description->next; add_flow = 1; } return 0; }
/** Helper function for adding media component AVPs for each SDP stream*/ int add_media_components(AAAMessage* aar, struct sip_msg *req, struct sip_msg *rpl, enum dialog_direction direction, AAASession* auth) { int sdp_session_num; int sdp_stream_num; sdp_session_cell_t* req_sdp_session, *rpl_sdp_session; sdp_stream_cell_t* req_sdp_stream, *rpl_sdp_stream; int add_flow = 1; if (!req || !rpl) { return CSCF_RETURN_FALSE; } if (parse_sdp(req) < 0) { LM_ERR("Unable to parse req SDP\n"); return CSCF_RETURN_FALSE; } if (parse_sdp(rpl) < 0) { LM_ERR("Unable to parse res SDP\n"); return CSCF_RETURN_FALSE; } sdp_session_num = 0; //Loop through req sessions and streams and get corresponding rpl sessions and streams and populate avps for (;;) { //we only cater for one session at the moment: TDOD: extend if (sdp_session_num > 0) { break; } req_sdp_session = get_sdp_session(req, sdp_session_num); rpl_sdp_session = get_sdp_session(rpl, sdp_session_num); if (!req_sdp_session || !rpl_sdp_session) { if (!req_sdp_session) LM_ERR("Missing SDP session information from req\n"); if (!rpl_sdp_session) LM_ERR("Missing SDP session information from rpl\n"); break; } sdp_stream_num = 0; for (;;) { req_sdp_stream = get_sdp_stream(req, sdp_session_num, sdp_stream_num); rpl_sdp_stream = get_sdp_stream(rpl, sdp_session_num, sdp_stream_num); if (!req_sdp_stream || !rpl_sdp_stream) { //LM_ERR("Missing SDP stream information\n"); break; } //is this a stream to add to AAR. if (req_sdp_stream->is_rtp) { //check if the src or dst port is 0 and if so then don't add to rx int intportA = atoi(req_sdp_stream->port.s); int intportB = atoi(rpl_sdp_stream->port.s); if(intportA != 0 && intportB != 0){ if(!authorize_video_flow) { if (strncmp(req_sdp_stream->media.s, "video", 5) == 0) { add_flow = 0; } } if(add_flow) { //add this to auth session data add_flow_description((rx_authsessiondata_t*) auth->u.auth.generic_data, sdp_stream_num + 1, &req_sdp_stream->media, &req_sdp_session->ip_addr, &req_sdp_stream->port, &rpl_sdp_session->ip_addr, &rpl_sdp_stream->port, &rpl_sdp_stream->transport, &req_sdp_stream->raw_stream, &rpl_sdp_stream->raw_stream, direction, 0 /*This is a new mcd, we are not setting it as active*/); rx_add_media_component_description_avp(aar, sdp_stream_num + 1, &req_sdp_stream->media, &req_sdp_session->ip_addr, &req_sdp_stream->port, &rpl_sdp_session->ip_addr, &rpl_sdp_stream->port, &rpl_sdp_stream->transport, &req_sdp_stream->raw_stream, &rpl_sdp_stream->raw_stream, direction); } add_flow = 1; } } sdp_stream_num++; } sdp_session_num++; } free_sdp((sdp_info_t**) (void*) &req->body); free_sdp((sdp_info_t**) (void*) &rpl->body); return 0; }
/** Helper function for adding media component AVPs for each SDP stream*/ int add_media_components(AAAMessage* aar, struct sip_msg *req, struct sip_msg *rpl, enum dialog_direction direction, str *ip, uint16_t *ip_version) { int sdp_session_num; int sdp_stream_num; sdp_session_cell_t* req_sdp_session, *rpl_sdp_session; sdp_stream_cell_t* req_sdp_stream, *rpl_sdp_stream; if (!req || !rpl) { return RX_RETURN_FALSE; } if (parse_sdp(req) < 0) { LM_ERR("Unable to parse req SDP\n"); return RX_RETURN_FALSE; } if (parse_sdp(rpl) < 0) { LM_ERR("Unable to parse res SDP\n"); return RX_RETURN_FALSE; } sdp_session_num = 0; //Loop through req sessions and streams and get corresponding rpl sessions and streams and populate avps for (;;) { //we only cater for one session at the moment: TDOD: extend if (sdp_session_num > 0) { break; } req_sdp_session = get_sdp_session(req, sdp_session_num); rpl_sdp_session = get_sdp_session(rpl, sdp_session_num); if (!req_sdp_session || !rpl_sdp_session) { if (!req_sdp_session) LM_ERR("Missing SDP session information from req\n"); if (!rpl_sdp_session) LM_ERR("Missing SDP session information from rpl\n"); break; } if (direction == DLG_MOBILE_ORIGINATING) { *ip_version = req_sdp_session->pf; *ip = req_sdp_session->ip_addr; } else if (direction == DLG_MOBILE_TERMINATING) { *ip_version = rpl_sdp_session->pf; *ip = rpl_sdp_session->ip_addr; } sdp_stream_num = 0; for (;;) { req_sdp_stream = get_sdp_stream(req, sdp_session_num, sdp_stream_num); rpl_sdp_stream = get_sdp_stream(rpl, sdp_session_num, sdp_stream_num); if (!req_sdp_stream || !rpl_sdp_stream) { //LM_ERR("Missing SDP stream information\n"); break; } //is this a stream to add to AAR. if (req_sdp_stream->is_rtp) { rx_add_media_component_description_avp(aar, sdp_stream_num + 1, &req_sdp_stream->media, &req_sdp_session->ip_addr, &req_sdp_stream->port, &rpl_sdp_session->ip_addr, &rpl_sdp_stream->port, &rpl_sdp_stream->transport, &req_sdp_stream->raw_stream, &rpl_sdp_stream->raw_stream, direction); } sdp_stream_num++; } sdp_session_num++; } free_sdp((sdp_info_t**) (void*) &req->body); free_sdp((sdp_info_t**) (void*) &rpl->body); return 0; }