*/
SWITCH_DECLARE(char *) get_addr(char *buf, switch_size_t len, struct sockaddr *sa, socklen_t salen);
+SWITCH_DECLARE(int) get_addr_int(switch_sockaddr_t *sa);
+SWITCH_DECLARE(int) switch_cmp_addr(switch_sockaddr_t *sa1, switch_sockaddr_t *sa2);
+
/*!
\brief get the port number of an ip address
\param sa the struct sockaddr * to get the port from
}
}
-
-
- if (bytes && ((rtp_session->cng_pt && rtp_session->recv_msg.header.pt == rtp_session->cng_pt) || rtp_session->recv_msg.header.pt == 13)) {
+
+ if (bytes && !switch_test_flag(rtp_session, SWITCH_RTP_FLAG_AUTOADJ) &&
+ (!switch_cmp_addr(rtp_session->from_addr, rtp_session->remote_addr) ||
+ ((rtp_session->cng_pt && rtp_session->recv_msg.header.pt == rtp_session->cng_pt) || rtp_session->recv_msg.header.pt == 13))) {
bytes = 0;
- goto recvfrom;
+ goto recvfrom;
+
}
if (bytes &&
#endif
+SWITCH_DECLARE(int) get_addr_int(switch_sockaddr_t *sa)
+{
+ struct sockaddr_in *s = (struct sockaddr_in *)&sa->sa;
+
+ return ntohs(s->sin_addr.s_addr);
+}
+
+
+SWITCH_DECLARE(int) switch_cmp_addr(switch_sockaddr_t *sa1, switch_sockaddr_t *sa2)
+{
+ struct sockaddr_in *s1 = (struct sockaddr_in *)&sa1->sa;
+ struct sockaddr_in *s2 = (struct sockaddr_in *)&sa2->sa;
+
+ return (ntohs(s1->sin_addr.s_addr) == ntohs(s2->sin_addr.s_addr) && ntohs(s1->sin_port) == ntohs(s2->sin_port));
+}
+
+
SWITCH_DECLARE(char *) get_addr(char *buf, switch_size_t len, struct sockaddr *sa, socklen_t salen)
{
switch_assert(buf);
*buf = '\0';
+
if (sa) {
getnameinfo(sa, salen, buf, (socklen_t)len, NULL, 0, NI_NUMERICHOST);
}