IPOIB_META_NUM_CQES, &ipoib_meta_cq_op,
IPOIB_META_NUM_SEND_WQES,
IPOIB_META_NUM_RECV_WQES,
- IPOIB_PKT_LEN, IB_GLOBAL_QKEY ) ) != 0 ) {
+ IB_GLOBAL_QKEY ) ) != 0 ) {
DBGC ( ipoib, "IPoIB %p could not allocate metadata QP: %s\n",
ipoib, strerror ( rc ) );
goto err_create_meta_qset;
IPOIB_DATA_NUM_CQES, &ipoib_data_cq_op,
IPOIB_DATA_NUM_SEND_WQES,
IPOIB_DATA_NUM_RECV_WQES,
- IPOIB_PKT_LEN, IB_GLOBAL_QKEY ) ) != 0 ) {
+ IB_GLOBAL_QKEY ) ) != 0 ) {
DBGC ( ipoib, "IPoIB %p could not allocate data QP: %s\n",
ipoib, strerror ( rc ) );
goto err_create_data_qset;
if ( netdev ) {
netdev->ll_protocol = &ipoib_protocol;
netdev->ll_broadcast = ( uint8_t * ) &ipoib_broadcast;
- netdev->max_pkt_len = IPOIB_PKT_LEN;
+ netdev->max_pkt_len = IB_MAX_PAYLOAD_SIZE;
}
return netdev;
}
struct ib_queue_pair *qp;
/** Receive work queue maximum fill level */
unsigned int recv_max_fill;
- /** Receive packet length */
- size_t recv_pkt_len;
};
extern int ib_create_qset ( struct ib_device *ibdev,
struct ib_queue_set *qset, unsigned int num_cqes,
struct ib_completion_queue_operations *cq_op,
unsigned int num_send_wqes,
- unsigned int num_recv_wqes, size_t recv_pkt_len,
- unsigned long qkey );
+ unsigned int num_recv_wqes, unsigned long qkey );
extern void ib_qset_refill_recv ( struct ib_device *ibdev,
struct ib_queue_set *qset );
extern void ib_destroy_qset ( struct ib_device *ibdev,
struct process poll;
};
-/** SMA payload size allocated for received packets */
-#define IB_SMA_PAYLOAD_LEN 2048
-
/** SMA number of send WQEs
*
* This is a policy decision.
/** Subnet administrator queue key */
#define IB_GLOBAL_QKEY 0x80010000UL
+/**
+ * Maximum payload size
+ *
+ * This is currently hard-coded in various places (drivers, subnet
+ * management agent, etc.) to 2048.
+ */
+#define IB_MAX_PAYLOAD_SIZE 2048
+
struct ib_device;
struct ib_queue_pair;
struct ib_address_vector;
#include <gpxe/infiniband.h>
-/** IPoIB packet length */
-#define IPOIB_PKT_LEN 2048
-
/** IPoIB MAC address length */
#define IPOIB_ALEN 20
struct io_buffer *iobuf ) {
int rc;
+ /* Check packet length */
+ if ( iob_tailroom ( iobuf ) < IB_MAX_PAYLOAD_SIZE ) {
+ DBGC ( ibdev, "IBDEV %p QPN %#lx wrong RX buffer size (%zd)\n",
+ ibdev, qp->qpn, iob_tailroom ( iobuf ) );
+ return -EINVAL;
+ }
+
/* Check queue fill level */
if ( qp->recv.fill >= qp->recv.num_wqes ) {
DBGC ( ibdev, "IBDEV %p QPN %#lx receive queue full\n",
* @v cq_op Completion queue operations
* @v num_send_wqes Number of send work queue entries
* @v num_recv_wqes Number of receive work queue entries
- * @v recv_pkt_len Receive packet length
* @v qkey Queue key
* @ret rc Return status code
*/
unsigned int num_cqes,
struct ib_completion_queue_operations *cq_op,
unsigned int num_send_wqes, unsigned int num_recv_wqes,
- size_t recv_pkt_len, unsigned long qkey ) {
+ unsigned long qkey ) {
int rc;
/* Sanity check */
/* Store queue parameters */
qset->recv_max_fill = num_recv_wqes;
- qset->recv_pkt_len = recv_pkt_len;
/* Allocate completion queue */
qset->cq = ib_create_cq ( ibdev, num_cqes, cq_op );
while ( qset->qp->recv.fill < qset->recv_max_fill ) {
/* Allocate I/O buffer */
- iobuf = alloc_iob ( qset->recv_pkt_len );
+ iobuf = alloc_iob ( IB_MAX_PAYLOAD_SIZE );
if ( ! iobuf ) {
/* Non-fatal; we will refill on next attempt */
return;
while ( sma->qp->recv.fill < IB_SMA_NUM_RECV_WQES ) {
/* Allocate I/O buffer */
- iobuf = alloc_iob ( IB_SMA_PAYLOAD_LEN );
+ iobuf = alloc_iob ( IB_MAX_PAYLOAD_SIZE );
if ( ! iobuf ) {
/* Non-fatal; we will refill on next attempt */
return;