| 3899 | } |
| 3900 | |
| 3901 | static int |
| 3902 | rtpengine_manage(struct sip_msg *msg, str *flags, pv_spec_t *spvar, |
| 3903 | pv_spec_t *bpvar, str *body) |
| 3904 | { |
| 3905 | int method; |
| 3906 | int nosdp; |
| 3907 | int op = OP_ANSWER; |
| 3908 | struct cell *t; |
| 3909 | |
| 3910 | if(msg->cseq==NULL && ((parse_headers(msg, HDR_CSEQ_F, 0)==-1) |
| 3911 | || (msg->cseq==NULL))) |
| 3912 | { |
| 3913 | LM_ERR("no CSEQ header\n"); |
| 3914 | return -1; |
| 3915 | } |
| 3916 | |
| 3917 | method = get_cseq(msg)->method_id; |
| 3918 | |
| 3919 | if(!(method==METHOD_INVITE || method==METHOD_ACK || method==METHOD_CANCEL |
| 3920 | || method==METHOD_BYE || method==METHOD_UPDATE || method==METHOD_PRACK)) |
| 3921 | return -1; |
| 3922 | |
| 3923 | if(method==METHOD_CANCEL || method==METHOD_BYE) |
| 3924 | return rtpengine_delete(msg, flags, NULL, NULL, spvar); |
| 3925 | |
| 3926 | if (body) |
| 3927 | nosdp = body->len != 0; |
| 3928 | else if(has_body_part(msg, TYPE_APPLICATION, SUBTYPE_SDP)) |
| 3929 | nosdp = 0; |
| 3930 | else |
| 3931 | nosdp = parse_sdp(msg)?0:1; |
| 3932 | |
| 3933 | if(msg->first_line.type == SIP_REQUEST) { |
| 3934 | if(nosdp==0) { |
| 3935 | switch (method) { |
| 3936 | case METHOD_ACK: |
| 3937 | case METHOD_PRACK: |
| 3938 | op = OP_ANSWER; |
| 3939 | break; |
| 3940 | case METHOD_INVITE: |
| 3941 | if(route_type==FAILURE_ROUTE) |
| 3942 | return rtpengine_delete(msg, flags, NULL, NULL, spvar); |
| 3943 | /* fall through */ |
| 3944 | case METHOD_UPDATE: |
| 3945 | op = OP_OFFER; |
| 3946 | break; |
| 3947 | default: |
| 3948 | return -1; |
| 3949 | } |
| 3950 | return rtpengine_offer_answer(msg, flags, NULL, spvar, bpvar, body, op); |
| 3951 | } else if (method==METHOD_INVITE) { |
| 3952 | msg->msg_flags |= FL_BODY_NO_SDP; |
| 3953 | } |
| 3954 | } else if(msg->first_line.type == SIP_REPLY) { |
| 3955 | if(msg->first_line.u.reply.statuscode>=300) |
| 3956 | return rtpengine_delete(msg, flags, NULL, NULL, spvar); |
| 3957 | if(nosdp==0) { |
| 3958 | if(method==METHOD_UPDATE) |
no test coverage detected