|
|
|
|
@ -170,6 +170,15 @@ static uint stream_packets_list_limit = 10;
|
|
|
|
|
module_param(stream_packets_list_limit, uint, 0);
|
|
|
|
|
MODULE_PARM_DESC(stream_packets_list_limit, "maximum number of packets to retain for intercept streams");
|
|
|
|
|
|
|
|
|
|
static bool log_errors = 0;
|
|
|
|
|
module_param(log_errors, bool, 0);
|
|
|
|
|
MODULE_PARM_DESC(log_errors, "generate kernel log lines from forwarding errors");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define log_err(fmt, ...) do { if (log_errors) printk(KERN_NOTICE "rtpengine[%s:%i]: " fmt, \
|
|
|
|
|
__FUNCTION__, __LINE__, ##__VA_ARGS__); } while (0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -3200,6 +3209,7 @@ static int send_proxy_packet4(struct sk_buff *skb, struct re_address *src, struc
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
drop:
|
|
|
|
|
log_err("IPv4 routing failed");
|
|
|
|
|
kfree_skb(skb);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
@ -3270,6 +3280,7 @@ static int send_proxy_packet6(struct sk_buff *skb, struct re_address *src, struc
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
drop:
|
|
|
|
|
log_err("IPv6 routing failed");
|
|
|
|
|
kfree_skb(skb);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
@ -3280,8 +3291,10 @@ drop:
|
|
|
|
|
static int send_proxy_packet(struct sk_buff *skb, struct re_address *src, struct re_address *dst,
|
|
|
|
|
unsigned char tos, const struct xt_action_param *par)
|
|
|
|
|
{
|
|
|
|
|
if (src->family != dst->family)
|
|
|
|
|
if (src->family != dst->family) {
|
|
|
|
|
log_err("address family mismatch");
|
|
|
|
|
goto drop;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (src->family) {
|
|
|
|
|
case AF_INET:
|
|
|
|
|
@ -3293,6 +3306,7 @@ static int send_proxy_packet(struct sk_buff *skb, struct re_address *src, struct
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
log_err("unsupported address family");
|
|
|
|
|
goto drop;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -3651,8 +3665,10 @@ static inline int rtp_payload_type(const struct rtp_header *hdr, const struct rt
|
|
|
|
|
|
|
|
|
|
pt = hdr->m_pt & 0x7f;
|
|
|
|
|
match = bsearch(&pt, tg->payload_types, tg->num_payload_types, sizeof(pt), rtp_payload_match);
|
|
|
|
|
if (!match)
|
|
|
|
|
if (!match) {
|
|
|
|
|
log_err("RTP payload type %u not found", (unsigned int) pt);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
return match - tg->payload_types;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
@ -3718,6 +3734,7 @@ static unsigned int rtpengine46(struct sk_buff *skb, struct rtpengine_table *t,
|
|
|
|
|
u_int64_t pkt_idx;
|
|
|
|
|
struct re_stream *stream;
|
|
|
|
|
struct re_stream_packet *packet;
|
|
|
|
|
const char *errstr = NULL;
|
|
|
|
|
|
|
|
|
|
#if (RE_HAS_MEASUREDELAY)
|
|
|
|
|
u_int64_t starttime, endtime, delay;
|
|
|
|
|
@ -3772,6 +3789,7 @@ not_stun:
|
|
|
|
|
goto skip1;
|
|
|
|
|
/* MSM_DROP */
|
|
|
|
|
error_nf_action = NF_DROP;
|
|
|
|
|
errstr = "source address mismatch";
|
|
|
|
|
goto skip_error;
|
|
|
|
|
|
|
|
|
|
src_check_ok:
|
|
|
|
|
@ -3797,12 +3815,15 @@ src_check_ok:
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Pass to userspace if SSRC has changed.
|
|
|
|
|
errstr = "SSRC mismatch";
|
|
|
|
|
if (unlikely((g->target.ssrc) && (g->target.ssrc != rtp.header->ssrc)))
|
|
|
|
|
goto skip_error;
|
|
|
|
|
|
|
|
|
|
pkt_idx = packet_index(&g->decrypt, &g->target.decrypt, rtp.header);
|
|
|
|
|
errstr = "SRTP authentication tag mismatch";
|
|
|
|
|
if (srtp_auth_validate(&g->decrypt, &g->target.decrypt, &rtp, &pkt_idx))
|
|
|
|
|
goto skip_error;
|
|
|
|
|
errstr = "SRTP decryption failed";
|
|
|
|
|
if (srtp_decrypt(&g->decrypt, &g->target.decrypt, &rtp, pkt_idx))
|
|
|
|
|
goto skip_error;
|
|
|
|
|
|
|
|
|
|
@ -3907,6 +3928,7 @@ no_intercept:
|
|
|
|
|
return NF_DROP;
|
|
|
|
|
|
|
|
|
|
skip_error:
|
|
|
|
|
log_err("x_tables action failed: %s", errstr);
|
|
|
|
|
atomic64_inc(&g->stats.errors);
|
|
|
|
|
skip1:
|
|
|
|
|
target_put(g);
|
|
|
|
|
|