[Users] Re: [openser] Incorrect Route header
Jeremie Le Hen
jeremie at le-hen.org
Tue Aug 29 15:54:37 CEST 2006
Hi,
On Mon, Aug 28, 2006 at 04:36:42PM +0200, Jeremie Le Hen wrote:
> I am running a NATing proxy. Everything works fine, except that
> some of my neighbour proxies send me BYE requests with an incorrect
> Route header containing their own IP address.
>
> The result is naturally that my proxy sends back the request and
> the call is never ended.
>
> I know this is a wrong behaviour and I have contacted the remote
> administrator to have him fix his proxy. But in the meantime
> I would like to find a workaround for my users.
>
> I tried to do the following, before calling loose_routing(). I am
> not sure if it's relevant or not nevertheless:
>
> % if (method == "BYE") {
> % # XXX Remove buggy Route header from BYE packets.
> % xlog("L_ALERT", "Removing buggy Route header from BYE request");
> % remove_hf("Route");
> % lookup("location");
> % }
>
>
> However, I raised the verbosity level and found that the Route header
> is read as soon as the packet is received, therefore the above
> block is not really useful.
I dare to post the temporary workaround I have found for this issue,
for the records.
Fortunately, stock OpenSER doesn't allow to do this, which is fine
in regard to the RFC.
However I have customers and I can't afford to wait for the remote
administrator to unbreak his proxy. Given that the packet is
analyzed as soon as it is received by OpenSER, I didn't find an
easy way to circumvent a buggy Route header using the available
modules. Therefore, I wrote my little own module "shuntroute.so"
which mangles the SIP message as though there hav been no Route
header at all.
The above configuration block is now:
% if (method == "BYE") {
% # XXX Remove buggy Route header from BYE packets.
% xlog("L_ALERT", "Removing buggy Route header from BYE request");
% shuntroute();
% remove_hf("Route");
% lookup("location");
% }
Please purist, forgive me.
Best regards,
--
Jeremie Le Hen
< jeremie at le-hen dot org >< ttz at chchile dot org >
-------------- next part --------------
diff -urNp openser-1.1.0-notls/modules/shuntroute/Makefile openser-1.1.0-shuntroute/modules/shuntroute/Makefile
--- openser-1.1.0-notls/modules/shuntroute/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ openser-1.1.0-shuntroute/modules/shuntroute/Makefile 2006-08-29 14:33:42.000000000 +0200
@@ -0,0 +1,6 @@
+include ../../Makefile.defs
+auto_gen=
+NAME=shuntroute.so
+LIBS=
+
+include ../../Makefile.modules
diff -urNp openser-1.1.0-notls/modules/shuntroute/shuntroute.c openser-1.1.0-shuntroute/modules/shuntroute/shuntroute.c
--- openser-1.1.0-notls/modules/shuntroute/shuntroute.c 1970-01-01 01:00:00.000000000 +0100
+++ openser-1.1.0-shuntroute/modules/shuntroute/shuntroute.c 2006-08-29 15:50:39.000000000 +0200
@@ -0,0 +1,80 @@
+/*
+ * $Id: mangler.c,v 1.3 2006/01/24 20:56:25 bogdan_iancu Exp $
+ *
+ * mangler module
+ *
+ * Copyright (C) 2001-2003 FhG Fokus
+ *
+ * This file is part of openser, a free SIP server.
+ *
+ * openser is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version
+ *
+ * openser is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * History:
+ * --------
+ * 2003-04-07 first version.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "../../sr_module.h"
+#include "../../mem/mem.h"
+#include "../../dprint.h"
+#include "../../ut.h"
+#include "../../error.h"
+#include "../../str.h"
+#include "../../parser/msg_parser.h" /* struct sip_msg */
+
+MODULE_VERSION
+
+static int shuntroute(struct sip_msg *msg, char *unused1, char *unused2);
+
+/* Exported functions. */
+static cmd_export_t cmds[] =
+{
+ {"shuntroute", shuntroute, 0, NULL, REQUEST_ROUTE},
+ {0, 0, 0, 0, 0}
+};
+
+/* Module interface. */
+struct module_exports exports = {
+ "shuntroute",
+ cmds, /* Exported functions */
+ NULL, /* Exported parameters */
+ NULL, /* exported statistics */
+ NULL, /* module initialization function */
+ NULL, /* response function */
+ NULL, /* destroy function */
+ NULL /* child initialization function */
+};
+
+static int
+shuntroute(struct sip_msg *msg,
+ char *unused1 __attribute__ ((unused)),
+ char *unused2 __attribute__ ((unused)))
+{
+ struct hdr_field *itr, *tmp;;
+
+ if (msg->route == NULL)
+ return 1;
+ itr = msg->route;
+ while (itr) {
+ tmp = itr->sibling;
+ pkg_free(itr);
+ itr = tmp;
+ }
+ msg->route = NULL;
+ return 1;
+}
More information about the Users
mailing list