|
|
|
@ -1624,6 +1624,9 @@ static ssize_t proc_control_write(struct file *file, const char __user *buf, siz |
|
|
|
struct rtpengine_table *t; |
|
|
|
struct rtpengine_message msg; |
|
|
|
int err; |
|
|
|
int port; |
|
|
|
struct rtpengine_target *g; |
|
|
|
unsigned long flags; |
|
|
|
|
|
|
|
if (buflen != sizeof(msg)) |
|
|
|
return -EIO; |
|
|
|
@ -1661,6 +1664,19 @@ static ssize_t proc_control_write(struct file *file, const char __user *buf, siz |
|
|
|
goto err; |
|
|
|
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: |
|
|
|
printk(KERN_WARNING "xt_RTPENGINE unimplemented op %u\n", msg.cmd); |
|
|
|
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) { |
|
|
|
printk(KERN_WARNING "xt_RTPENGINE send_proxy_packet\n"); |
|
|
|
|
|
|
|
if (src->family != dst->family) |
|
|
|
goto drop; |
|
|
|
|
|
|
|
@ -2105,7 +2123,7 @@ static inline int is_dtls(struct sk_buff *skb) { |
|
|
|
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 rtpengine_target *g; |
|
|
|
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); |
|
|
|
|
|
|
|
|
|
|
|
out: |
|
|
|
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) |
|
|
|
g->stats.errors++; |
|
|
|
else { |
|
|
|
@ -2254,6 +2279,8 @@ static unsigned int rtpengine4(struct sk_buff *oskb, const struct xt_action_para |
|
|
|
struct iphdr *ih; |
|
|
|
struct rtpengine_table *t; |
|
|
|
struct re_address src; |
|
|
|
struct timespec starttime; |
|
|
|
getnstimeofday(&starttime); |
|
|
|
|
|
|
|
t = get_table(pinfo->id); |
|
|
|
if (!t) |
|
|
|
@ -2272,8 +2299,7 @@ static unsigned int rtpengine4(struct sk_buff *oskb, const struct xt_action_para |
|
|
|
memset(&src, 0, sizeof(src)); |
|
|
|
src.family = AF_INET; |
|
|
|
src.u.ipv4 = ih->saddr; |
|
|
|
|
|
|
|
return rtpengine46(skb, t, &src); |
|
|
|
return rtpengine46(skb, t, &src, &starttime); |
|
|
|
|
|
|
|
skip2: |
|
|
|
kfree_skb(skb); |
|
|
|
@ -2296,6 +2322,8 @@ static unsigned int rtpengine6(struct sk_buff *oskb, const struct xt_action_para |
|
|
|
struct ipv6hdr *ih; |
|
|
|
struct rtpengine_table *t; |
|
|
|
struct re_address src; |
|
|
|
struct timespec starttime; |
|
|
|
getnstimeofday(&starttime); |
|
|
|
|
|
|
|
t = get_table(pinfo->id); |
|
|
|
if (!t) |
|
|
|
@ -2314,8 +2342,7 @@ static unsigned int rtpengine6(struct sk_buff *oskb, const struct xt_action_para |
|
|
|
memset(&src, 0, sizeof(src)); |
|
|
|
src.family = AF_INET6; |
|
|
|
memcpy(&src.u.ipv6, &ih->saddr, sizeof(src.u.ipv6)); |
|
|
|
|
|
|
|
return rtpengine46(skb, t, &src); |
|
|
|
return rtpengine46(skb, t, &src, &starttime); |
|
|
|
|
|
|
|
skip2: |
|
|
|
kfree_skb(skb); |
|
|
|
|