[infiniband] Add the concept of a management interface

A management interface is the component through which both local and
remote management agents are accessed.

This new implementation of a management interface allows for the user
to react to timed-out transactions, and also allows for cancellation
of in-progress transactions.
This commit is contained in:
Michael Brown
2009-08-03 15:56:56 +01:00
parent 18bcdfb1cc
commit 0e07516f62
4 changed files with 549 additions and 1 deletions

View File

@@ -151,6 +151,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#define ERRFILE_ib_mcast ( ERRFILE_NET | 0x001d0000 )
#define ERRFILE_ib_cm ( ERRFILE_NET | 0x001e0000 )
#define ERRFILE_net80211 ( ERRFILE_NET | 0x001f0000 )
#define ERRFILE_ib_mi ( ERRFILE_NET | 0x00200000 )
#define ERRFILE_image ( ERRFILE_IMAGE | 0x00000000 )
#define ERRFILE_elf ( ERRFILE_IMAGE | 0x00010000 )

View File

@@ -491,7 +491,9 @@ struct ib_mad_hdr {
#define IB_MGMT_CLASS_CM 0x07
#define IB_MGMT_CLASS_SNMP 0x08
#define IB_MGMT_CLASS_VENDOR_RANGE2_START 0x30
#define IB_MGMT_CLASS_VENDOR_RANGE2_END 0x4F
#define IB_MGMT_CLASS_VENDOR_RANGE2_END 0x4f
#define IB_MGMT_CLASS_MASK 0x7f
/* Management methods */
#define IB_MGMT_METHOD_GET 0x01

135
src/include/gpxe/ib_mi.h Normal file
View File

@@ -0,0 +1,135 @@
#ifndef _GPXE_IB_MI_H
#define _GPXE_IB_MI_H
/** @file
*
* Infiniband management interfaces
*
*/
FILE_LICENCE ( GPL2_OR_LATER );
#include <gpxe/list.h>
#include <gpxe/retry.h>
#include <gpxe/tables.h>
#include <gpxe/infiniband.h>
struct ib_mad_interface;
struct ib_mad_transaction;
/** An Infiniband management agent */
struct ib_mad_agent {
/** Management class */
uint8_t mgmt_class;
/** Class version */
uint8_t class_version;
/** Attribute (in network byte order) */
uint16_t attr_id;
/** Handle MAD
*
* @v ibdev Infiniband device
* @v mi Management interface
* @v mad Received MAD
* @v av Source address vector
* @ret rc Return status code
*/
void ( * handle ) ( struct ib_device *ibdev,
struct ib_mad_interface *mi,
union ib_mad *mad,
struct ib_address_vector *av );
};
/** Infiniband management agents */
#define IB_MAD_AGENTS __table ( struct ib_mad_agent, "ib_mad_agents" )
/** Declare an Infiniband management agent */
#define __ib_mad_agent __table_entry ( IB_MAD_AGENTS, 01 )
/** Infiniband management transaction operations */
struct ib_mad_transaction_operations {
/** Handle transaction completion
*
* @v ibdev Infiniband device
* @v mi Management interface
* @v madx Management transaction
* @v rc Status code
* @v mad Received MAD (or NULL on error)
* @v av Source address vector (or NULL on error)
*
* The completion handler should in most cases call
* ib_destroy_madx() to free up the completed transaction.
*/
void ( * complete ) ( struct ib_device *ibdev,
struct ib_mad_interface *mi,
struct ib_mad_transaction *madx,
int rc, union ib_mad *mad,
struct ib_address_vector *av );
};
/** An Infiniband management transaction */
struct ib_mad_transaction {
/** Associated management interface */
struct ib_mad_interface *mi;
/** List of transactions */
struct list_head list;
/** Retry timer */
struct retry_timer timer;
/** Destination address vector */
struct ib_address_vector av;
/** MAD being sent */
union ib_mad mad;
/** Transaction operations */
struct ib_mad_transaction_operations *op;
/** Owner private data */
void *owner_priv;
};
/** An Infiniband management interface */
struct ib_mad_interface {
/** Infiniband device */
struct ib_device *ibdev;
/** Completion queue */
struct ib_completion_queue *cq;
/** Queue pair */
struct ib_queue_pair *qp;
/** List of management transactions */
struct list_head madx;
};
/**
* Set Infiniband management transaction owner-private data
*
* @v madx Management transaction
* @v priv Private data
*/
static inline __always_inline void
ib_madx_set_ownerdata ( struct ib_mad_transaction *madx, void *priv ) {
madx->owner_priv = priv;
}
/**
* Get Infiniband management transaction owner-private data
*
* @v madx Management transaction
* @ret priv Private data
*/
static inline __always_inline void *
ib_madx_get_ownerdata ( struct ib_mad_transaction *madx ) {
return madx->owner_priv;
}
extern int ib_mi_send ( struct ib_device *ibdev, struct ib_mad_interface *mi,
union ib_mad *mad, struct ib_address_vector *av );
extern struct ib_mad_transaction *
ib_create_madx ( struct ib_device *ibdev, struct ib_mad_interface *mi,
union ib_mad *mad, struct ib_address_vector *av,
struct ib_mad_transaction_operations *op );
extern void ib_destroy_madx ( struct ib_device *ibdev,
struct ib_mad_interface *mi,
struct ib_mad_transaction *madx );
extern struct ib_mad_interface * ib_create_mi ( struct ib_device *ibdev,
enum ib_queue_pair_type type );
extern void ib_destroy_mi ( struct ib_device *ibdev,
struct ib_mad_interface *mi );
#endif /* _GPXE_IB_MI_H */