From: Martin Bouzek <martin.bouzek@radas-atc.cz>
To: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Linux Kernel <linux-kernel@vger.kernel.org>,
davem@davemloft.net, netdev@oss.sgi.com
Subject: Re: Minor IPSec bug + solution
Date: 17 Sep 2004 11:26:13 +0200 [thread overview]
Message-ID: <1095413173.2708.106.camel@mabouzek> (raw)
In-Reply-To: <E1C83f1-0002X7-00@gondolin.me.apana.org.au>
On Thu, 2004-09-16 at 23:19, Herbert Xu wrote:
> Martin Bouzek <martin.bouzek@radas-atc.cz> wrote:
> >
> > I was setting up an VPN via IPSec in kernel 2.6.x on IPv4 and found the
> > following bug. It is not possible to set up an IPComp/ESP tunnel with
> > IPComp set as mandatory. The following setup works fine for me:
>
> You can never set IPComp as mandatory because ipcomp_output() will not
> compress anything that is incompressible.
Sure. I receive IP-IP packets and they are checked with the same rules
as IPComp.
>
> > function. For tunnels it returns
> >
> > tmpl->optional && !xfrm_state_addr_cmp(tmpl, x, family);
>
> The check is correct as it is. Internal states must never match any
> required transform.
Well, I am not expierienced with the networking kernel code,
nevertheless I still think the check is not correct.
As I understand it, xfrm_state_addr_cmp returns 0 when tmpl->saddr is
0.0.0.0 (ipv4) or when tmpl->saddr.a4 == x->props.saddr.a4, that is why
there is the "!" before it. The "xfrm_state_ok" itself returns nonzero
if the tmpl matches the state. In such case the "xfrm_policy_ok" will
return index to next state in sec_path. If no matching state is found
the "xfrm_policy_ok" returns -1 (if not tmpl->optional) and in such case
"__xfrm_policy_check" returns 0 and packet is rejected.
So the following happens for me when packet is received for mandatory
IPComp tunnel:
With my setup the pol->xfrm_nr is 1 and sp->len is 1 (in
"__xfrm_policy_check" context). "xfrm_policy_ok" is called and it calls
the "xfrm_state_ok". x->tunnel_users is 2 - so the
"tmpl->optional && !xfrm_state_addr_cmp(tmpl, x, family)" is returned.
Because tmpl->optional is set to 0 (required IPComp),
xfrm_state_addr_cmp is not called at all and "xfrm_state_ok" returns 0.
Because sp->x[idx].xvec->props.mode is set, "xfrm_policy_ok" returns -1
(again tmpl->optional is 0). And so "__xfrm_policy_check" returns 0 and
packet is droped.
If you are still not convinced, please look at the xfrm_state_ok and the
part for non-tunnel. It clearly returns 1 when the tmpl and x matches.
Moreover with
"tmpl->optional || !xfrm_state_addr_cmp(tmpl, x, family);" in
"xfrm_state_ok" I can set up the mandatory IPComp without problems.
I am not sure there are not any side effects, but it seems ok to me.
Regards
Martin Bouzek
- martin.bouzek@radas-atc.cz
next prev parent reply other threads:[~2004-09-17 9:23 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-09-16 9:36 Minor IPSec bug + solution Martin Bouzek
2004-09-16 21:19 ` Herbert Xu
2004-09-17 9:26 ` Martin Bouzek [this message]
2004-09-17 10:27 ` Herbert Xu
2004-09-20 7:49 ` Martin Bouzek
2004-09-20 10:57 ` Herbert Xu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1095413173.2708.106.camel@mabouzek \
--to=martin.bouzek@radas-atc.cz \
--cc=davem@davemloft.net \
--cc=herbert@gondor.apana.org.au \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.