From patchwork Wed Nov 24 08:18:58 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Timo Teras X-Patchwork-Id: 72812 X-Patchwork-Delegate: shemminger@vyatta.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 6141AB7080 for ; Wed, 24 Nov 2010 19:19:33 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752076Ab0KXIT0 (ORCPT ); Wed, 24 Nov 2010 03:19:26 -0500 Received: from mail-wy0-f174.google.com ([74.125.82.174]:52240 "EHLO mail-wy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751731Ab0KXITZ (ORCPT ); Wed, 24 Nov 2010 03:19:25 -0500 Received: by mail-wy0-f174.google.com with SMTP id 28so9217544wyb.19 for ; Wed, 24 Nov 2010 00:19:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:sender:from:to:cc:subject :date:message-id:x-mailer:in-reply-to:references:mime-version :content-type:content-transfer-encoding; bh=f9sBbuEKffQIwtUcBKwImGquvsD2lxg9oLgxrLiKSfY=; b=LKqkk0Y2kmQdmB1inLHOnVBA0ZTH1rRRx40iewvhsA5+hf9lmOR6CchkbPB9r2LAGI hDEHQNNgAZf9XlBsj630w5+0+cDh+sOcpQ4WAmmLhEdXCTbtPljHW5/gf0DBhKvh0PhC 69gi0ZfubImXf1DdcXlJkjmIHH+158nccZcTU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references:mime-version:content-type:content-transfer-encoding; b=A1B4sKX/YFIoDkvInnE4vNrJUTKepb8TbIPYXgSmKyI8p4aOXuUdV0nwIb0vg0PdwK ZDE7Bsc80ph1hkPyY9K9sFajT7E0GbMxphqN/jTWT7lrylsBsmYxcpsAW4XRAQbUHUfX Ny8ogKxNkd56NWqpGrBByLujU3nmLsymDyU/w= Received: by 10.216.159.195 with SMTP id s45mr7819367wek.43.1290586764552; Wed, 24 Nov 2010 00:19:24 -0800 (PST) Received: from vostro.ism.fin.wtbts.net (mail.fi.jw.org [83.145.235.193]) by mx.google.com with ESMTPS id x3sm3305617wes.46.2010.11.24.00.19.23 (version=SSLv3 cipher=RC4-MD5); Wed, 24 Nov 2010 00:19:23 -0800 (PST) From: =?UTF-8?q?Timo=20Ter=C3=A4s?= To: shemminger@linux-foundation.org, netdev@vger.kernel.org Cc: =?UTF-8?q?Timo=20Ter=C3=A4s?= Subject: [PATCH 2/2] iproute2: support xfrm upper protocol gre key Date: Wed, 24 Nov 2010 10:18:58 +0200 Message-Id: <1290586738-27056-2-git-send-email-timo.teras@iki.fi> X-Mailer: git-send-email 1.7.1 In-Reply-To: <20101123105418.65072de8@nehalam> References: <20101123105418.65072de8@nehalam> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Similar to tunnel side: accept dotted-quad and number formats. Use regular number for printing the key. Signed-off-by: Timo Teräs --- I decided to keep using get_addr32() and get_unsigned() since uclibc inet_aton() does not accept all formats. ip/ipxfrm.c | 39 +++++++++++++++++++++++++++++++++++++++ ip/xfrm_policy.c | 3 ++- man/man8/ip.8 | 25 ++++++++++++++++--------- 3 files changed, 57 insertions(+), 10 deletions(-) diff --git a/ip/ipxfrm.c b/ip/ipxfrm.c index 99a6756..9753822 100644 --- a/ip/ipxfrm.c +++ b/ip/ipxfrm.c @@ -483,6 +483,12 @@ void xfrm_selector_print(struct xfrm_selector *sel, __u16 family, if (sel->dport_mask) fprintf(fp, "code %u ", ntohs(sel->dport)); break; + case IPPROTO_GRE: + if (sel->sport_mask || sel->dport_mask) + fprintf(fp, "key %u ", + (((__u32)ntohs(sel->sport)) << 16) + + ntohs(sel->dport)); + break; case IPPROTO_MH: if (sel->sport_mask) fprintf(fp, "type %u ", ntohs(sel->sport)); @@ -1086,6 +1092,7 @@ static int xfrm_selector_upspec_parse(struct xfrm_selector *sel, char *dportp = NULL; char *typep = NULL; char *codep = NULL; + char *grekey = NULL; while (1) { if (strcmp(*argv, "proto") == 0) { @@ -1162,6 +1169,29 @@ static int xfrm_selector_upspec_parse(struct xfrm_selector *sel, filter.upspec_dport_mask = XFRM_FILTER_MASK_FULL; + } else if (strcmp(*argv, "key") == 0) { + unsigned uval; + + grekey = *argv; + + NEXT_ARG(); + + if (strchr(*argv, '.')) + uval = htonl(get_addr32(*argv)); + else { + if (get_unsigned(&uval, *argv, 0)<0) { + fprintf(stderr, "invalid value of \"key\"\n"); + exit(-1); + } + } + + sel->sport = htons(uval >> 16); + sel->dport = htons(uval & 0xffff); + sel->sport_mask = ~((__u16)0); + sel->dport_mask = ~((__u16)0); + + filter.upspec_dport_mask = XFRM_FILTER_MASK_FULL; + } else { PREV_ARG(); /* back track */ break; @@ -1196,6 +1226,15 @@ static int xfrm_selector_upspec_parse(struct xfrm_selector *sel, exit(1); } } + if (grekey) { + switch (sel->proto) { + case IPPROTO_GRE: + break; + default: + fprintf(stderr, "\"key\" is invalid with proto=%s\n", strxf_proto(sel->proto)); + exit(1); + } + } *argcp = argc; *argvp = argv; diff --git a/ip/xfrm_policy.c b/ip/xfrm_policy.c index 121afa1..dcb3da4 100644 --- a/ip/xfrm_policy.c +++ b/ip/xfrm_policy.c @@ -66,7 +66,8 @@ static void usage(void) fprintf(stderr, "SELECTOR := src ADDR[/PLEN] dst ADDR[/PLEN] [ UPSPEC ] [ dev DEV ]\n"); fprintf(stderr, "UPSPEC := proto PROTO [ [ sport PORT ] [ dport PORT ] |\n"); - fprintf(stderr, " [ type NUMBER ] [ code NUMBER ] ]\n"); + fprintf(stderr, " [ type NUMBER ] [ code NUMBER ] |\n"); + fprintf(stderr, " [ key { DOTTED_QUAD | NUMBER } ] ]\n"); //fprintf(stderr, "DEV - device name(default=none)\n"); diff --git a/man/man8/ip.8 b/man/man8/ip.8 index 1a73efa..c1e03f3 100644 --- a/man/man8/ip.8 +++ b/man/man8/ip.8 @@ -547,7 +547,10 @@ throw " | " unreachable " | " prohibit " | " blackhole " | " nat " ]" .RB " [ " type .IR NUMBER " ] " .RB " [ " code -.IR NUMBER " ]] " +.IR NUMBER " ] | " +.br +.RB " [ " key +.IR KEY " ]] " .ti -8 .IR LIMIT-LIST " := [ " LIMIT-LIST " ] |" @@ -642,7 +645,10 @@ throw " | " unreachable " | " prohibit " | " blackhole " | " nat " ]" .RB " [ " type .IR NUMBER " ] " .RB " [ " code -.IR NUMBER " ] ] " +.IR NUMBER " ] | " +.br +.RB " [ " key +.IR KEY " ] ] " .ti -8 .IR ACTION " := " @@ -2487,9 +2493,11 @@ is defined by source port .BR sport ", " destination port .BR dport ", " type -as number and +as number, .B code -also number. +also number and +.BR key +as dotted-quad or number. .TP .BI dev " DEV " @@ -2556,11 +2564,10 @@ and the other choice is .TP .IR UPSPEC is specified by -.BR sport ", " -.BR dport ", " type -and -.B code -(NUMBER). +.BR sport " and " dport " (for UDP/TCP), " +.BR type " and " code " (for ICMP; as number) or " +.BR key " (for GRE; as dotted-quad or number)." +. .SS ip xfrm monitor - is used for listing all objects or defined group of them. The