Esempio n. 1
0
/** 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;
}
Esempio n. 2
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;
}
Esempio n. 3
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;
}