int call_debug(struct re_printf *pf, const struct call *call) { int err; if (!call) return 0; err = re_hprintf(pf, "===== Call debug (%s) =====\n", state_name(call->state)); /* SIP Session debug */ err |= re_hprintf(pf, " local_uri: %s <%s>\n" " peer_uri: %s <%s>\n" " af=%s\n", call->local_name, call->local_uri, call->peer_name, call->peer_uri, net_af2name(call->af)); err |= re_hprintf(pf, " direction: %s\n", call->outgoing ? "Outgoing" : "Incoming"); /* SDP debug */ err |= sdp_session_debug(pf, call->sdp); return err; }
static int stream_sock_alloc(struct stream *s, int af) { struct sa laddr; int tos, err; if (!s) return EINVAL; /* we listen on all interfaces */ sa_init(&laddr, af); err = rtp_listen(&s->rtp, IPPROTO_UDP, &laddr, s->cfg.rtp_ports.min, s->cfg.rtp_ports.max, s->rtcp, rtp_recv, rtcp_handler, s); if (err) { warning("stream: rtp_listen failed: af=%s ports=%u-%u" " (%m)\n", net_af2name(af), s->cfg.rtp_ports.min, s->cfg.rtp_ports.max, err); return err; } tos = s->cfg.rtp_tos; (void)udp_setsockopt(rtp_sock(s->rtp), IPPROTO_IP, IP_TOS, &tos, sizeof(tos)); (void)udp_setsockopt(rtcp_sock(s->rtp), IPPROTO_IP, IP_TOS, &tos, sizeof(tos)); udp_rxsz_set(rtp_sock(s->rtp), RTP_RECV_SIZE); return 0; }
int ua_debug(struct re_printf *pf, const struct ua *ua) { struct le *le; int err; if (!ua) return 0; err = re_hprintf(pf, "--- %s ---\n", ua->acc->aor); err |= re_hprintf(pf, " cuser: %s\n", ua->cuser); err |= re_hprintf(pf, " pub-gruu: %s\n", ua->pub_gruu); err |= re_hprintf(pf, " af: %s\n", net_af2name(ua->af)); err |= re_hprintf(pf, " %H", ua_print_supported, ua); err |= account_debug(pf, ua->acc); for (le = ua->regl.head; le; le = le->next) err |= reg_debug(pf, le->data); return err; }
static void print_udp_bufsize(int af) { struct udp_sock *us = NULL; struct sa laddr; int fd; int sndbuf; int rcvbuf; socklen_t sndbuf_len = sizeof(sndbuf); socklen_t rcvbuf_len = sizeof(rcvbuf); int err; sa_init(&laddr, af); err = udp_listen(&us, &laddr, NULL, NULL); if (err) { warning("test: udp_listen failed (%m)\n", err); goto out; } fd = udp_sock_fd(us, af); if (-1 == fd) { warning("test: no udp socket fd\n"); goto out; } getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &sndbuf, &sndbuf_len); getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &rcvbuf_len); re_printf("test: udp socket buffersize for %-8s:" " SO_SNDBUF=%d SO_RCVBUF=%d\n", net_af2name(af), sndbuf, rcvbuf); out: mem_deref(us); }
int call_accept(struct call *call, struct sipsess_sock *sess_sock, const struct sip_msg *msg) { bool got_offer; int err; if (!call || !msg) return EINVAL; call->outgoing = false; got_offer = (mbuf_get_left(msg->mb) > 0); err = pl_strdup(&call->peer_uri, &msg->from.auri); if (err) return err; if (pl_isset(&msg->from.dname)) { err = pl_strdup(&call->peer_name, &msg->from.dname); if (err) return err; } if (got_offer) { struct sdp_media *m; const struct sa *raddr; err = sdp_decode(call->sdp, msg->mb, true); if (err) return err; call->got_offer = true; /* * Each media description in the SDP answer MUST * use the same network type as the corresponding * media description in the offer. * * See RFC 6157 */ m = stream_sdpmedia(audio_strm(call->audio)); raddr = sdp_media_raddr(m); if (sa_af(raddr) != call->af) { info("call: incompatible address-family" " (local=%s, remote=%s)\n", net_af2name(call->af), net_af2name(sa_af(raddr))); sip_treply(NULL, uag_sip(), msg, 488, "Not Acceptable Here"); call_event_handler(call, CALL_EVENT_CLOSED, "Wrong address family"); return 0; } /* Check if we have any common audio codecs, after * the SDP offer has been parsed */ if (!have_common_audio_codecs(call)) { info("call: no common audio codecs - rejected\n"); sip_treply(NULL, uag_sip(), msg, 488, "Not Acceptable Here"); call_event_handler(call, CALL_EVENT_CLOSED, "No audio codecs"); return 0; } } err = sipsess_accept(&call->sess, sess_sock, msg, 180, "Ringing", ua_cuser(call->ua), "application/sdp", NULL, auth_handler, call->acc, true, sipsess_offer_handler, sipsess_answer_handler, sipsess_estab_handler, sipsess_info_handler, sipsess_refer_handler, sipsess_close_handler, call, "Allow: %s\r\n", uag_allowed_methods()); if (err) { warning("call: sipsess_accept: %m\n", err); return err; } set_state(call, STATE_INCOMING); /* New call */ tmr_start(&call->tmr_inv, LOCAL_TIMEOUT*1000, invite_timeout, call); if (!call->acc->mnat) call_event_handler(call, CALL_EVENT_INCOMING, call->peer_uri); return err; }