/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * * Copyright 2017 Jason King. * Copyright 2019 Joyent, Inc. */ #ifndef _DEFS_H #define _DEFS_H #include #include #include #include #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif #ifndef SOCKADDR_U_T #define SOCKADDR_U_T typedef union sockaddr_u_s { struct sockaddr *sau_sa; struct sockaddr_storage *sau_ss; struct sockaddr_in *sau_sin; struct sockaddr_in6 *sau_sin6; } sockaddr_u_t; #endif /* SOCKADDR_U_T */ struct ikev2_sa_s; /* Parsed-out PF_KEY message. */ typedef struct parsedmsg_s { list_node_t pmsg_node; sadb_msg_t *pmsg_samsg; sadb_ext_t *pmsg_exts[SADB_EXT_MAX + 2]; /* 2 for alignment */ sockaddr_u_t pmsg_sau; sockaddr_u_t pmsg_dau; sockaddr_u_t pmsg_isau; sockaddr_u_t pmsg_idau; sockaddr_u_t pmsg_nlau; sockaddr_u_t pmsg_nrau; } parsedmsg_t; #define pmsg_ssa pmsg_sau.sau_sa #define pmsg_sss pmsg_sau.sau_ss #define pmsg_ssin pmsg_sau.sau_sin #define pmsg_ssin6 pmsg_sau.sau_sin6 #define pmsg_dsa pmsg_dau.sau_sa #define pmsg_dss pmsg_dau.sau_ss #define pmsg_dsin pmsg_dau.sau_sin #define pmsg_dsin6 pmsg_dau.sau_sin6 #define pmsg_issa pmsg_isau.sau_sa #define pmsg_isss pmsg_isau.sau_ss #define pmsg_issin pmsg_isau.sau_sin #define pmsg_issin6 pmsg_isau.sau_sin6 #define pmsg_idsa pmsg_idau.sau_sa #define pmsg_idss pmsg_idau.sau_ss #define pmsg_idsin pmsg_idau.sau_sin #define pmsg_idsin6 pmsg_idau.sau_sin6 #define pmsg_nlsa pmsg_nlau.sau_sa #define pmsg_nlss pmsg_nlau.sau_ss #define pmsg_nlsin pmsg_nlau.sau_sin #define pmsg_nlsin6 pmsg_nlau.sau_sin6 #define pmsg_nrsa pmsg_nrau.sau_sa #define pmsg_nrss pmsg_nrau.sau_ss #define pmsg_nrsin pmsg_rnau.sau_sin #define pmsg_nrsin6 pmsg_nrau.sau_sin6 void parsedmsg_free(parsedmsg_t *); #define PMSG_FROM_KERNEL(pmsg) ((pmsg)->pmsg_samsg->sadb_msg_pid == 0) /* XXX: Any better way to determine this? */ #define PMSG_IS_TRANSPORT(pmsg) ((pmsg)->pmsg_isss == NULL) typedef struct algindex { const char *desc; int doi_num; } algindex_t; /* * Compare two AF_INET{,6} sockaddrs (no port). Assume sockaddr_storage * pointers are passed, and also verifies the address families match and * are either AF_INET or AF_INET6. */ #define SA_ADDR_EQ(sa1, sa2) \ (((sa1)->ss_family == (sa2)->ss_family) && \ ((((sa1)->ss_family == AF_INET) && \ ((struct sockaddr_in *)(sa1))->sin_addr.s_addr == \ ((struct sockaddr_in *)(sa2))->sin_addr.s_addr) || \ (((sa1)->ss_family == AF_INET6) && \ IN6_ARE_ADDR_EQUAL(&((struct sockaddr_in6 *)(sa1))->sin6_addr,\ &((struct sockaddr_in6 *)(sa2))->sin6_addr)))) /* * Compare two AF_INET{,6} sockaddr ports. Exploit the identical offsets for * sin_port/sin6_port. (Does not check sockaddr families a priori.) */ #define SA_PORT_EQ(sa1, sa2) (((struct sockaddr_in *)(sa1))->sin_port == \ ((struct sockaddr_in *)(sa2))->sin_port) /* * Compare two AF_INET{,6} sockaddrs (including ports). Exploit the * identical offsets for sin_port/sin6_port. */ #define SA_FULL_EQ(sa1, sa2) (SA_ADDR_EQ(sa1, sa2) && SA_PORT_EQ(sa1, sa2)) #define SSTOSA(ss) ((struct sockaddr *)(ss)) #define INVALID(var) \ (void) assfail("Invalid value of " # var, __FILE__, __LINE__) #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof (x) / sizeof (x[0])) #endif /* A few simple functions to simplify using sockaddr's w/ bunyan */ int ss_bunyan(const struct sockaddr *); uint32_t ss_port(const struct sockaddr *); const void *ss_addr(const struct sockaddr *); size_t ss_addrlen(const struct sockaddr *); uint8_t ss_addrbits(const struct sockaddr *); extern uint32_t category; #define LOG_KEY_CATEGORY "_category" #define LOG_KEY_ERRMSG "err" #define LOG_KEY_ERRNO "errno" #define LOG_KEY_FILE "file" #define LOG_KEY_FUNC "func" #define LOG_KEY_LINE "line" #define LOG_KEY_I2SA "i2sa" #define LOG_KEY_LADDR "local_addr" #define LOG_KEY_RADDR "remote_addr" #define LOG_KEY_LSPI "local_spi" #define LOG_KEY_RSPI "remote_spi" #define LOG_KEY_INITIATOR "initiator" #define LOG_KEY_LOCAL_ID "local_id" #define LOG_KEY_LOCAL_ID_TYPE LOG_KEY_LOCAL_ID "_type" #define LOG_KEY_REMOTE_ID "remote_id" #define LOG_KEY_REMOTE_ID_TYPE LOG_KEY_REMOTE_ID "_type" #define LOG_KEY_REQ "req_pkt" #define LOG_KEY_RESP "resp_pkt" #define LOG_KEY_VERSION "ike_version" #define LOG_KEY_MSGID "msgid" #define LOG_KEY_EXCHTYPE "exch_type" /* cstyle cannot handle ## __VA_ARGS__ */ /* BEGIN CSTYLED */ #define TSTDERR(_e, _lvl, _msg, ...) \ (void) bunyan_##_lvl(log, (_msg), \ BUNYAN_T_STRING, LOG_KEY_ERRMSG, strerror(_e), \ BUNYAN_T_INT32, LOG_KEY_ERRNO, (int32_t)(_e), \ BUNYAN_T_STRING, LOG_KEY_FUNC, __func__, \ BUNYAN_T_STRING, LOG_KEY_FILE, __FILE__, \ BUNYAN_T_INT32, LOG_KEY_LINE, __LINE__, \ ## __VA_ARGS__, \ BUNYAN_T_END) #define STDERR(_lvl, _msg, ...) \ TSTDERR(errno, _lvl, _msg, ## __VA_ARGS__) /* END CSTYLED */ /* * We want XTI sockets, which requires setting _XOPEN_SOURCE, but then * we get the annoying _B_TRUE and _B_FALSE versions of boolean_t, * so we define the more traditional values here. */ #define B_TRUE _B_TRUE #define B_FALSE _B_FALSE typedef enum event { EVENT_NONE, EVENT_SIGNAL, } event_t; extern int main_port; extern boolean_t show_keys; /* * While bunyan itself is multithreaded, since every thread runs some sort * of event loop, by guaranteeing every thread it's own instance, we can * build up keys as the event goes through processing, and then reset the keys * before we loop around again. */ extern __thread bunyan_logger_t *log; extern bunyan_logger_t *main_log; typedef int (*bunyan_logfn_t)(bunyan_logger_t *, const char *, ...); bunyan_logfn_t getlog(bunyan_level_t); #ifdef __cplusplus } #endif #endif /* _DEFS_H */