* Patch for ip_nat_rtsp.c
@ 2005-10-09 12:59 Sverker Abrahamsson
0 siblings, 0 replies; only message in thread
From: Sverker Abrahamsson @ 2005-10-09 12:59 UTC (permalink / raw)
To: netfilter-devel, tmarshall
[-- Attachment #1: Type: text/plain, Size: 567 bytes --]
Hi
I was trying to get the RTSP nat module to work by applying the patches in patch-o-matic but ip_nat_rtsp.c continued to give compiler errors. I patched as far as I could but got stuck in help_out where it uses seq field of struct ip_conntrack_expect, which I believe was removed in 2.6.11. I haven't been able to figure out the exact functionality and I see on other nat modules that they were simplified a lot after the 2.6.11 API change.
Maybe someone on the list can understand the functionality better, or can hint me on what should be changed.
/Sverker
[-- Attachment #2: ip_nat_rtsp.patch --]
[-- Type: application/octet-stream, Size: 4997 bytes --]
--- linux-2.6.13.3.orig/include/linux/netfilter_ipv4/ip_conntrack_rtsp.h 2005-10-09 14:46:59.000000000 +0200
+++ linux-2.6.13.3/include/linux/netfilter_ipv4/ip_conntrack_rtsp.h 2005-10-08 20:47:26.000000000 +0200
@@ -47,6 +47,13 @@
#endif
};
+/* For NAT to hook in when we find a packet which describes what other
+ * connection we should expect. */
+extern unsigned int (*ip_nat_rtsp_hook)(struct sk_buff **pskb,
+ enum ip_conntrack_info ctinfo,
+ struct ip_ct_rtsp_expect *expinfo,
+ struct ip_conntrack_expect *exp);
+
#ifdef __KERNEL__
#define RTSP_PORT 554
--- linux-2.6.13.3.orig/net/ipv4/netfilter/ip_nat_rtsp.c 2005-10-09 14:43:50.000000000 +0200
+++ linux-2.6.13.3/net/ipv4/netfilter/ip_nat_rtsp.c 2005-10-08 19:52:05.000000000 +0200
@@ -69,6 +69,7 @@
static int num_ports = 0;
static u_int32_t extip = 0;
static int dstact = 0;
+static DEFINE_SPINLOCK(ip_rtsp_lock);
MODULE_AUTHOR("Tom Marshall <tmarshall@real.com>");
MODULE_DESCRIPTION("RTSP network address translation module");
@@ -163,8 +164,8 @@
case pb_single:
for (loport = prtspexp->loport; loport != 0; loport++) /* XXX: improper wrap? */
{
- t.dst.u.udp.port = htons(loport);
- if (ip_conntrack_change_expect(exp, &t) == 0)
+ exp->tuple.dst.u.udp.port = htons(loport);
+ if (ip_conntrack_expect_related(exp) == 0)
{
DEBUGP("using port %hu\n", loport);
break;
@@ -179,8 +180,8 @@
case pb_range:
for (loport = prtspexp->loport; loport != 0; loport += 2) /* XXX: improper wrap? */
{
- t.dst.u.udp.port = htons(loport);
- if (ip_conntrack_change_expect(exp, &t) == 0)
+ exp->tuple.dst.u.udp.port = htons(loport);
+ if (ip_conntrack_expect_related(exp) == 0)
{
hiport = loport + ~exp->mask.dst.u.udp.port;
DEBUGP("using ports %hu-%hu\n", loport, hiport);
@@ -196,8 +197,8 @@
case pb_discon:
for (loport = prtspexp->loport; loport != 0; loport++) /* XXX: improper wrap? */
{
- t.dst.u.udp.port = htons(loport);
- if (ip_conntrack_change_expect(exp, &t) == 0)
+ exp->tuple.dst.u.udp.port = htons(loport);
+ if (ip_conntrack_expect_related(exp) == 0)
{
DEBUGP("using port %hu (1 of 2)\n", loport);
break;
@@ -205,8 +206,8 @@
}
for (hiport = prtspexp->hiport; hiport != 0; hiport++) /* XXX: improper wrap? */
{
- t.dst.u.udp.port = htons(hiport);
- if (ip_conntrack_change_expect(exp, &t) == 0)
+ exp->tuple.dst.u.udp.port = htons(hiport);
+ if (ip_conntrack_expect_related(exp) == 0)
{
DEBUGP("using port %hu (2 of 2)\n", hiport);
break;
@@ -365,7 +366,7 @@
static unsigned int
expected(struct sk_buff **pskb, uint hooknum, struct ip_conntrack* ct, struct ip_nat_info* info)
{
- struct ip_nat_multi_range mr;
+ struct ip_nat_range mr;
u_int32_t newdstip, newsrcip, newip;
struct ip_conntrack *master = master_ct(ct);
@@ -382,10 +383,9 @@
DEBUGP("newsrcip=%u.%u.%u.%u, newdstip=%u.%u.%u.%u, newip=%u.%u.%u.%u\n",
NIPQUAD(newsrcip), NIPQUAD(newdstip), NIPQUAD(newip));
- mr.rangesize = 1;
/* We don't want to manip the per-protocol, just the IPs. */
- mr.range[0].flags = IP_NAT_RANGE_MAP_IPS;
- mr.range[0].min_ip = mr.range[0].max_ip = newip;
+ mr.flags = IP_NAT_RANGE_MAP_IPS;
+ mr.min_ip = mr.max_ip = newip;
return ip_nat_setup_info(ct, &mr, hooknum);
}
@@ -428,7 +428,7 @@
if (nf_strncasecmp(ptcp+lineoff, "Transport:", 10) == 0)
{
uint oldtcplen = tcplen;
- if (!rtsp_mangle_tran(ct, ctinfo, exp, prtspexp, pskb, lineoff, linelen))
+ if (!rtsp_mangle_tran(ctinfo, exp, prtspexp, pskb, lineoff, linelen))
{
break;
}
@@ -445,9 +445,9 @@
}
static int
-help(struct sk_buff **pskb
+help(struct sk_buff **pskb,
enum ip_conntrack_info ctinfo,
- struct ip_ct_rtsp_expect *ct_rtsp_info;
+ struct ip_ct_rtsp_expect *ct_rtsp_info,
struct ip_conntrack_expect* exp)
{
struct iphdr* iph = (struct iphdr*)(*pskb)->nh.iph;
@@ -456,17 +456,18 @@
int dir = CTINFO2DIR(ctinfo);
int rc = NF_ACCEPT;
+ spin_lock_bh(&ip_rtsp_lock);
switch (dir)
{
case IP_CT_DIR_ORIGINAL:
- rc = help_out(pskb, ctinfo, ct_rtsp_info, exp, pskb);
+ rc = help_out(pskb, ctinfo, ct_rtsp_info, exp);
break;
case IP_CT_DIR_REPLY:
/* XXX: unmangle */
rc = NF_ACCEPT;
break;
}
- UNLOCK_BH(&ip_rtsp_lock);
+ spin_unlock_bh(&ip_rtsp_lock);
return rc;
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2005-10-09 12:59 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-10-09 12:59 Patch for ip_nat_rtsp.c Sverker Abrahamsson
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.