|
|
|
@ -1789,11 +1789,12 @@ static int proc_list_show(struct seq_file *f, void *v) {
|
|
|
|
|
seq_printf(f, "\n");
|
|
|
|
|
|
|
|
|
|
for (j = 0; j < g->target.num_payload_types; j++) {
|
|
|
|
|
if (o->output.pt_output[j].replace_pattern_len)
|
|
|
|
|
if (o->output.pt_output[j].replace_pattern_len || o->output.pt_output[j].min_payload_len)
|
|
|
|
|
seq_printf(f, " RTP payload type %3u: "
|
|
|
|
|
"%u bytes replacement payload\n",
|
|
|
|
|
"%u bytes replacement payload, min payload len %u\n",
|
|
|
|
|
g->target.pt_input[j].pt_num,
|
|
|
|
|
o->output.pt_output[j].replace_pattern_len);
|
|
|
|
|
o->output.pt_output[j].replace_pattern_len,
|
|
|
|
|
o->output.pt_output[j].min_payload_len);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc_list_crypto_print(f, &o->encrypt_rtp, &o->output.encrypt, "encryption");
|
|
|
|
@ -5134,7 +5135,7 @@ static void proxy_packet_output_rtcp(struct sk_buff *skb, struct rtpengine_outpu
|
|
|
|
|
skb_put(skb, rtp->payload_len - pllen);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void proxy_packet_output_rtXp(struct sk_buff *skb, struct rtpengine_output *o,
|
|
|
|
|
static bool proxy_packet_output_rtXp(struct sk_buff *skb, struct rtpengine_output *o,
|
|
|
|
|
int rtp_pt_idx,
|
|
|
|
|
struct rtp_parsed *rtp, int ssrc_idx)
|
|
|
|
|
{
|
|
|
|
@ -5144,20 +5145,26 @@ static void proxy_packet_output_rtXp(struct sk_buff *skb, struct rtpengine_outpu
|
|
|
|
|
|
|
|
|
|
if (!rtp->ok) {
|
|
|
|
|
proxy_packet_output_rtcp(skb, o, rtp, ssrc_idx);
|
|
|
|
|
return;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// pattern rewriting
|
|
|
|
|
if (rtp_pt_idx >= 0 && o->output.pt_output[rtp_pt_idx].replace_pattern_len) {
|
|
|
|
|
if (o->output.pt_output[rtp_pt_idx].replace_pattern_len == 1)
|
|
|
|
|
memset(rtp->payload, o->output.pt_output[rtp_pt_idx].replace_pattern[0],
|
|
|
|
|
rtp->payload_len);
|
|
|
|
|
else {
|
|
|
|
|
for (i = 0; i < rtp->payload_len;
|
|
|
|
|
i += o->output.pt_output[rtp_pt_idx].replace_pattern_len)
|
|
|
|
|
memcpy(&rtp->payload[i],
|
|
|
|
|
o->output.pt_output[rtp_pt_idx].replace_pattern,
|
|
|
|
|
o->output.pt_output[rtp_pt_idx].replace_pattern_len);
|
|
|
|
|
if (rtp_pt_idx >= 0) {
|
|
|
|
|
if (o->output.pt_output[rtp_pt_idx].min_payload_len
|
|
|
|
|
&& rtp->payload_len < o->output.pt_output[rtp_pt_idx].min_payload_len)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (o->output.pt_output[rtp_pt_idx].replace_pattern_len) {
|
|
|
|
|
if (o->output.pt_output[rtp_pt_idx].replace_pattern_len == 1)
|
|
|
|
|
memset(rtp->payload, o->output.pt_output[rtp_pt_idx].replace_pattern[0],
|
|
|
|
|
rtp->payload_len);
|
|
|
|
|
else {
|
|
|
|
|
for (i = 0; i < rtp->payload_len;
|
|
|
|
|
i += o->output.pt_output[rtp_pt_idx].replace_pattern_len)
|
|
|
|
|
memcpy(&rtp->payload[i],
|
|
|
|
|
o->output.pt_output[rtp_pt_idx].replace_pattern,
|
|
|
|
|
o->output.pt_output[rtp_pt_idx].replace_pattern_len);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -5175,6 +5182,8 @@ static void proxy_packet_output_rtXp(struct sk_buff *skb, struct rtpengine_outpu
|
|
|
|
|
srtp_encrypt(&o->encrypt_rtp, &o->output.encrypt, rtp, pkt_idx);
|
|
|
|
|
srtp_authenticate(&o->encrypt_rtp, &o->output.encrypt, rtp, pkt_idx);
|
|
|
|
|
skb_put(skb, rtp->payload_len - pllen);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int send_proxy_packet_output(struct sk_buff *skb, struct rtpengine_target *g,
|
|
|
|
@ -5182,7 +5191,9 @@ static int send_proxy_packet_output(struct sk_buff *skb, struct rtpengine_target
|
|
|
|
|
struct rtpengine_output *o, struct rtp_parsed *rtp, int ssrc_idx,
|
|
|
|
|
const struct xt_action_param *par)
|
|
|
|
|
{
|
|
|
|
|
proxy_packet_output_rtXp(skb, o, rtp_pt_idx, rtp, ssrc_idx);
|
|
|
|
|
bool send_or_not = proxy_packet_output_rtXp(skb, o, rtp_pt_idx, rtp, ssrc_idx);
|
|
|
|
|
if (!send_or_not)
|
|
|
|
|
return 0;
|
|
|
|
|
return send_proxy_packet(skb, &o->output.src_addr, &o->output.dst_addr, o->output.tos, par);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|