[Users] Re: [openser] Incorrect Route header
Bogdan-Andrei Iancu
bogdan at voice-system.ro
Fri Sep 1 11:12:07 CEST 2006
Hi Jeremie,
probably you could try to do from script something like this: if the src
ip is the buggy proxy and after loose_route() the destination URI points
to the same IP (use pseudo variables to do this check) , then you are
able to detect your case and to do a special processing.
regards,
bogdan
Jeremie Le Hen wrote:
>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,
>
>
>------------------------------------------------------------------------
>
>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;
>+}
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Users mailing list
>Users at openser.org
>http://openser.org/cgi-bin/mailman/listinfo/users
>
>
More information about the Users
mailing list