1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy of the CDDL is also available via the Internet at
   9  * http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /*
  13  * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  14  */
  15 
  16 #ifndef _KRRP_ERROR_H
  17 #define _KRRP_ERROR_H
  18 
  19 #include <sys/types.h>
  20 #include <sys/nvpair.h>
  21 
  22 #ifdef __cplusplus
  23 extern "C" {
  24 #endif
  25 
  26 #define krrp_error_init(error) (void) memset(error, 0, sizeof (krrp_error_t));
  27 
  28 typedef enum {
  29         KRRP_ESRC_COMMON = 1,
  30         KRRP_ESRC_SESSION,
  31         KRRP_ESRC_NETWORK,
  32         KRRP_ESRC_STREAM,
  33         KRRP_ESRC_SERVER,
  34         KRRP_ESRC_PDU
  35 } krrp_esrc_t;
  36 
  37 typedef enum {
  38         KRRP_ERRF_REMOTE = 0x1
  39 } krrp_error_flag_t;
  40 
  41 
  42 #define KRRP_ERRNO_MAP(X) \
  43         X(INTR)               \
  44         X(INVAL)              \
  45         X(BUSY)               \
  46         X(NOMEM)              \
  47         X(SESS)               \
  48         X(CONN)               \
  49         X(PDUENGINE)          \
  50         X(STREAM)             \
  51         X(SESSID)             \
  52         X(KSTATID)            \
  53         X(ADDR)               \
  54         X(PORT)               \
  55         X(DBLKSZ)             \
  56         X(MAXMEMSZ)           \
  57         X(FAKEDSZ)            \
  58         X(SRCDS)              \
  59         X(DSTDS)              \
  60         X(CMNSNAP)            \
  61         X(SRCSNAP)            \
  62         X(BADRESP)            \
  63         X(BIGPAYLOAD)         \
  64         X(UNEXPCLOSE)         \
  65         X(UNEXPEND)           \
  66         X(ZFSGCTXFAIL)        \
  67         X(CREATEFAIL)         \
  68         X(BINDFAIL)           \
  69         X(LISTENFAIL)         \
  70         X(CONNFAIL)           \
  71         X(ACCEPTFAIL)         \
  72         X(SETSOCKOPTFAIL)     \
  73         X(SENDFAIL)           \
  74         X(SENDMBLKFAIL)       \
  75         X(RECVFAIL)           \
  76         X(READFAIL)           \
  77         X(WRITEFAIL)          \
  78         X(SNAPFAIL)           \
  79         X(FLCTRLVIOL)         \
  80         X(PINGTIMEOUT)        \
  81         X(PROTO)              \
  82         X(AUTH)               \
  83         X(CFGTYPE)            \
  84         X(CONNTIMEOUT)        \
  85         X(THROTTLE)           \
  86         X(AUTOSNAP)           \
  87         X(RESUMETOKEN)        \
  88         X(KEEPSNAPS)          \
  89         X(GETSOCKOPTFAIL)     \
  90         X(SKIP_SNAPS_MASK)    \
  91 
  92 
  93 #define KRRP_ERRNO_EXPAND(enum_name) KRRP_ERRNO_##enum_name,
  94 typedef enum {
  95         KRRP_ERRNO_OK = 0,
  96         KRRP_ERRNO_UNKNOWN = 1000,
  97         KRRP_ERRNO_MAP(KRRP_ERRNO_EXPAND)
  98         KRRP_ERRNO_LAST /* To exclude lint-errors */
  99 } krrp_errno_t;
 100 #undef KRRP_ERRNO_EXPAND
 101 
 102 typedef struct krrp_error_s {
 103         /* Native KRRP ERRNO */
 104         krrp_errno_t    krrp_errno;
 105 
 106         /*
 107          * UNIX ERRNO that is returned by non-krrp functions
 108          * for example ksocket_send/ksocket_recv/
 109          * dmu_lend_recv_buffer/dmu_lend_send_buffer/...
 110          */
 111         int                             unix_errno;
 112 
 113         /* Flags: see krrp_error_flag_t */
 114         uint32_t                flags;
 115 } krrp_error_t;
 116 
 117 #ifdef _KERNEL
 118 
 119 void krrp_error_set_flag(krrp_error_t *, krrp_error_flag_t);
 120 void krrp_error_set(krrp_error_t *, krrp_errno_t, int);
 121 
 122 void krrp_error_to_nvl(krrp_error_t *, nvlist_t **);
 123 int krrp_error_from_nvl(krrp_error_t *, nvlist_t *);
 124 
 125 #endif /* _KERNEL */
 126 
 127 const char *krrp_error_errno_to_str(krrp_errno_t krrp_errno);
 128 
 129 #ifdef __cplusplus
 130 }
 131 #endif
 132 
 133 #endif /* _KRRP_ERROR_H */