]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[infiniband] Include the SRP login rejection reason in the error number
authorMichael Brown <mcb30@ipxe.org>
Wed, 22 Sep 2010 19:05:39 +0000 (20:05 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 22 Sep 2010 19:05:39 +0000 (20:05 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/block/srp.c
src/include/ipxe/srp.h

index 007e62d1f130a2b6ad790d2823491aec2f30bde2..098a973eb5bbf0f5c37c2821474518923659abf5 100644 (file)
@@ -54,6 +54,50 @@ FEATURE ( FEATURE_PROTOCOL, "SRP", DHCP_EB_FEATURE_SRP, 1 );
  */
 #define SRP_MAX_I_T_IU_LEN 80
 
+/* Error numbers generated by SRP login rejection */
+#define EINFO_SRP_LOGIN_REJ( reason, desc )                                  \
+       __einfo_uniqify ( EINFO_EPERM, ( (reason) & 0x0f ), desc )
+#define EPERM_UNKNOWN                                                        \
+       __einfo_error ( EINFO_EPERM_UNKNOWN )
+#define EINFO_EPERM_UNKNOWN EINFO_SRP_LOGIN_REJ (                            \
+       SRP_LOGIN_REJ_REASON_UNKNOWN,                                         \
+       "Unable to establish RDMA channel, no reason specified" )
+#define EPERM_INSUFFICIENT_RESOURCES                                         \
+       __einfo_error ( EINFO_EPERM_INSUFFICIENT_RESOURCES )
+#define EINFO_EPERM_INSUFFICIENT_RESOURCES EINFO_SRP_LOGIN_REJ (             \
+       SRP_LOGIN_REJ_REASON_INSUFFICIENT_RESOURCES,                          \
+       "Insufficient RDMA channel resources" )
+#define EPERM_BAD_MAX_I_T_IU_LEN                                             \
+       __einfo_error ( EINFO_EPERM_BAD_MAX_I_T_IU_LEN )
+#define EINFO_EPERM_BAD_MAX_I_T_IU_LEN EINFO_SRP_LOGIN_REJ (                 \
+       SRP_LOGIN_REJ_REASON_BAD_MAX_I_T_IU_LEN,                              \
+       "Requested maximum initiator to target IU length value too large" )
+#define EPERM_CANNOT_ASSOCIATE                                               \
+       __einfo_error ( EINFO_EPERM_CANNOT_ASSOCIATE )
+#define EINFO_EPERM_CANNOT_ASSOCIATE EINFO_SRP_LOGIN_REJ (                   \
+       SRP_LOGIN_REJ_REASON_CANNOT_ASSOCIATE,                                \
+       "Unable to associate RDMA channel with specified I_T nexus" )
+#define EPERM_UNSUPPORTED_BUFFER_FORMAT                                              \
+       __einfo_error ( EINFO_EPERM_UNSUPPORTED_BUFFER_FORMAT )
+#define EINFO_EPERM_UNSUPPORTED_BUFFER_FORMAT EINFO_SRP_LOGIN_REJ (          \
+       SRP_LOGIN_REJ_REASON_UNSUPPORTED_BUFFER_FORMAT,                       \
+       "One or more requested data buffer descriptor formats not supported" )
+#define EPERM_NO_MULTIPLE_CHANNELS                                           \
+       __einfo_error ( EINFO_EPERM_NO_MULTIPLE_CHANNELS )
+#define EINFO_EPERM_NO_MULTIPLE_CHANNELS EINFO_SRP_LOGIN_REJ (               \
+       SRP_LOGIN_REJ_REASON_NO_MULTIPLE_CHANNELS,                            \
+       "SRP target does not support multiple RDMA channels per I_T nexus" )
+#define EPERM_NO_MORE_CHANNELS                                               \
+       __einfo_error ( EINFO_EPERM_NO_MORE_CHANNELS )
+#define EINFO_EPERM_NO_MORE_CHANNELS EINFO_SRP_LOGIN_REJ (                   \
+       SRP_LOGIN_REJ_REASON_NO_MORE_CHANNELS,                                \
+       "RDMA channel limit reached for this initiator" )
+#define EPERM_LOGIN_REJ( reason_nibble )                                     \
+       EUNIQ ( EPERM, (reason_nibble), EPERM_UNKNOWN,                        \
+               EPERM_INSUFFICIENT_RESOURCES, EPERM_BAD_MAX_I_T_IU_LEN,       \
+               EPERM_CANNOT_ASSOCIATE, EPERM_UNSUPPORTED_BUFFER_FORMAT,      \
+               EPERM_NO_MULTIPLE_CHANNELS, EPERM_NO_MORE_CHANNELS )
+
 /** An SRP device */
 struct srp_device {
        /** Reference count */
@@ -330,6 +374,7 @@ static int srp_login_rsp ( struct srp_device *srpdev,
 static int srp_login_rej ( struct srp_device *srpdev,
                           const void *data, size_t len ) {
        const struct srp_login_rej *login_rej = data;
+       uint32_t reason;
 
        /* Sanity check */
        if ( len < sizeof ( *login_rej ) ) {
@@ -337,14 +382,14 @@ static int srp_login_rej ( struct srp_device *srpdev,
                       srpdev, len );
                return -EINVAL;
        }
-       DBGC ( srpdev, "SRP %p tag %08x LOGIN_REJ:\n",
-              srpdev, ntohl ( login_rej->tag.dwords[1] ) );
+       reason = ntohl ( login_rej->reason );
+       DBGC ( srpdev, "SRP %p tag %08x LOGIN_REJ reason %08x:\n",
+              srpdev, ntohl ( login_rej->tag.dwords[1] ), reason );
        DBGC_HDA ( srpdev, 0, data, len );
 
        /* Login rejection always indicates an error */
-       DBGC ( srpdev, "SRP %p login rejected (reason %08x)\n",
-              srpdev, ntohl ( login_rej->reason ) );
-       return -EPERM;
+       return ( SRP_LOGIN_REJ_REASON_DEFINED ( reason ) ?
+                -EPERM_LOGIN_REJ ( reason ) : -EACCES );
 }
 
 /**
index acde7c94a624bb91b2856fbeb5f130eacfc588e3..8d7f799cddfcb6a094d7c8025a0c8fbb31e69efc 100644 (file)
@@ -242,6 +242,10 @@ struct srp_login_rej {
 /** RDMA channel limit reached for this initiator */
 #define SRP_LOGIN_REJ_REASON_NO_MORE_CHANNELS 0x00010006UL
 
+/** SRP login rejection reason is defined */
+#define SRP_LOGIN_REJ_REASON_DEFINED( reason ) \
+       ( ( (reason) & 0xfffffff0UL ) == 0x00010000UL )
+
 /** Indirect data buffer descriptor format supported */
 #define SRP_LOGIN_REJ_FMT_IDBD 0x04