1f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv/* $USAGI: $ */ 2f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 3f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv/* 4f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * Copyright (C)2005 USAGI/WIDE Project 5ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger * 6f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * This program is free software; you can redistribute it and/or modify 7f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * it under the terms of the GNU General Public License as published by 8f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * the Free Software Foundation; either version 2 of the License, or 9f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * (at your option) any later version. 10ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger * 11f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * This program is distributed in the hope that it will be useful, 12f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * but WITHOUT ANY WARRANTY; without even the implied warranty of 13f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * GNU General Public License for more details. 15ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger * 16f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * You should have received a copy of the GNU General Public License 17f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * along with this program; if not, write to the Free Software 18f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv */ 20f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv/* 21f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * based on ipmonitor.c 22f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv */ 23f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv/* 24f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * Authors: 25f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv * Masahide NAKAMURA @USAGI 26f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv */ 27f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 28f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv#include <stdio.h> 29f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv#include <stdlib.h> 30f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv#include <string.h> 31b082b9f9ad94f08d3f3d2e617f71dbaf3751ccadDmitry Shmidt#include <endian.h> 32f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv#include <linux/xfrm.h> 33f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv#include "utils.h" 34f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv#include "xfrm.h" 35f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv#include "ip_common.h" 36f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 37f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipvstatic void usage(void) __attribute__((noreturn)); 38f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 39f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipvstatic void usage(void) 40f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv{ 41cbec0219132afd1749e1b8852b8b3729988af841David Ward fprintf(stderr, "Usage: ip xfrm monitor [ all | LISTofXFRM-OBJECTS ]\n"); 42f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv exit(-1); 43f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv} 44f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 45f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipvstatic int xfrm_acquire_print(const struct sockaddr_nl *who, 46f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv struct nlmsghdr *n, void *arg) 47f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv{ 48f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv FILE *fp = (FILE*)arg; 49f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv struct xfrm_user_acquire *xacq = NLMSG_DATA(n); 50f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv int len = n->nlmsg_len; 51f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv struct rtattr * tb[XFRMA_MAX+1]; 52f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv __u16 family; 53f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 54f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv len -= NLMSG_LENGTH(sizeof(*xacq)); 55f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (len < 0) { 56f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fprintf(stderr, "BUG: wrong nlmsg len %d\n", len); 57f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv return -1; 58f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv } 59f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 60f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv parse_rtattr(tb, XFRMA_MAX, XFRMACQ_RTA(xacq), len); 6190f93024a0818dc691138d8401721e797004b042shemminger 62f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv family = xacq->sel.family; 63f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (family == AF_UNSPEC) 64f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv family = xacq->policy.sel.family; 65f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (family == AF_UNSPEC) 66f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv family = preferred_family; 67f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 68f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fprintf(fp, "acquire "); 69f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 70f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fprintf(fp, "proto %s ", strxf_xfrmproto(xacq->id.proto)); 71f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (show_stats > 0 || xacq->id.spi) { 72f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv __u32 spi = ntohl(xacq->id.spi); 73f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fprintf(fp, "spi 0x%08x", spi); 74f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (show_stats > 0) 75f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fprintf(fp, "(%u)", spi); 76f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fprintf(fp, " "); 77f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv } 78f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fprintf(fp, "%s", _SL_); 79f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 80f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv xfrm_selector_print(&xacq->sel, family, fp, " sel "); 81f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 82f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv xfrm_policy_info_print(&xacq->policy, tb, fp, " ", " policy "); 83f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 84f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (show_stats > 0) 85f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fprintf(fp, " seq 0x%08u ", xacq->seq); 86f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (show_stats > 0) { 87f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fprintf(fp, "%s-mask %s ", 88f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv strxf_algotype(XFRMA_ALG_CRYPT), 89f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv strxf_mask32(xacq->ealgos)); 90f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fprintf(fp, "%s-mask %s ", 91f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv strxf_algotype(XFRMA_ALG_AUTH), 92f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv strxf_mask32(xacq->aalgos)); 93f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fprintf(fp, "%s-mask %s", 94f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv strxf_algotype(XFRMA_ALG_COMP), 95f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv strxf_mask32(xacq->calgos)); 96f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv } 97f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fprintf(fp, "%s", _SL_); 98f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 99f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (oneline) 100f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fprintf(fp, "\n"); 101669ae748d6ae3a476090f7dc48dd0fa6d246f77eshemminger fflush(fp); 102f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 103f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv return 0; 104f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv} 105f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 106efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURAstatic int xfrm_state_flush_print(const struct sockaddr_nl *who, 107efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA struct nlmsghdr *n, void *arg) 108efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA{ 109efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA FILE *fp = (FILE*)arg; 110efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA struct xfrm_usersa_flush *xsf = NLMSG_DATA(n); 111efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA int len = n->nlmsg_len; 112efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA const char *str; 113efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 114efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA len -= NLMSG_SPACE(sizeof(*xsf)); 115efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA if (len < 0) { 116efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fprintf(stderr, "BUG: wrong nlmsg len %d\n", len); 117efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA return -1; 118efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA } 119efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 120efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fprintf(fp, "Flushed state "); 121efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 122efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA str = strxf_xfrmproto(xsf->proto); 123efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA if (str) 124efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fprintf(fp, "proto %s", str); 125efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA else 126efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fprintf(fp, "proto %u", xsf->proto); 127efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fprintf(fp, "%s", _SL_); 128efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 129efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA if (oneline) 130efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fprintf(fp, "\n"); 131efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fflush(fp); 132efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 133efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA return 0; 134efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA} 135efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 136efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURAstatic int xfrm_policy_flush_print(const struct sockaddr_nl *who, 137efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA struct nlmsghdr *n, void *arg) 138efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA{ 139efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA struct rtattr * tb[XFRMA_MAX+1]; 140efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA FILE *fp = (FILE*)arg; 141efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA int len = n->nlmsg_len; 142efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 143efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA len -= NLMSG_SPACE(0); 144efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA if (len < 0) { 145efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fprintf(stderr, "BUG: wrong nlmsg len %d\n", len); 146efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA return -1; 147efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA } 148efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 149efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fprintf(fp, "Flushed policy "); 150efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 151efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA parse_rtattr(tb, XFRMA_MAX, NLMSG_DATA(n), len); 152efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 153efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA if (tb[XFRMA_POLICY_TYPE]) { 154efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA struct xfrm_userpolicy_type *upt; 155efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 156efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fprintf(fp, "ptype "); 157efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 158efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA if (RTA_PAYLOAD(tb[XFRMA_POLICY_TYPE]) < sizeof(*upt)) 159efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fprintf(fp, "(ERROR truncated)"); 160efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 161efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA upt = (struct xfrm_userpolicy_type *)RTA_DATA(tb[XFRMA_POLICY_TYPE]); 162efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fprintf(fp, "%s ", strxf_ptype(upt->type)); 163efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA } 164efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 165efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fprintf(fp, "%s", _SL_); 166efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 167efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA if (oneline) 168efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fprintf(fp, "\n"); 169efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA fflush(fp); 170efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 171efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA return 0; 172efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA} 173efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 174c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURAstatic int xfrm_report_print(const struct sockaddr_nl *who, 175c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA struct nlmsghdr *n, void *arg) 176c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA{ 177c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA FILE *fp = (FILE*)arg; 178c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA struct xfrm_user_report *xrep = NLMSG_DATA(n); 179c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA int len = n->nlmsg_len; 180c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA struct rtattr * tb[XFRMA_MAX+1]; 181c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA __u16 family; 182c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA 183c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA len -= NLMSG_LENGTH(sizeof(*xrep)); 184c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA if (len < 0) { 185c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA fprintf(stderr, "BUG: wrong nlmsg len %d\n", len); 186c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA return -1; 187c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA } 188c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA 189c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA family = xrep->sel.family; 190c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA if (family == AF_UNSPEC) 191c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA family = preferred_family; 192c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA 193c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA fprintf(fp, "report "); 194c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA 195c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA fprintf(fp, "proto %s ", strxf_xfrmproto(xrep->proto)); 196c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA fprintf(fp, "%s", _SL_); 197c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA 198c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA xfrm_selector_print(&xrep->sel, family, fp, " sel "); 199c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA 200c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA parse_rtattr(tb, XFRMA_MAX, XFRMREP_RTA(xrep), len); 201c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA 202c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA xfrm_xfrma_print(tb, family, fp, " "); 203c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA 204c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA if (oneline) 205c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA fprintf(fp, "\n"); 206c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA 207c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA return 0; 208c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA} 209c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA 210c9fd974bd88213d74fac0ec237c79a81aa8029fcjamalvoid xfrm_ae_flags_print(__u32 flags, void *arg) 211c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal{ 212c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal FILE *fp = (FILE*)arg; 213c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal fprintf(fp, " (0x%x) ", flags); 214c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal if (!flags) 215c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal return; 216c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal if (flags & XFRM_AE_CR) 217c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal fprintf(fp, " replay update "); 218c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal if (flags & XFRM_AE_CE) 219c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal fprintf(fp, " timer expired "); 220c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal if (flags & XFRM_AE_CU) 221c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal fprintf(fp, " policy updated "); 222c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal 223c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal} 224c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal 225598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphalstatic void xfrm_usersa_print(const struct xfrm_usersa_id *sa_id, __u32 reqid, FILE *fp) 226598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal{ 227598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal char buf[256]; 228598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal 229598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal buf[0] = 0; 230598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal fprintf(fp, "dst %s ", rt_addr_n2a(sa_id->family, 231598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal sizeof(sa_id->daddr), &sa_id->daddr, buf, sizeof(buf))); 232598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal 233598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal fprintf(fp, " reqid 0x%x", reqid); 234598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal 235598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal fprintf(fp, " protocol %s ", strxf_proto(sa_id->proto)); 236598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal fprintf(fp, " SPI 0x%x", ntohl(sa_id->spi)); 237598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal} 238598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal 239c9fd974bd88213d74fac0ec237c79a81aa8029fcjamalstatic int xfrm_ae_print(const struct sockaddr_nl *who, 240c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal struct nlmsghdr *n, void *arg) 241c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal{ 242c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal FILE *fp = (FILE*)arg; 243c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal struct xfrm_aevent_id *id = NLMSG_DATA(n); 244c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal char abuf[256]; 245c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal 246c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal fprintf(fp, "Async event "); 247c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal xfrm_ae_flags_print(id->flags, arg); 248c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal fprintf(fp,"\n\t"); 249c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal memset(abuf, '\0', sizeof(abuf)); 25081c61790d5927dc6ca168b2183000a3efc7bc493Stephen Hemminger fprintf(fp, "src %s ", rt_addr_n2a(id->sa_id.family, 25181c61790d5927dc6ca168b2183000a3efc7bc493Stephen Hemminger sizeof(id->saddr), &id->saddr, 252c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal abuf, sizeof(abuf))); 253598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal 254598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal xfrm_usersa_print(&id->sa_id, id->reqid, fp); 255c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal 256c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal fprintf(fp, "\n"); 257c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal fflush(fp); 258c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal 259c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal return 0; 260c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal} 261c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal 262598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphalstatic void xfrm_print_addr(FILE *fp, int family, xfrm_address_t *a, size_t s) 263598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal{ 264598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal char buf[256]; 265598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal 266598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal buf[0] = 0; 267598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal fprintf(fp, "%s", rt_addr_n2a(family, s, a, buf, sizeof(buf))); 268598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal} 269598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal 270598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphalstatic int xfrm_mapping_print(const struct sockaddr_nl *who, 271598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal struct nlmsghdr *n, void *arg) 272598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal{ 273598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal FILE *fp = (FILE*)arg; 274598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal struct xfrm_user_mapping *map = NLMSG_DATA(n); 275598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal 276598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal fprintf(fp, "Mapping change "); 277598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal xfrm_print_addr(fp, map->id.family, &map->old_saddr, 278598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal sizeof(map->old_saddr)); 279598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal 280598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal fprintf(fp, ":%d -> ", ntohs(map->old_sport)); 281598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal xfrm_print_addr(fp, map->id.family, &map->new_saddr, 282598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal sizeof(map->new_saddr)); 283598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal fprintf(fp, ":%d\n\t", ntohs(map->new_sport)); 284598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal 285598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal xfrm_usersa_print(&map->id, map->reqid, fp); 286598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal 287598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal fprintf(fp, "\n"); 288598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal fflush(fp); 289598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal return 0; 290598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal} 291598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal 292f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipvstatic int xfrm_accept_msg(const struct sockaddr_nl *who, 293f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv struct nlmsghdr *n, void *arg) 294f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv{ 295f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv FILE *fp = (FILE*)arg; 296f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 29790f93024a0818dc691138d8401721e797004b042shemminger if (timestamp) 29890f93024a0818dc691138d8401721e797004b042shemminger print_timestamp(fp); 29990f93024a0818dc691138d8401721e797004b042shemminger 300efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA switch (n->nlmsg_type) { 301efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA case XFRM_MSG_NEWSA: 302efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA case XFRM_MSG_DELSA: 303efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA case XFRM_MSG_UPDSA: 304efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA case XFRM_MSG_EXPIRE: 305c595c790a08366db90654c01aba02a1bd97d73e2shemminger xfrm_state_print(who, n, arg); 306c595c790a08366db90654c01aba02a1bd97d73e2shemminger return 0; 307efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA case XFRM_MSG_NEWPOLICY: 308efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA case XFRM_MSG_DELPOLICY: 309efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA case XFRM_MSG_UPDPOLICY: 310efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA case XFRM_MSG_POLEXPIRE: 311c595c790a08366db90654c01aba02a1bd97d73e2shemminger xfrm_policy_print(who, n, arg); 312c595c790a08366db90654c01aba02a1bd97d73e2shemminger return 0; 313efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA case XFRM_MSG_ACQUIRE: 314f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv xfrm_acquire_print(who, n, arg); 315f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv return 0; 316efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA case XFRM_MSG_FLUSHSA: 317efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA xfrm_state_flush_print(who, n, arg); 318f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv return 0; 319efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA case XFRM_MSG_FLUSHPOLICY: 320efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA xfrm_policy_flush_print(who, n, arg); 321f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv return 0; 322efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA case XFRM_MSG_REPORT: 323c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA xfrm_report_print(who, n, arg); 324c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA return 0; 325efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA case XFRM_MSG_NEWAE: 326c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal xfrm_ae_print(who, n, arg); 327c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal return 0; 328598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal case XFRM_MSG_MAPPING: 329598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal xfrm_mapping_print(who, n, arg); 330598a42c09153a1b6cfe03efa3f7e68773eec912dFlorian Westphal return 0; 331efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA default: 332efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA break; 333c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal } 334efe69c1b7220e6c89bc5ccbeceeadf7c9e09768bMasahide NAKAMURA 335f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (n->nlmsg_type != NLMSG_ERROR && n->nlmsg_type != NLMSG_NOOP && 336f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv n->nlmsg_type != NLMSG_DONE) { 337c595c790a08366db90654c01aba02a1bd97d73e2shemminger fprintf(fp, "Unknown message: %08d 0x%08x 0x%08x\n", 338f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv n->nlmsg_len, n->nlmsg_type, n->nlmsg_flags); 339f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv } 340f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv return 0; 341f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv} 342f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 34377219712bf5bbb1a65961c9b322e4a68c55276abStephen Hemmingerextern struct rtnl_handle rth; 34477219712bf5bbb1a65961c9b322e4a68c55276abStephen Hemminger 345f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipvint do_xfrm_monitor(int argc, char **argv) 346f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv{ 347f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv char *file = NULL; 348f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv unsigned groups = ~((unsigned)0); /* XXX */ 349f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv int lacquire=0; 350f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv int lexpire=0; 351c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal int laevent=0; 352c595c790a08366db90654c01aba02a1bd97d73e2shemminger int lpolicy=0; 353c595c790a08366db90654c01aba02a1bd97d73e2shemminger int lsa=0; 354c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA int lreport=0; 355f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 35677219712bf5bbb1a65961c9b322e4a68c55276abStephen Hemminger rtnl_close(&rth); 35777219712bf5bbb1a65961c9b322e4a68c55276abStephen Hemminger 358f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv while (argc > 0) { 359f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (matches(*argv, "file") == 0) { 360f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv NEXT_ARG(); 361f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv file = *argv; 362f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv } else if (matches(*argv, "acquire") == 0) { 363f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv lacquire=1; 364f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv groups = 0; 365f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv } else if (matches(*argv, "expire") == 0) { 366f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv lexpire=1; 367f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv groups = 0; 368c595c790a08366db90654c01aba02a1bd97d73e2shemminger } else if (matches(*argv, "SA") == 0) { 369c595c790a08366db90654c01aba02a1bd97d73e2shemminger lsa=1; 370c595c790a08366db90654c01aba02a1bd97d73e2shemminger groups = 0; 371c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal } else if (matches(*argv, "aevent") == 0) { 372c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal laevent=1; 373c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal groups = 0; 374c595c790a08366db90654c01aba02a1bd97d73e2shemminger } else if (matches(*argv, "policy") == 0) { 375c595c790a08366db90654c01aba02a1bd97d73e2shemminger lpolicy=1; 376c595c790a08366db90654c01aba02a1bd97d73e2shemminger groups = 0; 377c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA } else if (matches(*argv, "report") == 0) { 378c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA lreport=1; 379c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA groups = 0; 380f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv } else if (matches(*argv, "help") == 0) { 381f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv usage(); 382f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv } else { 383f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fprintf(stderr, "Argument \"%s\" is unknown, try \"ip xfrm monitor help\".\n", *argv); 384f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv exit(-1); 385f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv } 386f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv argc--; argv++; 387f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv } 388f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 389f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (lacquire) 3907b8225122d1b22c74f05bd12398bd602d49e6e13jamal groups |= nl_mgrp(XFRMNLGRP_ACQUIRE); 391f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (lexpire) 3927b8225122d1b22c74f05bd12398bd602d49e6e13jamal groups |= nl_mgrp(XFRMNLGRP_EXPIRE); 393c595c790a08366db90654c01aba02a1bd97d73e2shemminger if (lsa) 3947b8225122d1b22c74f05bd12398bd602d49e6e13jamal groups |= nl_mgrp(XFRMNLGRP_SA); 395c595c790a08366db90654c01aba02a1bd97d73e2shemminger if (lpolicy) 3967b8225122d1b22c74f05bd12398bd602d49e6e13jamal groups |= nl_mgrp(XFRMNLGRP_POLICY); 397c9fd974bd88213d74fac0ec237c79a81aa8029fcjamal if (laevent) 3987b8225122d1b22c74f05bd12398bd602d49e6e13jamal groups |= nl_mgrp(XFRMNLGRP_AEVENTS); 399c54f31eeb3a1fe35359ffa40cf7bb31c18bc75a1Masahide NAKAMURA if (lreport) 4007b8225122d1b22c74f05bd12398bd602d49e6e13jamal groups |= nl_mgrp(XFRMNLGRP_REPORT); 401f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 402f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (file) { 403f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv FILE *fp; 404f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv fp = fopen(file, "r"); 405f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (fp == NULL) { 406f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv perror("Cannot fopen"); 407f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv exit(-1); 408f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv } 409f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv return rtnl_from_file(fp, xfrm_accept_msg, (void*)stdout); 410f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv } 411f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 412f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv //ll_init_map(&rth); 413f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 414c595c790a08366db90654c01aba02a1bd97d73e2shemminger if (rtnl_open_byproto(&rth, groups, NETLINK_XFRM) < 0) 415c595c790a08366db90654c01aba02a1bd97d73e2shemminger exit(1); 416c595c790a08366db90654c01aba02a1bd97d73e2shemminger 417f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv if (rtnl_listen(&rth, xfrm_accept_msg, (void*)stdout) < 0) 418f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv exit(2); 419f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv 420351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger return 0; 421f9cb3a2fe2a5a1ecfa353397bff9a274d65becb1linux-ipv} 422