|
|
|
@ -1624,6 +1624,9 @@ static ssize_t proc_control_write(struct file *file, const char __user *buf, siz
|
|
|
|
struct rtpengine_table *t;
|
|
|
|
struct rtpengine_table *t;
|
|
|
|
struct rtpengine_message msg;
|
|
|
|
struct rtpengine_message msg;
|
|
|
|
int err;
|
|
|
|
int err;
|
|
|
|
|
|
|
|
int port;
|
|
|
|
|
|
|
|
struct rtpengine_target *g;
|
|
|
|
|
|
|
|
unsigned long flags;
|
|
|
|
|
|
|
|
|
|
|
|
if (buflen != sizeof(msg))
|
|
|
|
if (buflen != sizeof(msg))
|
|
|
|
return -EIO;
|
|
|
|
return -EIO;
|
|
|
|
@ -1661,6 +1664,19 @@ static ssize_t proc_control_write(struct file *file, const char __user *buf, siz
|
|
|
|
goto err;
|
|
|
|
goto err;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case MMG_MEASUREDELAY:
|
|
|
|
|
|
|
|
port=0;
|
|
|
|
|
|
|
|
if (t==NULL)
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
g = find_next_target(t, &port);
|
|
|
|
|
|
|
|
while (g != NULL) {
|
|
|
|
|
|
|
|
spin_lock_irqsave(&g->stats_lock, flags);
|
|
|
|
|
|
|
|
g->stats.measureactive=1;
|
|
|
|
|
|
|
|
spin_unlock_irqrestore(&g->stats_lock, flags);
|
|
|
|
|
|
|
|
g = find_next_target(t, &port);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
printk(KERN_WARNING "xt_RTPENGINE unimplemented op %u\n", msg.cmd);
|
|
|
|
printk(KERN_WARNING "xt_RTPENGINE unimplemented op %u\n", msg.cmd);
|
|
|
|
err = -EINVAL;
|
|
|
|
err = -EINVAL;
|
|
|
|
@ -1792,6 +1808,8 @@ drop:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int send_proxy_packet(struct sk_buff *skb, struct re_address *src, struct re_address *dst, unsigned char tos) {
|
|
|
|
static int send_proxy_packet(struct sk_buff *skb, struct re_address *src, struct re_address *dst, unsigned char tos) {
|
|
|
|
|
|
|
|
printk(KERN_WARNING "xt_RTPENGINE send_proxy_packet\n");
|
|
|
|
|
|
|
|
|
|
|
|
if (src->family != dst->family)
|
|
|
|
if (src->family != dst->family)
|
|
|
|
goto drop;
|
|
|
|
goto drop;
|
|
|
|
|
|
|
|
|
|
|
|
@ -2105,7 +2123,7 @@ static inline int is_dtls(struct sk_buff *skb) {
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static unsigned int rtpengine46(struct sk_buff *skb, struct rtpengine_table *t, struct re_address *src) {
|
|
|
|
static unsigned int rtpengine46(struct sk_buff *skb, struct rtpengine_table *t, struct re_address *src, struct timespec *starttime) {
|
|
|
|
struct udphdr *uh;
|
|
|
|
struct udphdr *uh;
|
|
|
|
struct rtpengine_target *g;
|
|
|
|
struct rtpengine_target *g;
|
|
|
|
struct sk_buff *skb2;
|
|
|
|
struct sk_buff *skb2;
|
|
|
|
@ -2212,8 +2230,15 @@ not_rtp:
|
|
|
|
|
|
|
|
|
|
|
|
err = send_proxy_packet(skb, &g->target.src_addr, &g->target.dst_addr, g->target.tos);
|
|
|
|
err = send_proxy_packet(skb, &g->target.src_addr, &g->target.dst_addr, g->target.tos);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
out:
|
|
|
|
spin_lock_irqsave(&g->stats_lock, flags);
|
|
|
|
spin_lock_irqsave(&g->stats_lock, flags);
|
|
|
|
|
|
|
|
if (g->stats.measureactive==1) {
|
|
|
|
|
|
|
|
g->stats.start = *starttime;
|
|
|
|
|
|
|
|
getnstimeofday(&g->stats.end);
|
|
|
|
|
|
|
|
g->stats.measureactive=0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
printk(KERN_WARNING "xt_RTPENGINE failed to create /proc entry for ID %llu\n", g->stats.start.tv_nsec);
|
|
|
|
if (err)
|
|
|
|
if (err)
|
|
|
|
g->stats.errors++;
|
|
|
|
g->stats.errors++;
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
@ -2254,6 +2279,8 @@ static unsigned int rtpengine4(struct sk_buff *oskb, const struct xt_action_para
|
|
|
|
struct iphdr *ih;
|
|
|
|
struct iphdr *ih;
|
|
|
|
struct rtpengine_table *t;
|
|
|
|
struct rtpengine_table *t;
|
|
|
|
struct re_address src;
|
|
|
|
struct re_address src;
|
|
|
|
|
|
|
|
struct timespec starttime;
|
|
|
|
|
|
|
|
getnstimeofday(&starttime);
|
|
|
|
|
|
|
|
|
|
|
|
t = get_table(pinfo->id);
|
|
|
|
t = get_table(pinfo->id);
|
|
|
|
if (!t)
|
|
|
|
if (!t)
|
|
|
|
@ -2272,8 +2299,7 @@ static unsigned int rtpengine4(struct sk_buff *oskb, const struct xt_action_para
|
|
|
|
memset(&src, 0, sizeof(src));
|
|
|
|
memset(&src, 0, sizeof(src));
|
|
|
|
src.family = AF_INET;
|
|
|
|
src.family = AF_INET;
|
|
|
|
src.u.ipv4 = ih->saddr;
|
|
|
|
src.u.ipv4 = ih->saddr;
|
|
|
|
|
|
|
|
return rtpengine46(skb, t, &src, &starttime);
|
|
|
|
return rtpengine46(skb, t, &src);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
skip2:
|
|
|
|
skip2:
|
|
|
|
kfree_skb(skb);
|
|
|
|
kfree_skb(skb);
|
|
|
|
@ -2296,6 +2322,8 @@ static unsigned int rtpengine6(struct sk_buff *oskb, const struct xt_action_para
|
|
|
|
struct ipv6hdr *ih;
|
|
|
|
struct ipv6hdr *ih;
|
|
|
|
struct rtpengine_table *t;
|
|
|
|
struct rtpengine_table *t;
|
|
|
|
struct re_address src;
|
|
|
|
struct re_address src;
|
|
|
|
|
|
|
|
struct timespec starttime;
|
|
|
|
|
|
|
|
getnstimeofday(&starttime);
|
|
|
|
|
|
|
|
|
|
|
|
t = get_table(pinfo->id);
|
|
|
|
t = get_table(pinfo->id);
|
|
|
|
if (!t)
|
|
|
|
if (!t)
|
|
|
|
@ -2314,8 +2342,7 @@ static unsigned int rtpengine6(struct sk_buff *oskb, const struct xt_action_para
|
|
|
|
memset(&src, 0, sizeof(src));
|
|
|
|
memset(&src, 0, sizeof(src));
|
|
|
|
src.family = AF_INET6;
|
|
|
|
src.family = AF_INET6;
|
|
|
|
memcpy(&src.u.ipv6, &ih->saddr, sizeof(src.u.ipv6));
|
|
|
|
memcpy(&src.u.ipv6, &ih->saddr, sizeof(src.u.ipv6));
|
|
|
|
|
|
|
|
return rtpengine46(skb, t, &src, &starttime);
|
|
|
|
return rtpengine46(skb, t, &src);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
skip2:
|
|
|
|
skip2:
|
|
|
|
kfree_skb(skb);
|
|
|
|
kfree_skb(skb);
|
|
|
|
|