xfrm_state.c revision c1fa2253241f3cddac3519700549f98d7840b864
1c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger/* $USAGI: $ */ 2c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 3c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger/* 4c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * Copyright (C)2004 USAGI/WIDE Project 5ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger * 6c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * This program is free software; you can redistribute it and/or modify 7c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * it under the terms of the GNU General Public License as published by 8c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * the Free Software Foundation; either version 2 of the License, or 9c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * (at your option) any later version. 10ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger * 11c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * This program is distributed in the hope that it will be useful, 12c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * but WITHOUT ANY WARRANTY; without even the implied warranty of 13c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * GNU General Public License for more details. 15ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger * 16c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * You should have received a copy of the GNU General Public License 17c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * along with this program; if not, write to the Free Software 18c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger */ 20c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger/* 21c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * based on iproute.c 22c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger */ 23c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger/* 24c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * Authors: 25c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * Masahide NAKAMURA @USAGI 26c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger */ 27c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 28c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#include <stdio.h> 29c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#include <stdlib.h> 30c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#include <string.h> 31c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#include <netdb.h> 32c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#include <linux/xfrm.h> 33c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#include "utils.h" 34c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#include "xfrm.h" 35c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#include "ip_common.h" 36c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 379bec1a436335457f3067a17de6ddb913bd95a184shemminger//#define NLMSG_DELETEALL_BUF_SIZE (4096-512) 389bec1a436335457f3067a17de6ddb913bd95a184shemminger#define NLMSG_DELETEALL_BUF_SIZE 8192 39c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 40c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger/* 41c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * Receiving buffer defines: 42c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * nlmsg 43c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * data = struct xfrm_usersa_info 44c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * rtattr 45c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * rtattr 462534613eeba36f2a59a7876dbe1b291c76fcb4damax count of rtattr is XFRM_MAX+ * ... (max count of rtattr is XFRM_MAX+1 47c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * 48c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * each rtattr data = struct xfrm_algo(dynamic size) or xfrm_address_t 49c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger */ 50c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#define NLMSG_BUF_SIZE 4096 51c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#define RTA_BUF_SIZE 2048 52c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#define XFRM_ALGO_KEY_BUF_SIZE 512 53c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 54c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemmingerstatic void usage(void) __attribute__((noreturn)); 55c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 56c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemmingerstatic void usage(void) 57c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger{ 587ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA fprintf(stderr, "Usage: ip xfrm state { add | update } ID [ XFRM_OPT ] [ mode MODE ]\n"); 59fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv fprintf(stderr, " [ reqid REQID ] [ seq SEQ ] [ replay-window SIZE ] [ flag FLAG-LIST ]\n"); 605cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger fprintf(stderr, " [ encap ENCAP ] [ sel SELECTOR ] [ LIMIT-LIST ]\n"); 61fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv fprintf(stderr, "Usage: ip xfrm state allocspi ID [ mode MODE ] [ reqid REQID ] [ seq SEQ ]\n"); 62fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv fprintf(stderr, " [ min SPI max SPI ]\n"); 63c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, "Usage: ip xfrm state { delete | get } ID\n"); 649bec1a436335457f3067a17de6ddb913bd95a184shemminger fprintf(stderr, "Usage: ip xfrm state { deleteall | list } [ ID ] [ mode MODE ] [ reqid REQID ]\n"); 65c1fa2253241f3cddac3519700549f98d7840b864Masahide NAKAMURA fprintf(stderr, " [ flag FLAG-LIST ]\n"); 669bec1a436335457f3067a17de6ddb913bd95a184shemminger fprintf(stderr, "Usage: ip xfrm state flush [ proto XFRM_PROTO ]\n"); 670bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal fprintf(stderr, "Usage: ip xfrm state count \n"); 68c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 69c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, "ID := [ src ADDR ] [ dst ADDR ] [ proto XFRM_PROTO ] [ spi SPI ]\n"); 7029aa4dd76c0c1877d50b2d643eb081d5477ceadforg[shemminger]!nakam //fprintf(stderr, "XFRM_PROTO := [ esp | ah | comp ]\n"); 719e566a46f24fd89e104dea064d5233ab614f490bnet[shemminger]!shemminger fprintf(stderr, "XFRM_PROTO := [ "); 7229aa4dd76c0c1877d50b2d643eb081d5477ceadforg[shemminger]!nakam fprintf(stderr, "%s | ", strxf_xfrmproto(IPPROTO_ESP)); 7329aa4dd76c0c1877d50b2d643eb081d5477ceadforg[shemminger]!nakam fprintf(stderr, "%s | ", strxf_xfrmproto(IPPROTO_AH)); 747ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA fprintf(stderr, "%s | ", strxf_xfrmproto(IPPROTO_COMP)); 757ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA fprintf(stderr, "%s | ", strxf_xfrmproto(IPPROTO_ROUTING)); 767ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA fprintf(stderr, "%s ", strxf_xfrmproto(IPPROTO_DSTOPTS)); 777809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger fprintf(stderr, "]\n"); 789e566a46f24fd89e104dea064d5233ab614f490bnet[shemminger]!shemminger 79c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger //fprintf(stderr, "SPI - security parameter index(default=0)\n"); 80c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 817ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA fprintf(stderr, "MODE := [ transport | tunnel | ro | beet ](default=transport)\n"); 82c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger //fprintf(stderr, "REQID - number(default=0)\n"); 83c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 84eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger fprintf(stderr, "FLAG-LIST := [ FLAG-LIST ] FLAG\n"); 85c1fa2253241f3cddac3519700549f98d7840b864Masahide NAKAMURA fprintf(stderr, "FLAG := [ noecn | decap-dscp | nopmtudisc | wildrecv ]\n"); 86ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger 875cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger fprintf(stderr, "ENCAP := ENCAP-TYPE SPORT DPORT OADDR\n"); 885cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger fprintf(stderr, "ENCAP-TYPE := espinudp | espinudp-nonike\n"); 89c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 907809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger fprintf(stderr, "ALGO-LIST := [ ALGO-LIST ] | [ ALGO ]\n"); 91c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, "ALGO := ALGO_TYPE ALGO_NAME ALGO_KEY\n"); 927809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger fprintf(stderr, "ALGO_TYPE := [ "); 937809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger fprintf(stderr, "%s | ", strxf_algotype(XFRMA_ALG_CRYPT)); 947809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger fprintf(stderr, "%s | ", strxf_algotype(XFRMA_ALG_AUTH)); 957809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger fprintf(stderr, "%s ", strxf_algotype(XFRMA_ALG_COMP)); 967809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger fprintf(stderr, "]\n"); 977809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger 98c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger //fprintf(stderr, "ALGO_NAME - algorithm name\n"); 99c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger //fprintf(stderr, "ALGO_KEY - algorithm key\n"); 100c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 101eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger fprintf(stderr, "SELECTOR := src ADDR[/PLEN] dst ADDR[/PLEN] [ UPSPEC ] [ dev DEV ]\n"); 102c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 103c70b36d231afba1700d6bb4ca1181fd9bb76c77borg[shemminger]!nakam fprintf(stderr, "UPSPEC := proto PROTO [ [ sport PORT ] [ dport PORT ] |\n"); 104c70b36d231afba1700d6bb4ca1181fd9bb76c77borg[shemminger]!nakam fprintf(stderr, " [ type NUMBER ] [ code NUMBER ] ]\n"); 105c70b36d231afba1700d6bb4ca1181fd9bb76c77borg[shemminger]!nakam 106c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 107c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger //fprintf(stderr, "DEV - device name(default=none)\n"); 108c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, "LIMIT-LIST := [ LIMIT-LIST ] | [ limit LIMIT ]\n"); 109c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, "LIMIT := [ [time-soft|time-hard|time-use-soft|time-use-hard] SECONDS ] |\n"); 110c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, " [ [byte-soft|byte-hard] SIZE ] | [ [packet-soft|packet-hard] COUNT ]\n"); 111c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(-1); 112c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger} 113c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 114c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemmingerstatic int xfrm_algo_parse(struct xfrm_algo *alg, enum xfrm_attr_type_t type, 115c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger char *name, char *key, int max) 116c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger{ 117c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger int len; 1187809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger int slen = strlen(key); 119c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 120eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger#if 0 121c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger /* XXX: verifying both name and key is required! */ 122c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, "warning: ALGONAME/ALGOKEY will send to kernel promiscuously!(verifying them isn't implemented yet)\n"); 123c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#endif 124c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 125c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger strncpy(alg->alg_name, name, sizeof(alg->alg_name)); 126c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 1277809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger if (slen > 2 && strncmp(key, "0x", 2) == 0) { 12854f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam /* split two chars "0x" from the top */ 12954f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam char *p = key + 2; 13054f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam int plen = slen - 2; 13154f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam int i; 13254f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam int j; 13354f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam 13454f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam /* Converting hexadecimal numbered string into real key; 13554f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam * Convert each two chars into one char(value). If number 13654f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam * of the length is odd, add zero on the top for rounding. 137c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger */ 1387809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger 13954f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam /* calculate length of the converted values(real key) */ 14054f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam len = (plen + 1) / 2; 14154f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam if (len > max) 14254f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam invarg("\"ALGOKEY\" makes buffer overflow\n", key); 143c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 14454f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam for (i = - (plen % 2), j = 0; j < len; i += 2, j++) { 14554f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam char vbuf[3]; 146737f15f6da0ed7512220f6fa5244a39777de4e0dshemminger __u8 val; 147c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 14854f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam vbuf[0] = i >= 0 ? p[i] : '0'; 14954f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam vbuf[1] = p[i + 1]; 15054f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam vbuf[2] = '\0'; 151c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 15254f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam if (get_u8(&val, vbuf, 16)) 15354f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam invarg("\"ALGOKEY\" is invalid", key); 1547809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger 15554f7328aecfb8421b0e9ca180324aed135e780deorg[shemminger]!nakam alg->alg_key[j] = val; 156c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 157c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } else { 1587809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger len = slen; 159c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (len > 0) { 160c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (len > max) 161c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger invarg("\"ALGOKEY\" makes buffer overflow\n", key); 162c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 163c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger strncpy(alg->alg_key, key, len); 164c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 165c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 166c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 167c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger alg->alg_key_len = len * 8; 168c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 169c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 170c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger} 171c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 172fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipvstatic int xfrm_seq_parse(__u32 *seq, int *argcp, char ***argvp) 173fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv{ 174fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv int argc = *argcp; 175fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv char **argv = *argvp; 176fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 177fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (get_u32(seq, *argv, 0)) 178fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv invarg("\"SEQ\" is invalid", *argv); 179fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 180fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv *seq = htonl(*seq); 181fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 182fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv *argcp = argc; 183fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv *argvp = argv; 184fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 185fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv return 0; 186fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv} 187fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 188c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemmingerstatic int xfrm_state_flag_parse(__u8 *flags, int *argcp, char ***argvp) 189c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger{ 190c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger int argc = *argcp; 191c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger char **argv = *argvp; 1929e566a46f24fd89e104dea064d5233ab614f490bnet[shemminger]!shemminger int len = strlen(*argv); 1939e566a46f24fd89e104dea064d5233ab614f490bnet[shemminger]!shemminger 1949e566a46f24fd89e104dea064d5233ab614f490bnet[shemminger]!shemminger if (len > 2 && strncmp(*argv, "0x", 2) == 0) { 1959e566a46f24fd89e104dea064d5233ab614f490bnet[shemminger]!shemminger __u8 val = 0; 196c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 1979e566a46f24fd89e104dea064d5233ab614f490bnet[shemminger]!shemminger if (get_u8(&val, *argv, 16)) 1989e566a46f24fd89e104dea064d5233ab614f490bnet[shemminger]!shemminger invarg("\"FLAG\" is invalid", *argv); 1999e566a46f24fd89e104dea064d5233ab614f490bnet[shemminger]!shemminger *flags = val; 2009e566a46f24fd89e104dea064d5233ab614f490bnet[shemminger]!shemminger } else { 201eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger while (1) { 202eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger if (strcmp(*argv, "noecn") == 0) 203eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger *flags |= XFRM_STATE_NOECN; 204eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger else if (strcmp(*argv, "decap-dscp") == 0) 205eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger *flags |= XFRM_STATE_DECAP_DSCP; 206c1fa2253241f3cddac3519700549f98d7840b864Masahide NAKAMURA else if (strcmp(*argv, "nopmtudisc") == 0) 207c1fa2253241f3cddac3519700549f98d7840b864Masahide NAKAMURA *flags |= XFRM_STATE_NOPMTUDISC; 2087ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA else if (strcmp(*argv, "wildrecv") == 0) 2097ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA *flags |= XFRM_STATE_WILDRECV; 210eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger else { 211eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger PREV_ARG(); /* back track */ 212eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger break; 213eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger } 214eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger 215eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger if (!NEXT_ARG_OK()) 216eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger break; 217eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger NEXT_ARG(); 218eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger } 2199e566a46f24fd89e104dea064d5233ab614f490bnet[shemminger]!shemminger } 220c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 221c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger *argcp = argc; 222c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger *argvp = argv; 223c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 224c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 225c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger} 226c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 227c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemmingerstatic int xfrm_state_modify(int cmd, unsigned flags, int argc, char **argv) 228c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger{ 229c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct rtnl_handle rth; 230c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct { 231c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct nlmsghdr n; 232c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct xfrm_usersa_info xsinfo; 233c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger char buf[RTA_BUF_SIZE]; 234c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } req; 235c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger char *idp = NULL; 236c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger char *ealgop = NULL; 237c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger char *aalgop = NULL; 238c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger char *calgop = NULL; 2397ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA char *coap = NULL; 240c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 241c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger memset(&req, 0, sizeof(req)); 242c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 243c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xsinfo)); 244c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.n.nlmsg_flags = NLM_F_REQUEST|flags; 245c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.n.nlmsg_type = cmd; 246c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.xsinfo.family = preferred_family; 247c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 248c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.xsinfo.lft.soft_byte_limit = XFRM_INF; 249c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.xsinfo.lft.hard_byte_limit = XFRM_INF; 250c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.xsinfo.lft.soft_packet_limit = XFRM_INF; 251c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.xsinfo.lft.hard_packet_limit = XFRM_INF; 252c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 253c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger while (argc > 0) { 2547809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger if (strcmp(*argv, "mode") == 0) { 255c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger NEXT_ARG(); 256c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xfrm_mode_parse(&req.xsinfo.mode, &argc, &argv); 257c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } else if (strcmp(*argv, "reqid") == 0) { 258c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger NEXT_ARG(); 259c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xfrm_reqid_parse(&req.xsinfo.reqid, &argc, &argv); 260fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } else if (strcmp(*argv, "seq") == 0) { 261fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv NEXT_ARG(); 262fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv xfrm_seq_parse(&req.xsinfo.seq, &argc, &argv); 263eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger } else if (strcmp(*argv, "replay-window") == 0) { 264eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger NEXT_ARG(); 265eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger if (get_u8(&req.xsinfo.replay_window, *argv, 0)) 266eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger invarg("\"replay-window\" value is invalid", *argv); 267c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } else if (strcmp(*argv, "flag") == 0) { 268c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger NEXT_ARG(); 269c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xfrm_state_flag_parse(&req.xsinfo.flags, &argc, &argv); 270c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } else if (strcmp(*argv, "sel") == 0) { 271c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger NEXT_ARG(); 272c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xfrm_selector_parse(&req.xsinfo.sel, &argc, &argv); 273c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } else if (strcmp(*argv, "limit") == 0) { 274c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger NEXT_ARG(); 275c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xfrm_lifetime_cfg_parse(&req.xsinfo.lft, &argc, &argv); 2765cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger } else if (strcmp(*argv, "encap") == 0) { 2775cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger struct xfrm_encap_tmpl encap; 2785cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger inet_prefix oa; 2795cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger NEXT_ARG(); 2805cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger xfrm_encap_type_parse(&encap.encap_type, &argc, &argv); 2815cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger NEXT_ARG(); 2825cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger if (get_u16(&encap.encap_sport, *argv, 0)) 2835cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger invarg("\"encap\" sport value is invalid", *argv); 2845cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger encap.encap_sport = htons(encap.encap_sport); 2855cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger NEXT_ARG(); 2865cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger if (get_u16(&encap.encap_dport, *argv, 0)) 2875cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger invarg("\"encap\" dport value is invalid", *argv); 2885cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger encap.encap_dport = htons(encap.encap_dport); 2895cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger NEXT_ARG(); 2905cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger get_addr(&oa, *argv, AF_UNSPEC); 2915cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger memcpy(&encap.encap_oa, &oa.data, sizeof(encap.encap_oa)); 2925cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger addattr_l(&req.n, sizeof(req.buf), XFRMA_ENCAP, 2935cf576d928c515ce8dea2500154a291477ce38baosdl.net!shemminger (void *)&encap, sizeof(encap)); 2947ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA } else if (strcmp(*argv, "coa") == 0) { 2957ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA inet_prefix coa; 2967ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA xfrm_address_t xcoa; 2977ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA 2987ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA if (coap) 2997ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA duparg("coa", *argv); 3007ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA coap = *argv; 3017ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA 3027ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA NEXT_ARG(); 3037ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA 3047ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA get_prefix(&coa, *argv, preferred_family); 3057ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA if (coa.family == AF_UNSPEC) 3067ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA invarg("\"coa\" address family is AF_UNSPEC", *argv); 3077ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA if (coa.bytelen > sizeof(xcoa)) 3087ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA invarg("\"coa\" address length is too large", *argv); 3097ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA 3107ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA memset(&xcoa, 0, sizeof(xcoa)); 3117ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA memcpy(&xcoa, &coa.data, coa.bytelen); 3127ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA 3137ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA addattr_l(&req.n, sizeof(req.buf), XFRMA_COADDR, 3147ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA (void *)&xcoa, sizeof(xcoa)); 315c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } else { 3167809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger /* try to assume ALGO */ 3177809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger int type = xfrm_algotype_getbyname(*argv); 3187809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger switch (type) { 3197809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger case XFRMA_ALG_CRYPT: 3207809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger case XFRMA_ALG_AUTH: 3217809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger case XFRMA_ALG_COMP: 3227809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger { 3237809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger /* ALGO */ 3247809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger struct { 3257809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger struct xfrm_algo alg; 3267809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger char buf[XFRM_ALGO_KEY_BUF_SIZE]; 3277809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger } alg; 3287809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger int len; 3297809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger char *name; 3307809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger char *key; 3317809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger 3327809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger switch (type) { 3337809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger case XFRMA_ALG_CRYPT: 3347809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger if (ealgop) 3357809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger duparg("ALGOTYPE", *argv); 3367809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger ealgop = *argv; 3377809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger break; 3387809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger case XFRMA_ALG_AUTH: 3397809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger if (aalgop) 3407809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger duparg("ALGOTYPE", *argv); 3417809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger aalgop = *argv; 3427809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger break; 3437809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger case XFRMA_ALG_COMP: 3447809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger if (calgop) 3457809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger duparg("ALGOTYPE", *argv); 3467809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger calgop = *argv; 3477809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger break; 3487809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger default: 3497809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger /* not reached */ 3507809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger invarg("\"ALGOTYPE\" is invalid\n", *argv); 3517809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger } 3527809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger 3537809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger if (!NEXT_ARG_OK()) 3547809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger missarg("ALGONAME"); 3557809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger NEXT_ARG(); 3567809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger name = *argv; 3577809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger 3587809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger if (!NEXT_ARG_OK()) 3597809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger missarg("ALGOKEY"); 3607809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger NEXT_ARG(); 3617809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger key = *argv; 3627809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger 3637809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger memset(&alg, 0, sizeof(alg)); 3647809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger 3657809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger xfrm_algo_parse((void *)&alg, type, name, key, 3667809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger sizeof(alg.buf)); 3677809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger len = sizeof(struct xfrm_algo) + alg.alg.alg_key_len; 3687809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger 3697809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger addattr_l(&req.n, sizeof(req.buf), type, 3707809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger (void *)&alg, len); 3717809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger break; 3727809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger } 3737809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger default: 3747809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger /* try to assume ID */ 3757809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger if (idp) 3767809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger invarg("unknown", *argv); 3777809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger idp = *argv; 3787809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger 3797809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger /* ID */ 3807809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger xfrm_id_parse(&req.xsinfo.saddr, &req.xsinfo.id, 3817809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger &req.xsinfo.family, 0, &argc, &argv); 3827809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger if (preferred_family == AF_UNSPEC) 3837809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger preferred_family = req.xsinfo.family; 3847809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger } 385c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 386c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger argc--; argv++; 387c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 388c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 389c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (!idp) { 390c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, "Not enough information: \"ID\" is required\n"); 391c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(1); 392c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 393c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 3947ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA switch (req.xsinfo.mode) { 3957ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA case XFRM_MODE_TRANSPORT: 3967ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA case XFRM_MODE_TUNNEL: 3977ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA if (!xfrm_xfrmproto_is_ipsec(req.xsinfo.id.proto)) { 3987ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA fprintf(stderr, "\"mode\" is invalid with proto=%s\n", 3997ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA strxf_xfrmproto(req.xsinfo.id.proto)); 4007ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA exit(1); 4017ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA } 4027ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA break; 4037ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA case XFRM_MODE_ROUTEOPTIMIZATION: 4047ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA case XFRM_MODE_IN_TRIGGER: 4057ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA if (!xfrm_xfrmproto_is_ro(req.xsinfo.id.proto)) { 4067ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA fprintf(stderr, "\"mode\" is invalid with proto=%s\n", 4077ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA strxf_xfrmproto(req.xsinfo.id.proto)); 4087ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA exit(1); 4097ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA } 4107ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA if (req.xsinfo.id.spi != 0) { 4117ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA fprintf(stderr, "\"spi\" must be 0 with proto=%s\n", 4127ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA strxf_xfrmproto(req.xsinfo.id.proto)); 4137ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA exit(1); 4147ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA } 4157ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA break; 4167ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA default: 4177ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA break; 4187ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA } 4197ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA 420c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (ealgop || aalgop || calgop) { 4217ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA if (!xfrm_xfrmproto_is_ipsec(req.xsinfo.id.proto)) { 4227ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA fprintf(stderr, "\"ALGO\" is invalid with proto=%s\n", 4237ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA strxf_xfrmproto(req.xsinfo.id.proto)); 4247ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA exit(1); 4257ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA } 4267ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA } else { 4277ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA if (xfrm_xfrmproto_is_ipsec(req.xsinfo.id.proto)) { 4287ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA fprintf(stderr, "\"ALGO\" is required with proto=%s\n", 4297ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA strxf_xfrmproto(req.xsinfo.id.proto)); 4307ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA exit (1); 4317ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA } 4327ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA } 4337ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA 4347ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA if (coap) { 4357ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA if (!xfrm_xfrmproto_is_ro(req.xsinfo.id.proto)) { 4367ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA fprintf(stderr, "\"coa\" is invalid with proto=%s\n", 4377ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA strxf_xfrmproto(req.xsinfo.id.proto)); 438c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(1); 439c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 440c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } else { 4417ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA if (xfrm_xfrmproto_is_ro(req.xsinfo.id.proto)) { 4427ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA fprintf(stderr, "\"coa\" is required with proto=%s\n", 4437ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA strxf_xfrmproto(req.xsinfo.id.proto)); 444c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit (1); 445c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 446c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 447c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 448c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0) 449c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(1); 450c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 451c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (req.xsinfo.family == AF_UNSPEC) 452c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.xsinfo.family = AF_INET; 453c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 454c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL) < 0) 455c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(2); 456c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 457c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger rtnl_close(&rth); 458c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 459c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 460c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger} 461c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 462fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipvstatic int xfrm_state_allocspi(int argc, char **argv) 463fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv{ 464fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv struct rtnl_handle rth; 465fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv struct { 466fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv struct nlmsghdr n; 467fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv struct xfrm_userspi_info xspi; 468fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv char buf[RTA_BUF_SIZE]; 469fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } req; 470fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv char *idp = NULL; 471fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv char *minp = NULL; 472fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv char *maxp = NULL; 473fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv char res_buf[NLMSG_BUF_SIZE]; 474fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv struct nlmsghdr *res_n = (struct nlmsghdr *)res_buf; 475fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 476fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv memset(res_buf, 0, sizeof(res_buf)); 477fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 478fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv memset(&req, 0, sizeof(req)); 479fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 480fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv req.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xspi)); 481fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv req.n.nlmsg_flags = NLM_F_REQUEST; 482fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv req.n.nlmsg_type = XFRM_MSG_ALLOCSPI; 483fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv req.xspi.info.family = preferred_family; 484fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 485fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv#if 0 486fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv req.xsinfo.lft.soft_byte_limit = XFRM_INF; 487fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv req.xsinfo.lft.hard_byte_limit = XFRM_INF; 488fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv req.xsinfo.lft.soft_packet_limit = XFRM_INF; 489fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv req.xsinfo.lft.hard_packet_limit = XFRM_INF; 490fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv#endif 491fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 492fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv while (argc > 0) { 493fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (strcmp(*argv, "mode") == 0) { 494fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv NEXT_ARG(); 495fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv xfrm_mode_parse(&req.xspi.info.mode, &argc, &argv); 496fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } else if (strcmp(*argv, "reqid") == 0) { 497fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv NEXT_ARG(); 498fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv xfrm_reqid_parse(&req.xspi.info.reqid, &argc, &argv); 499fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } else if (strcmp(*argv, "seq") == 0) { 500fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv NEXT_ARG(); 501fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv xfrm_seq_parse(&req.xspi.info.seq, &argc, &argv); 502fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } else if (strcmp(*argv, "min") == 0) { 503fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (minp) 504fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv duparg("min", *argv); 505fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv minp = *argv; 506fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 507fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv NEXT_ARG(); 508fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 509fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (get_u32(&req.xspi.min, *argv, 0)) 510fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv invarg("\"min\" value is invalid", *argv); 511fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } else if (strcmp(*argv, "max") == 0) { 512fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (maxp) 513fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv duparg("max", *argv); 514fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv maxp = *argv; 515fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 516fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv NEXT_ARG(); 517fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 518fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (get_u32(&req.xspi.max, *argv, 0)) 519fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv invarg("\"max\" value is invalid", *argv); 520fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } else { 521fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv /* try to assume ID */ 522fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (idp) 523fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv invarg("unknown", *argv); 524fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv idp = *argv; 525fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 526fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv /* ID */ 527fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv xfrm_id_parse(&req.xspi.info.saddr, &req.xspi.info.id, 528fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv &req.xspi.info.family, 0, &argc, &argv); 529fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (req.xspi.info.id.spi) { 530fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv fprintf(stderr, "\"SPI\" must be zero\n"); 531fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv exit(1); 532fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } 533fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (preferred_family == AF_UNSPEC) 534fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv preferred_family = req.xspi.info.family; 535fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } 536fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv argc--; argv++; 537fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } 538fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 539fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (!idp) { 540fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv fprintf(stderr, "Not enough information: \"ID\" is required\n"); 541fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv exit(1); 542fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } 543fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 544fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (minp) { 545fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (!maxp) { 546fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv fprintf(stderr, "\"max\" is missing\n"); 547fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv exit(1); 548fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } 549fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (req.xspi.min > req.xspi.max) { 550fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv fprintf(stderr, "\"min\" valie is larger than \"max\" one\n"); 551fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv exit(1); 552fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } 553fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } else { 554fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (maxp) { 555fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv fprintf(stderr, "\"min\" is missing\n"); 556fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv exit(1); 557fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } 558fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 559fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv /* XXX: Default value defined in PF_KEY; 560fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv * See kernel's net/key/af_key.c(pfkey_getspi). 561fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv */ 562fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv req.xspi.min = 0x100; 563fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv req.xspi.max = 0x0fffffff; 564fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 565fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv /* XXX: IPCOMP spi is 16-bits; 566fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv * See kernel's net/xfrm/xfrm_user(verify_userspi_info). 567fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv */ 568fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (req.xspi.info.id.proto == IPPROTO_COMP) 569fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv req.xspi.max = 0xffff; 570fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } 571fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 572fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0) 573fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv exit(1); 574fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 575fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (req.xspi.info.family == AF_UNSPEC) 576fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv req.xspi.info.family = AF_INET; 577fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 578fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 579fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (rtnl_talk(&rth, &req.n, 0, 0, res_n, NULL, NULL) < 0) 580fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv exit(2); 581fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 582fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (xfrm_state_print(NULL, res_n, (void*)stdout) < 0) { 583fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv fprintf(stderr, "An error :-)\n"); 584fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv exit(1); 585fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv } 586fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 587fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv rtnl_close(&rth); 588fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 589fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv return 0; 590fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv} 591fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv 592c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemmingerstatic int xfrm_state_filter_match(struct xfrm_usersa_info *xsinfo) 593c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger{ 594c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (!filter.use) 595c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 1; 596c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 597c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (filter.id_src_mask) 598eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger if (xfrm_addr_match(&xsinfo->saddr, &filter.xsinfo.saddr, 599eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger filter.id_src_mask)) 600c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 601c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (filter.id_dst_mask) 602eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger if (xfrm_addr_match(&xsinfo->id.daddr, &filter.xsinfo.id.daddr, 603eaa34ee35d6b801cabb96aafce2ca410e3f5b31dnet[shemminger]!shemminger filter.id_dst_mask)) 604c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 605c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if ((xsinfo->id.proto^filter.xsinfo.id.proto)&filter.id_proto_mask) 606c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 607c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if ((xsinfo->id.spi^filter.xsinfo.id.spi)&filter.id_spi_mask) 608c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 609c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if ((xsinfo->mode^filter.xsinfo.mode)&filter.mode_mask) 610c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 611c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if ((xsinfo->reqid^filter.xsinfo.reqid)&filter.reqid_mask) 612c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 613c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (filter.state_flags_mask) 614c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if ((xsinfo->flags & filter.xsinfo.flags) == 0) 615c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 616c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 617c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 1; 618c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger} 619c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 620fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipvint xfrm_state_print(const struct sockaddr_nl *who, struct nlmsghdr *n, 621fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv void *arg) 622c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger{ 623c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger FILE *fp = (FILE*)arg; 624c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct rtattr * tb[XFRMA_MAX+1]; 62590f93024a0818dc691138d8401721e797004b042shemminger struct rtattr * rta; 626c595c790a08366db90654c01aba02a1bd97d73e2shemminger struct xfrm_usersa_info *xsinfo = NULL; 627c595c790a08366db90654c01aba02a1bd97d73e2shemminger struct xfrm_user_expire *xexp = NULL; 628c595c790a08366db90654c01aba02a1bd97d73e2shemminger struct xfrm_usersa_id *xsid = NULL; 629c595c790a08366db90654c01aba02a1bd97d73e2shemminger int len = n->nlmsg_len; 630c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 631c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (n->nlmsg_type != XFRM_MSG_NEWSA && 63290f93024a0818dc691138d8401721e797004b042shemminger n->nlmsg_type != XFRM_MSG_DELSA && 633669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger n->nlmsg_type != XFRM_MSG_UPDSA && 63490f93024a0818dc691138d8401721e797004b042shemminger n->nlmsg_type != XFRM_MSG_EXPIRE) { 635c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, "Not a state: %08x %08x %08x\n", 636c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger n->nlmsg_len, n->nlmsg_type, n->nlmsg_flags); 637c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 638c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 639c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 640669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger if (n->nlmsg_type == XFRM_MSG_DELSA) { 641669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger /* Dont blame me for this .. Herbert made me do it */ 642669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger xsid = NLMSG_DATA(n); 643af1b6a41d4c7ed8aab98cfdcdafd55ec6c638b07Andy Gay len -= NLMSG_SPACE(sizeof(*xsid)); 644669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger } else if (n->nlmsg_type == XFRM_MSG_EXPIRE) { 64590f93024a0818dc691138d8401721e797004b042shemminger xexp = NLMSG_DATA(n); 64690f93024a0818dc691138d8401721e797004b042shemminger xsinfo = &xexp->state; 647af1b6a41d4c7ed8aab98cfdcdafd55ec6c638b07Andy Gay len -= NLMSG_SPACE(sizeof(*xexp)); 64890f93024a0818dc691138d8401721e797004b042shemminger } else { 64990f93024a0818dc691138d8401721e797004b042shemminger xexp = NULL; 65090f93024a0818dc691138d8401721e797004b042shemminger xsinfo = NLMSG_DATA(n); 651af1b6a41d4c7ed8aab98cfdcdafd55ec6c638b07Andy Gay len -= NLMSG_SPACE(sizeof(*xsinfo)); 65290f93024a0818dc691138d8401721e797004b042shemminger } 65390f93024a0818dc691138d8401721e797004b042shemminger 654c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (len < 0) { 655c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, "BUG: wrong nlmsg len %d\n", len); 656c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return -1; 657c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 658c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 659669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger if (xsinfo && !xfrm_state_filter_match(xsinfo)) 660c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 661c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 662669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger if (n->nlmsg_type == XFRM_MSG_DELSA) 663c595c790a08366db90654c01aba02a1bd97d73e2shemminger fprintf(fp, "Deleted "); 664669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger else if (n->nlmsg_type == XFRM_MSG_UPDSA) 665669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger fprintf(fp, "Updated "); 666c595c790a08366db90654c01aba02a1bd97d73e2shemminger else if (n->nlmsg_type == XFRM_MSG_EXPIRE) 667c595c790a08366db90654c01aba02a1bd97d73e2shemminger fprintf(fp, "Expired "); 668c595c790a08366db90654c01aba02a1bd97d73e2shemminger 669669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger if (n->nlmsg_type == XFRM_MSG_DELSA) 670669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger rta = XFRMSID_RTA(xsid); 671669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger else if (n->nlmsg_type == XFRM_MSG_EXPIRE) 67290f93024a0818dc691138d8401721e797004b042shemminger rta = XFRMEXP_RTA(xexp); 673ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger else 67490f93024a0818dc691138d8401721e797004b042shemminger rta = XFRMS_RTA(xsinfo); 67590f93024a0818dc691138d8401721e797004b042shemminger 67690f93024a0818dc691138d8401721e797004b042shemminger parse_rtattr(tb, XFRMA_MAX, rta, len); 677c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 678c595c790a08366db90654c01aba02a1bd97d73e2shemminger if (n->nlmsg_type == XFRM_MSG_DELSA) { 679669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger //xfrm_policy_id_print(); 680669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger 681669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger if (!tb[XFRMA_SA]) { 682669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger fprintf(stderr, "Buggy XFRM_MSG_DELSA: no XFRMA_SA\n"); 683669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger return -1; 684669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger } 685669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger if (RTA_PAYLOAD(tb[XFRMA_SA]) < sizeof(*xsinfo)) { 686669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger fprintf(stderr, "Buggy XFRM_MSG_DELPOLICY: too short XFRMA_POLICY len\n"); 687669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger return -1; 688c595c790a08366db90654c01aba02a1bd97d73e2shemminger } 689bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger xsinfo = RTA_DATA(tb[XFRMA_SA]); 690c595c790a08366db90654c01aba02a1bd97d73e2shemminger } 691c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 692fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv xfrm_state_info_print(xsinfo, tb, fp, NULL, NULL); 693c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 69490f93024a0818dc691138d8401721e797004b042shemminger if (n->nlmsg_type == XFRM_MSG_EXPIRE) { 69590f93024a0818dc691138d8401721e797004b042shemminger fprintf(fp, "\t"); 69690f93024a0818dc691138d8401721e797004b042shemminger fprintf(fp, "hard %u", xexp->hard); 69790f93024a0818dc691138d8401721e797004b042shemminger fprintf(fp, "%s", _SL_); 69890f93024a0818dc691138d8401721e797004b042shemminger } 69990f93024a0818dc691138d8401721e797004b042shemminger 7007809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger if (oneline) 7017809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger fprintf(fp, "\n"); 702669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger fflush(fp); 7037809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger 704c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 705c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger} 706c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 707c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemmingerstatic int xfrm_state_get_or_delete(int argc, char **argv, int delete) 708c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger{ 709c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct rtnl_handle rth; 710c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct { 711c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct nlmsghdr n; 712c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct xfrm_usersa_id xsid; 7137ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA char buf[RTA_BUF_SIZE]; 714c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } req; 715c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct xfrm_id id; 716c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger char *idp = NULL; 717c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 718c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger memset(&req, 0, sizeof(req)); 719c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 720c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xsid)); 721c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.n.nlmsg_flags = NLM_F_REQUEST; 722c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.n.nlmsg_type = delete ? XFRM_MSG_DELSA : XFRM_MSG_GETSA; 723c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.xsid.family = preferred_family; 724c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 725c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger while (argc > 0) { 7267ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA xfrm_address_t saddr; 727c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 728c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (idp) 729c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger invarg("unknown", *argv); 730c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger idp = *argv; 731c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 732c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger /* ID */ 733c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger memset(&id, 0, sizeof(id)); 7347ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA memset(&saddr, 0, sizeof(saddr)); 7357ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA xfrm_id_parse(&saddr, &id, &req.xsid.family, 0, 736c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger &argc, &argv); 737c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 738c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger memcpy(&req.xsid.daddr, &id.daddr, sizeof(req.xsid.daddr)); 739c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.xsid.spi = id.spi; 740c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.xsid.proto = id.proto; 741c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 7427ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA addattr_l(&req.n, sizeof(req.buf), XFRMA_SRCADDR, 7437ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA (void *)&saddr, sizeof(saddr)); 7447ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA 745c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger argc--; argv++; 746c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 747c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 748c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0) 749c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(1); 750c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 751c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (req.xsid.family == AF_UNSPEC) 752c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger req.xsid.family = AF_INET; 753c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 754c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (delete) { 755c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL) < 0) 756c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(2); 757c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } else { 758c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger char buf[NLMSG_BUF_SIZE]; 759c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct nlmsghdr *res_n = (struct nlmsghdr *)buf; 760c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 761c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger memset(buf, 0, sizeof(buf)); 762c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 763c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (rtnl_talk(&rth, &req.n, 0, 0, res_n, NULL, NULL) < 0) 764c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(2); 765c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 766c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (xfrm_state_print(NULL, res_n, (void*)stdout) < 0) { 767c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, "An error :-)\n"); 768c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(1); 769c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 770c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 771c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 772c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger rtnl_close(&rth); 773c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 774c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 775c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger} 776c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 777c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger/* 778c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * With an existing state of nlmsg, make new nlmsg for deleting the state 779c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger * and store it to buffer. 780c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger */ 7816dc9f016347441fbf94cf851c054b0f45ba32c1cosdl.net!shemmingerstatic int xfrm_state_keep(const struct sockaddr_nl *who, 78250772dc51ac02239958e1ebcdb21277fcdf133a7osdl.net!shemminger struct nlmsghdr *n, 7836dc9f016347441fbf94cf851c054b0f45ba32c1cosdl.net!shemminger void *arg) 784c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger{ 785c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct xfrm_buffer *xb = (struct xfrm_buffer *)arg; 786c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct rtnl_handle *rth = xb->rth; 787c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct xfrm_usersa_info *xsinfo = NLMSG_DATA(n); 788c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger int len = n->nlmsg_len; 789c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct nlmsghdr *new_n; 790c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct xfrm_usersa_id *xsid; 791c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 792c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (n->nlmsg_type != XFRM_MSG_NEWSA) { 793c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, "Not a state: %08x %08x %08x\n", 794c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger n->nlmsg_len, n->nlmsg_type, n->nlmsg_flags); 795c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 796c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 797c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 798c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger len -= NLMSG_LENGTH(sizeof(*xsinfo)); 799c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (len < 0) { 800c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, "BUG: wrong nlmsg len %d\n", len); 801c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return -1; 802c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 803c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 804c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (!xfrm_state_filter_match(xsinfo)) 805c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 806c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 807c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (xb->offset > xb->size) { 8089bec1a436335457f3067a17de6ddb913bd95a184shemminger fprintf(stderr, "State buffer overflow\n"); 809c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return -1; 810c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 811c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 812c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger new_n = (struct nlmsghdr *)(xb->buf + xb->offset); 813c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger new_n->nlmsg_len = NLMSG_LENGTH(sizeof(*xsid)); 814c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger new_n->nlmsg_flags = NLM_F_REQUEST; 815c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger new_n->nlmsg_type = XFRM_MSG_DELSA; 816c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger new_n->nlmsg_seq = ++rth->seq; 817c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 818c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xsid = NLMSG_DATA(new_n); 819c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xsid->family = xsinfo->family; 820c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger memcpy(&xsid->daddr, &xsinfo->id.daddr, sizeof(xsid->daddr)); 821c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xsid->spi = xsinfo->id.spi; 822c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xsid->proto = xsinfo->id.proto; 823c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 8247ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA addattr_l(new_n, xb->size, XFRMA_SRCADDR, &xsinfo->saddr, 8257ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA sizeof(xsid->daddr)); 8267ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA 827c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xb->offset += new_n->nlmsg_len; 828c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xb->nlmsg_count ++; 829c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 830c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return 0; 831c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger} 832c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 8339bec1a436335457f3067a17de6ddb913bd95a184shemmingerstatic int xfrm_state_list_or_deleteall(int argc, char **argv, int deleteall) 834c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger{ 835c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger char *idp = NULL; 836c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct rtnl_handle rth; 837c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 838bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam if(argc > 0) 839bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam filter.use = 1; 840c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger filter.xsinfo.family = preferred_family; 841c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 842c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger while (argc > 0) { 843c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (strcmp(*argv, "mode") == 0) { 844c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger NEXT_ARG(); 845c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xfrm_mode_parse(&filter.xsinfo.mode, &argc, &argv); 846c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 847c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger filter.mode_mask = XFRM_FILTER_MASK_FULL; 848c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 849c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } else if (strcmp(*argv, "reqid") == 0) { 850c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger NEXT_ARG(); 851c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xfrm_reqid_parse(&filter.xsinfo.reqid, &argc, &argv); 852c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 853c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger filter.reqid_mask = XFRM_FILTER_MASK_FULL; 854c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 855c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } else if (strcmp(*argv, "flag") == 0) { 856c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger NEXT_ARG(); 857c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xfrm_state_flag_parse(&filter.xsinfo.flags, &argc, &argv); 858c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 859c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger filter.state_flags_mask = XFRM_FILTER_MASK_FULL; 860c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 861c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } else { 862c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (idp) 863c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger invarg("unknown", *argv); 864c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger idp = *argv; 865c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 866c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger /* ID */ 8677809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger xfrm_id_parse(&filter.xsinfo.saddr, &filter.xsinfo.id, 8687809c61688c4a30799a07c727616887e5c885ab8net[shemminger]!shemminger &filter.xsinfo.family, 1, &argc, &argv); 869c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (preferred_family == AF_UNSPEC) 870c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger preferred_family = filter.xsinfo.family; 871c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 872c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger argc--; argv++; 873c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 874c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 875c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0) 876c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(1); 877c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 8789bec1a436335457f3067a17de6ddb913bd95a184shemminger if (deleteall) { 879c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger struct xfrm_buffer xb; 8809bec1a436335457f3067a17de6ddb913bd95a184shemminger char buf[NLMSG_DELETEALL_BUF_SIZE]; 881c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger int i; 882c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 883c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xb.buf = buf; 884c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xb.size = sizeof(buf); 885c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xb.rth = &rth; 886c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 887c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger for (i = 0; ; i++) { 888c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xb.offset = 0; 889c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xb.nlmsg_count = 0; 890c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 891c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (show_stats > 1) 8929bec1a436335457f3067a17de6ddb913bd95a184shemminger fprintf(stderr, "Delete-all round = %d\n", i); 893c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 894c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (rtnl_wilddump_request(&rth, preferred_family, XFRM_MSG_GETSA) < 0) { 895c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger perror("Cannot send dump request"); 896c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(1); 897c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 898c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 899c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (rtnl_dump_filter(&rth, xfrm_state_keep, &xb, NULL, NULL) < 0) { 9009bec1a436335457f3067a17de6ddb913bd95a184shemminger fprintf(stderr, "Delete-all terminated\n"); 901c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(1); 902c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 903c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (xb.nlmsg_count == 0) { 904c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (show_stats > 1) 9059bec1a436335457f3067a17de6ddb913bd95a184shemminger fprintf(stderr, "Delete-all completed\n"); 906c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger break; 907c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 908c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 909c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (rtnl_send(&rth, xb.buf, xb.offset) < 0) { 9109bec1a436335457f3067a17de6ddb913bd95a184shemminger perror("Failed to send delete-all request\n"); 911c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(1); 912c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 913c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (show_stats > 1) 9149bec1a436335457f3067a17de6ddb913bd95a184shemminger fprintf(stderr, "Delete-all nlmsg count = %d\n", xb.nlmsg_count); 915c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 916c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xb.offset = 0; 917c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger xb.nlmsg_count = 0; 918c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 919c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 920c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } else { 921c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (rtnl_wilddump_request(&rth, preferred_family, XFRM_MSG_GETSA) < 0) { 922c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger perror("Cannot send dump request"); 923c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(1); 924c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 925c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 926c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (rtnl_dump_filter(&rth, xfrm_state_print, stdout, NULL, NULL) < 0) { 927c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, "Dump terminated\n"); 928c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(1); 929c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 930c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger } 931c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 932c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger rtnl_close(&rth); 933c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 934c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(0); 935c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger} 936c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 9370bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamalint print_sadinfo(struct nlmsghdr *n, void *arg) 9380bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal{ 9390bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal FILE *fp = (FILE*)arg; 9400bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal __u32 *f = NLMSG_DATA(n); 9410bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal struct rtattr *tb[XFRMA_SAD_MAX+1]; 9420bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal struct rtattr *rta; 9430bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal __u32 *cnt; 9440bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 9450bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal int len = n->nlmsg_len; 9460bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 9470bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal len -= NLMSG_LENGTH(sizeof(__u32)); 9480bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal if (len < 0) { 9490bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal fprintf(stderr, "SADinfo: Wrong len %d\n", len); 9500bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal return -1; 9510bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal } 9520bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 9530bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal rta = XFRMSAPD_RTA(f); 9540bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal parse_rtattr(tb, XFRMA_SAD_MAX, rta, len); 9550bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 956bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger if (tb[XFRMA_SAD_CNT]) { 9570bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal fprintf(fp,"\t SAD"); 958bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger cnt = (__u32 *)RTA_DATA(tb[XFRMA_SAD_CNT]); 9590bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal fprintf(fp," count %d", *cnt); 9600bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal } else { 9610bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal fprintf(fp,"BAD SAD info returned\n"); 9620bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal return -1; 9630bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal } 9640bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 9650bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal if (show_stats) { 966bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger if (tb[XFRMA_SAD_HINFO]) { 967bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger struct xfrmu_sadhinfo *si; 9680bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 969bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger if (RTA_PAYLOAD(tb[XFRMA_SAD_HINFO]) < sizeof(*si)) { 970bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger fprintf(fp,"BAD SAD length returned\n"); 971bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger return -1; 972bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger } 973bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger 974bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger si = RTA_DATA(tb[XFRMA_SAD_HINFO]); 975bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger fprintf(fp," (buckets "); 976bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger fprintf(fp,"count %d", si->sadhcnt); 977bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger fprintf(fp," Max %d", si->sadhmcnt); 978bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger fprintf(fp,")"); 979bdf9e86d727156ca68fefd243afa29ad4f29f4bfStephen Hemminger } 9800bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal } 9810bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal fprintf(fp,"\n"); 9820bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 9830bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal return 0; 9840bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal} 9850bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 9860bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamalstatic int xfrm_sad_getinfo(int argc, char **argv) 9870bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal{ 9880bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal struct rtnl_handle rth; 9890bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal struct { 9900bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal struct nlmsghdr n; 9910bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal __u32 flags; 9920bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal char ans[64]; 9930bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal } req; 9940bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 9950bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal memset(&req, 0, sizeof(req)); 9960bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal req.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.flags)); 9970bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal req.n.nlmsg_flags = NLM_F_REQUEST; 9980bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal req.n.nlmsg_type = XFRM_MSG_GETSADINFO; 9990bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal req.flags = 0XFFFFFFFF; 10000bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 10010bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0) 10020bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal exit(1); 10030bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 10040bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal if (rtnl_talk(&rth, &req.n, 0, 0, &req.n, NULL, NULL) < 0) 10050bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal exit(2); 10060bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 10070bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal print_sadinfo(&req.n, (void*)stdout); 10080bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 10090bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal rtnl_close(&rth); 10100bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 10110bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal return 0; 10120bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal} 10130bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal 10149bec1a436335457f3067a17de6ddb913bd95a184shemmingerstatic int xfrm_state_flush(int argc, char **argv) 1015bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam{ 1016bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam struct rtnl_handle rth; 1017bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam struct { 1018bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam struct nlmsghdr n; 1019bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam struct xfrm_usersa_flush xsf; 1020bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam } req; 10219bec1a436335457f3067a17de6ddb913bd95a184shemminger char *protop = NULL; 1022bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam 1023bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam memset(&req, 0, sizeof(req)); 1024bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam 1025bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam req.n.nlmsg_len = NLMSG_LENGTH(sizeof(req.xsf)); 1026bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam req.n.nlmsg_flags = NLM_F_REQUEST; 1027bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam req.n.nlmsg_type = XFRM_MSG_FLUSHSA; 10287ea4f5d33d27b23a3127b0b6ec46d0b4821d9431Masahide NAKAMURA req.xsf.proto = 0; 1029bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam 10309bec1a436335457f3067a17de6ddb913bd95a184shemminger while (argc > 0) { 10319bec1a436335457f3067a17de6ddb913bd95a184shemminger if (strcmp(*argv, "proto") == 0) { 10329bec1a436335457f3067a17de6ddb913bd95a184shemminger int ret; 10339bec1a436335457f3067a17de6ddb913bd95a184shemminger 10349bec1a436335457f3067a17de6ddb913bd95a184shemminger if (protop) 10359bec1a436335457f3067a17de6ddb913bd95a184shemminger duparg("proto", *argv); 10369bec1a436335457f3067a17de6ddb913bd95a184shemminger protop = *argv; 10379bec1a436335457f3067a17de6ddb913bd95a184shemminger 10389bec1a436335457f3067a17de6ddb913bd95a184shemminger NEXT_ARG(); 10399bec1a436335457f3067a17de6ddb913bd95a184shemminger 10409bec1a436335457f3067a17de6ddb913bd95a184shemminger ret = xfrm_xfrmproto_getbyname(*argv); 10419bec1a436335457f3067a17de6ddb913bd95a184shemminger if (ret < 0) 10429bec1a436335457f3067a17de6ddb913bd95a184shemminger invarg("\"XFRM_PROTO\" is invalid", *argv); 10439bec1a436335457f3067a17de6ddb913bd95a184shemminger 10449bec1a436335457f3067a17de6ddb913bd95a184shemminger req.xsf.proto = (__u8)ret; 10459bec1a436335457f3067a17de6ddb913bd95a184shemminger } else 10469bec1a436335457f3067a17de6ddb913bd95a184shemminger invarg("unknown", *argv); 10479bec1a436335457f3067a17de6ddb913bd95a184shemminger 10489bec1a436335457f3067a17de6ddb913bd95a184shemminger argc--; argv++; 10499bec1a436335457f3067a17de6ddb913bd95a184shemminger } 10509bec1a436335457f3067a17de6ddb913bd95a184shemminger 1051bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0) 1052bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam exit(1); 1053bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam 1054bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam if (show_stats > 1) 10559bec1a436335457f3067a17de6ddb913bd95a184shemminger fprintf(stderr, "Flush state proto=%s\n", 10569bec1a436335457f3067a17de6ddb913bd95a184shemminger (req.xsf.proto == IPSEC_PROTO_ANY) ? "any" : 10579bec1a436335457f3067a17de6ddb913bd95a184shemminger strxf_xfrmproto(req.xsf.proto)); 1058bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam 1059bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam if (rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL) < 0) 1060bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam exit(2); 1061bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam 1062bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam rtnl_close(&rth); 1063bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam 1064bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam return 0; 1065bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam} 1066bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam 1067c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemmingerint do_xfrm_state(int argc, char **argv) 1068c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger{ 1069c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (argc < 1) 10709bec1a436335457f3067a17de6ddb913bd95a184shemminger return xfrm_state_list_or_deleteall(0, NULL, 0); 1071c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 1072c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (matches(*argv, "add") == 0) 1073c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return xfrm_state_modify(XFRM_MSG_NEWSA, 0, 1074c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger argc-1, argv+1); 1075c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (matches(*argv, "update") == 0) 1076c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return xfrm_state_modify(XFRM_MSG_UPDSA, 0, 1077c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger argc-1, argv+1); 1078fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv if (matches(*argv, "allocspi") == 0) 1079fb7399b2baf9018c896985c3d669422a33ce5b38linux-ipv return xfrm_state_allocspi(argc-1, argv+1); 10809bec1a436335457f3067a17de6ddb913bd95a184shemminger if (matches(*argv, "delete") == 0) 1081c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return xfrm_state_get_or_delete(argc-1, argv+1, 1); 10829bec1a436335457f3067a17de6ddb913bd95a184shemminger if (matches(*argv, "deleteall") == 0 || matches(*argv, "delall") == 0) 10839bec1a436335457f3067a17de6ddb913bd95a184shemminger return xfrm_state_list_or_deleteall(argc-1, argv+1, 1); 1084c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (matches(*argv, "list") == 0 || matches(*argv, "show") == 0 1085c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger || matches(*argv, "lst") == 0) 10869bec1a436335457f3067a17de6ddb913bd95a184shemminger return xfrm_state_list_or_deleteall(argc-1, argv+1, 0); 1087c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (matches(*argv, "get") == 0) 1088c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return xfrm_state_get_or_delete(argc-1, argv+1, 0); 10899bec1a436335457f3067a17de6ddb913bd95a184shemminger if (matches(*argv, "flush") == 0) 10909bec1a436335457f3067a17de6ddb913bd95a184shemminger return xfrm_state_flush(argc-1, argv+1); 10910bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal if (matches(*argv, "count") == 0) { 10920bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal return xfrm_sad_getinfo(argc, argv); 10930bb4a4c20c9deeac26f7239d83c8747c4dfb4d89jamal } 1094c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (matches(*argv, "help") == 0) 1095c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger usage(); 1096c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger fprintf(stderr, "Command \"%s\" is unknown, try \"ip xfrm state help\".\n", *argv); 1097c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger exit(-1); 1098c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger} 1099