iPXE
ipoib.c File Reference

IP over Infiniband. More...

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <byteswap.h>
#include <errno.h>
#include <ipxe/errortab.h>
#include <ipxe/malloc.h>
#include <ipxe/if_arp.h>
#include <ipxe/arp.h>
#include <ipxe/if_ether.h>
#include <ipxe/ethernet.h>
#include <ipxe/ip.h>
#include <ipxe/iobuf.h>
#include <ipxe/netdevice.h>
#include <ipxe/infiniband.h>
#include <ipxe/ib_pathrec.h>
#include <ipxe/ib_mcast.h>
#include <ipxe/retry.h>
#include <ipxe/ipoib.h>

Go to the source code of this file.

Data Structures

struct  ipoib_broadcast
 An IPoIB broadcast address. More...
struct  ipoib_device
 An IPoIB device. More...
struct  ipoib_peer
 An IPoIB REMAC cache entry. More...

Macros

#define ENXIO_ARP_REPLY   __einfo_error ( EINFO_ENXIO_ARP_REPLY )
#define EINFO_ENXIO_ARP_REPLY
#define ENXIO_NON_IPV4   __einfo_error ( EINFO_ENXIO_NON_IPV4 )
#define EINFO_ENXIO_NON_IPV4
#define ENXIO_ARP_SENT   __einfo_error ( EINFO_ENXIO_ARP_SENT )
#define EINFO_ENXIO_ARP_SENT
#define IPOIB_NUM_SEND_WQES   8
 Number of IPoIB send work queue entries.
#define IPOIB_NUM_RECV_WQES   4
 Number of IPoIB receive work queue entries.
#define IPOIB_NUM_CQES   16
 Number of IPoIB completion entries.
#define EINPROGRESS_JOINING   __einfo_error ( EINFO_EINPROGRESS_JOINING )
 Link status for "broadcast join in progress".
#define EINFO_EINPROGRESS_JOINING

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
static LIST_HEAD (ipoib_devices)
 List of all IPoIB devices.
static struct ipoib_macipoib_find_remac (struct ipoib_device *ipoib, const struct ipoib_remac *remac)
 Find IPoIB MAC from REMAC.
static int ipoib_map_remac (struct ipoib_device *ipoib, const struct ipoib_remac *remac, const struct ipoib_mac *mac)
 Add IPoIB MAC to REMAC cache.
static void ipoib_flush_remac (struct ipoib_device *ipoib)
 Flush REMAC cache.
static unsigned int ipoib_discard_remac (void)
 Discard some entries from the REMAC cache.
struct cache_discarder ipoib_discarder __cache_discarder (CACHE_EXPENSIVE)
 IPoIB cache discarder.
static void ipoib_init_addr (const void *hw_addr, void *ll_addr)
 Initialise IPoIB link-layer address.
struct net_devicealloc_ipoibdev (size_t priv_size)
 Allocate IPoIB device.
static int ipoib_translate_tx_arp (struct net_device *netdev, struct io_buffer *iobuf)
 Translate transmitted ARP packet.
static int ipoib_translate_tx (struct net_device *netdev, struct io_buffer *iobuf, uint16_t net_proto)
 Translate transmitted packet.
static int ipoib_translate_rx_arp (struct net_device *netdev, struct io_buffer *iobuf, struct ipoib_remac *remac)
 Translate received ARP packet.
static int ipoib_translate_rx (struct net_device *netdev, struct io_buffer *iobuf, struct ipoib_remac *remac, uint16_t net_proto)
 Translate received packet.
static int ipoib_transmit (struct net_device *netdev, struct io_buffer *iobuf)
 Transmit packet via IPoIB network device.
static void ipoib_complete_send (struct ib_device *ibdev __unused, struct ib_queue_pair *qp, struct io_buffer *iobuf, int rc)
 Handle IPoIB send completion.
static void ipoib_complete_recv (struct ib_device *ibdev __unused, struct ib_queue_pair *qp, struct ib_address_vector *dest, struct ib_address_vector *source, struct io_buffer *iobuf, int rc)
 Handle IPoIB receive completion.
static struct io_bufferipoib_alloc_iob (size_t len)
 Allocate IPoIB receive I/O buffer.
static void ipoib_poll (struct net_device *netdev)
 Poll IPoIB network device.
void ipoib_join_complete (struct ib_mc_membership *membership, int rc)
 Handle IPv4 broadcast multicast group join completion.
static int ipoib_join_broadcast_group (struct ipoib_device *ipoib)
 Join IPv4 broadcast multicast group.
static void ipoib_leave_broadcast_group (struct ipoib_device *ipoib)
 Leave IPv4 broadcast multicast group.
static void ipoib_link_state_changed (struct ipoib_device *ipoib)
 Handle link status change.
static int ipoib_open (struct net_device *netdev)
 Open IPoIB network device.
static void ipoib_close (struct net_device *netdev)
 Close IPoIB network device.
static int ipoib_probe (struct ib_device *ibdev)
 Probe IPoIB device.
static void ipoib_notify (struct ib_device *ibdev)
 Handle device or link status change.
static void ipoib_remove (struct ib_device *ibdev)
 Remove IPoIB device.
struct net_deviceipoib_netdev (struct ib_device *ibdev)
 Find IPoIB network device.

Variables

static struct ipoib_mac ipoib_broadcast
 Broadcast IPoIB address.
struct errortab ipoib_errors[] __errortab
 Human-readable message for the link status.
static struct net_device_operations ipoib_operations
 IPoIB network device operations.
struct ll_protocol ipoib_protocol __ll_protocol
 IPoIB protocol.
static struct ib_completion_queue_operations ipoib_cq_op
 IPoIB completion operations.
static struct ib_queue_pair_operations ipoib_qp_op
 IPoIB queue pair operations.
struct ib_driver ipoib_driver __ib_driver
 IPoIB driver.

Detailed Description

IP over Infiniband.

Definition in file ipoib.c.

Macro Definition Documentation

◆ ENXIO_ARP_REPLY

#define ENXIO_ARP_REPLY   __einfo_error ( EINFO_ENXIO_ARP_REPLY )

Definition at line 54 of file ipoib.c.

Referenced by ipoib_translate_tx_arp().

◆ EINFO_ENXIO_ARP_REPLY

#define EINFO_ENXIO_ARP_REPLY
Value:
"Missing REMAC for ARP reply target address" )
#define __einfo_uniqify(einfo_base, uniq, desc)
Declare disambiguated error.
Definition errno.h:181
#define EINFO_ENXIO
Definition errno.h:601

Definition at line 55 of file ipoib.c.

55#define EINFO_ENXIO_ARP_REPLY \
56 __einfo_uniqify ( EINFO_ENXIO, 0x01, \
57 "Missing REMAC for ARP reply target address" )

◆ ENXIO_NON_IPV4

#define ENXIO_NON_IPV4   __einfo_error ( EINFO_ENXIO_NON_IPV4 )

Definition at line 58 of file ipoib.c.

Referenced by ipoib_transmit().

◆ EINFO_ENXIO_NON_IPV4

#define EINFO_ENXIO_NON_IPV4
Value:
"Missing REMAC for non-IPv4 packet" )

Definition at line 59 of file ipoib.c.

59#define EINFO_ENXIO_NON_IPV4 \
60 __einfo_uniqify ( EINFO_ENXIO, 0x02, \
61 "Missing REMAC for non-IPv4 packet" )

◆ ENXIO_ARP_SENT

#define ENXIO_ARP_SENT   __einfo_error ( EINFO_ENXIO_ARP_SENT )

Definition at line 62 of file ipoib.c.

Referenced by ipoib_transmit().

◆ EINFO_ENXIO_ARP_SENT

#define EINFO_ENXIO_ARP_SENT
Value:
"Missing REMAC for IPv4 packet (ARP sent)" )

Definition at line 63 of file ipoib.c.

63#define EINFO_ENXIO_ARP_SENT \
64 __einfo_uniqify ( EINFO_ENXIO, 0x03, \
65 "Missing REMAC for IPv4 packet (ARP sent)" )

◆ IPOIB_NUM_SEND_WQES

#define IPOIB_NUM_SEND_WQES   8

Number of IPoIB send work queue entries.

Definition at line 68 of file ipoib.c.

Referenced by ipoib_open().

◆ IPOIB_NUM_RECV_WQES

#define IPOIB_NUM_RECV_WQES   4

Number of IPoIB receive work queue entries.

Definition at line 71 of file ipoib.c.

Referenced by ipoib_open().

◆ IPOIB_NUM_CQES

#define IPOIB_NUM_CQES   16

Number of IPoIB completion entries.

Definition at line 74 of file ipoib.c.

Referenced by ipoib_open().

◆ EINPROGRESS_JOINING

#define EINPROGRESS_JOINING   __einfo_error ( EINFO_EINPROGRESS_JOINING )

Link status for "broadcast join in progress".

Definition at line 114 of file ipoib.c.

◆ EINFO_EINPROGRESS_JOINING

#define EINFO_EINPROGRESS_JOINING
Value:
( EINFO_EINPROGRESS, 0x01, "Joining" )
#define EINFO_EINPROGRESS
Definition errno.h:420

Definition at line 115 of file ipoib.c.

115#define EINFO_EINPROGRESS_JOINING __einfo_uniqify \
116 ( EINFO_EINPROGRESS, 0x01, "Joining" )

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ LIST_HEAD()

LIST_HEAD ( ipoib_devices )
static

List of all IPoIB devices.

◆ ipoib_find_remac()

struct ipoib_mac * ipoib_find_remac ( struct ipoib_device * ipoib,
const struct ipoib_remac * remac )
static

Find IPoIB MAC from REMAC.

Parameters
ipoibIPoIB device
remacRemote Ethernet MAC
Return values
macIPoIB MAC (or NULL if not found)

Definition at line 152 of file ipoib.c.

153 {
154 struct ipoib_peer *peer;
155
156 /* Check for broadcast or multicast REMAC. We transmit
157 * multicasts as broadcasts for simplicity.
158 */
160 return &ipoib->broadcast.mac;
161
162 /* Try to find via REMAC cache */
163 list_for_each_entry ( peer, &ipoib->peers, list ) {
164 if ( memcmp ( remac, &peer->remac,
165 sizeof ( peer->remac ) ) == 0 ) {
166 /* Move peer to start of list */
167 list_del ( &peer->list );
168 list_add ( &peer->list, &ipoib->peers );
169 return &peer->mac;
170 }
171 }
172
173 DBGC ( ipoib, "IPoIB %p unknown REMAC %s\n",
174 ipoib, eth_ntoa ( remac ) );
175 return NULL;
176}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
Definition ethernet.c:176
static int is_multicast_ether_addr(const void *addr)
Check if Ethernet address is a multicast address.
Definition ethernet.h:38
#define DBGC(...)
Definition compiler.h:505
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition list.h:432
#define list_del(list)
Delete an entry from a list.
Definition list.h:120
#define list_add(new, head)
Add a new entry to the head of a list.
Definition list.h:70
struct mschapv2_challenge peer
Peer challenge.
Definition mschapv2.h:1
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition string.c:115
struct ipoib_mac mac
MAC address.
Definition ipoib.c:79
struct list_head peers
REMAC cache.
Definition ipoib.c:103
struct ipoib_broadcast broadcast
Broadcast address.
Definition ipoib.c:101
An IPoIB REMAC cache entry.
Definition ipoib.c:136
struct list_head list
List of REMAC cache entries.
Definition ipoib.c:138
struct ipoib_remac remac
Remote Ethermet MAC.
Definition ipoib.c:140

References ipoib_device::broadcast, DBGC, eth_ntoa(), is_multicast_ether_addr(), ipoib_peer::list, list_add, list_del, list_for_each_entry, ipoib_broadcast::mac, memcmp(), NULL, peer, ipoib_device::peers, and ipoib_peer::remac.

Referenced by ipoib_translate_tx_arp(), and ipoib_transmit().

◆ ipoib_map_remac()

int ipoib_map_remac ( struct ipoib_device * ipoib,
const struct ipoib_remac * remac,
const struct ipoib_mac * mac )
static

Add IPoIB MAC to REMAC cache.

Parameters
ipoibIPoIB device
remacRemote Ethernet MAC
macIPoIB MAC
Return values
rcReturn status code

Definition at line 186 of file ipoib.c.

188 {
189 struct ipoib_peer *peer;
190
191 /* Check for existing entry in REMAC cache */
192 list_for_each_entry ( peer, &ipoib->peers, list ) {
193 if ( memcmp ( remac, &peer->remac,
194 sizeof ( peer->remac ) ) == 0 ) {
195 /* Move peer to start of list */
196 list_del ( &peer->list );
197 list_add ( &peer->list, &ipoib->peers );
198 /* Update MAC */
199 memcpy ( &peer->mac, mac, sizeof ( peer->mac ) );
200 return 0;
201 }
202 }
203
204 /* Create new entry */
205 peer = malloc ( sizeof ( *peer ) );
206 if ( ! peer )
207 return -ENOMEM;
208 memcpy ( &peer->remac, remac, sizeof ( peer->remac ) );
209 memcpy ( &peer->mac, mac, sizeof ( peer->mac ) );
210 list_add ( &peer->list, &ipoib->peers );
211
212 return 0;
213}
uint8_t mac[ETH_ALEN]
MAC address.
Definition ena.h:13
#define ENOMEM
Not enough space.
Definition errno.h:535
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void * malloc(size_t size)
Allocate memory.
Definition malloc.c:621

References ENOMEM, ipoib_peer::list, list_add, list_del, list_for_each_entry, mac, malloc(), memcmp(), memcpy(), peer, ipoib_device::peers, and ipoib_peer::remac.

Referenced by ipoib_translate_rx_arp().

◆ ipoib_flush_remac()

void ipoib_flush_remac ( struct ipoib_device * ipoib)
static

Flush REMAC cache.

Parameters
ipoibIPoIB device

Definition at line 220 of file ipoib.c.

220 {
221 struct ipoib_peer *peer;
222 struct ipoib_peer *tmp;
223
225 list_del ( &peer->list );
226 free ( peer );
227 }
228}
unsigned long tmp
Definition linux_pci.h:65
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
Definition list.h:459
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55

References free, ipoib_peer::list, list_del, list_for_each_entry_safe, peer, ipoib_device::peers, and tmp.

Referenced by ipoib_close().

◆ ipoib_discard_remac()

unsigned int ipoib_discard_remac ( void )
static

Discard some entries from the REMAC cache.

Return values
discardedNumber of cached items discarded

Definition at line 235 of file ipoib.c.

235 {
236 struct net_device *netdev;
237 struct ipoib_device *ipoib;
238 struct ipoib_peer *peer;
239 unsigned int discarded = 0;
240
241 /* Try to discard one cache entry for each IPoIB device */
243
244 /* Skip non-IPoIB devices */
245 if ( netdev->op != &ipoib_operations )
246 continue;
247 ipoib = netdev->priv;
248
249 /* Discard least recently used cache entry (if any) */
251 list_del ( &peer->list );
252 free ( peer );
253 discarded++;
254 break;
255 }
256 }
257
258 return discarded;
259}
static struct net_device * netdev
Definition gdbudp.c:53
static struct net_device_operations ipoib_operations
IPoIB network device operations.
Definition ipoib.c:126
#define list_for_each_entry_reverse(pos, head, member)
Iterate over entries in a list in reverse order.
Definition list.h:445
#define for_each_netdev(netdev)
Iterate over all network devices.
Definition netdevice.h:547
An IPoIB device.
Definition ipoib.c:87
A network device.
Definition netdevice.h:353

References for_each_netdev, free, ipoib_operations, ipoib_peer::list, list_del, list_for_each_entry_reverse, netdev, peer, and ipoib_device::peers.

Referenced by __cache_discarder().

◆ __cache_discarder()

struct cache_discarder ipoib_discarder __cache_discarder ( CACHE_EXPENSIVE )

IPoIB cache discarder.

References __cache_discarder, CACHE_EXPENSIVE, and ipoib_discard_remac().

◆ ipoib_init_addr()

void ipoib_init_addr ( const void * hw_addr,
void * ll_addr )
static

Initialise IPoIB link-layer address.

Parameters
hw_addrHardware address
ll_addrLink-layer address

Definition at line 279 of file ipoib.c.

279 {
280 const uint8_t *guid = hw_addr;
281 uint8_t *eth_addr = ll_addr;
282 uint8_t guid_mask = IPOIB_GUID_MASK;
283 unsigned int i;
284
285 /* Extract bytes from GUID according to mask */
286 for ( i = 0 ; i < 8 ; i++, guid++, guid_mask <<= 1 ) {
287 if ( guid_mask & 0x80 )
288 *(eth_addr++) = *guid;
289 }
290}
unsigned char uint8_t
Definition stdint.h:10
uint64_t guid
GUID.
Definition edd.h:1
#define IPOIB_GUID_MASK
GUID mask used for constructing eIPoIB Local Ethernet MAC address (LEMAC)
Definition ipoib.h:41

References guid, and IPOIB_GUID_MASK.

◆ alloc_ipoibdev()

struct net_device * alloc_ipoibdev ( size_t priv_size)

Allocate IPoIB device.

Parameters
priv_sizeSize of driver private data
Return values
netdevNetwork device, or NULL

Definition at line 315 of file ipoib.c.

315 {
316 struct net_device *netdev;
317
318 netdev = alloc_netdev ( priv_size );
319 if ( netdev ) {
320 netdev->ll_protocol = &ipoib_protocol;
321 netdev->ll_broadcast = eth_broadcast;
322 netdev->max_pkt_len = IB_MAX_PAYLOAD_SIZE;
323 }
324 return netdev;
325}
uint8_t eth_broadcast[ETH_ALEN]
Ethernet broadcast MAC address.
Definition ethernet.c:48
#define IB_MAX_PAYLOAD_SIZE
Maximum payload size.
Definition infiniband.h:51
struct net_device * alloc_netdev(size_t priv_len)
Allocate network device.
Definition netdevice.c:722

References alloc_netdev(), eth_broadcast, IB_MAX_PAYLOAD_SIZE, and netdev.

Referenced by ipoib_probe().

◆ ipoib_translate_tx_arp()

int ipoib_translate_tx_arp ( struct net_device * netdev,
struct io_buffer * iobuf )
static

Translate transmitted ARP packet.

Parameters
netdevNetwork device
iobufPacket to be transmitted (with no link-layer headers)
Return values
rcReturn status code

Definition at line 341 of file ipoib.c.

342 {
343 struct ipoib_device *ipoib = netdev->priv;
344 struct arphdr *arphdr = iobuf->data;
345 struct ipoib_mac *target_ha = NULL;
346 void *sender_pa;
347 void *target_pa;
348
349 /* Do nothing unless ARP contains eIPoIB link-layer addresses */
350 if ( arphdr->ar_hln != ETH_ALEN )
351 return 0;
352
353 /* Fail unless we have room to expand packet */
354 if ( iob_tailroom ( iobuf ) < ( 2 * ( sizeof ( ipoib->mac ) -
355 ETH_ALEN ) ) ) {
356 DBGC ( ipoib, "IPoIB %p insufficient space in TX ARP\n",
357 ipoib );
358 return -ENOBUFS;
359 }
360
361 /* Look up REMAC, if applicable */
362 if ( arphdr->ar_op == ARPOP_REPLY ) {
363 target_ha = ipoib_find_remac ( ipoib, arp_target_pa ( arphdr ));
364 if ( ! target_ha ) {
365 DBGC ( ipoib, "IPoIB %p no REMAC for %s ARP reply\n",
366 ipoib, eth_ntoa ( arp_target_pa ( arphdr ) ) );
367 return -ENXIO_ARP_REPLY;
368 }
369 }
370
371 /* Construct new packet */
372 iob_put ( iobuf, ( 2 * ( sizeof ( ipoib->mac ) - ETH_ALEN ) ) );
373 sender_pa = arp_sender_pa ( arphdr );
374 target_pa = arp_target_pa ( arphdr );
376 arphdr->ar_hln = sizeof ( ipoib->mac );
377 memcpy ( arp_target_pa ( arphdr ), target_pa, arphdr->ar_pln );
378 memcpy ( arp_sender_pa ( arphdr ), sender_pa, arphdr->ar_pln );
379 memcpy ( arp_sender_ha ( arphdr ), &ipoib->mac, sizeof ( ipoib->mac ) );
380 memset ( arp_target_ha ( arphdr ), 0, sizeof ( ipoib->mac ) );
381 if ( target_ha ) {
382 memcpy ( arp_target_ha ( arphdr ), target_ha,
383 sizeof ( *target_ha ) );
384 }
385
386 return 0;
387}
#define ENOBUFS
No buffer space available.
Definition errno.h:499
static void * arp_sender_pa(struct arphdr *arphdr)
ARP packet sender protocol address.
Definition if_arp.h:81
static void * arp_target_ha(struct arphdr *arphdr)
ARP packet target hardware address.
Definition if_arp.h:90
static void * arp_target_pa(struct arphdr *arphdr)
ARP packet target protocol address.
Definition if_arp.h:99
#define ARPOP_REPLY
ARP reply.
Definition if_arp.h:34
#define ARPHRD_INFINIBAND
InfiniBand.
Definition if_arp.h:30
static void * arp_sender_ha(struct arphdr *arphdr)
ARP packet sender hardware address.
Definition if_arp.h:72
#define ETH_ALEN
Definition if_ether.h:9
#define htons(value)
Definition byteswap.h:136
void * memset(void *dest, int character, size_t len) __nonnull
#define iob_put(iobuf, len)
Definition iobuf.h:125
static size_t iob_tailroom(struct io_buffer *iobuf)
Calculate available space at end of an I/O buffer.
Definition iobuf.h:180
#define ENXIO_ARP_REPLY
Definition ipoib.c:54
static struct ipoib_mac * ipoib_find_remac(struct ipoib_device *ipoib, const struct ipoib_remac *remac)
Find IPoIB MAC from REMAC.
Definition ipoib.c:152
An ARP header.
Definition if_arp.h:48
uint8_t ar_hln
Link-layer address length.
Definition if_arp.h:60
uint16_t ar_op
ARP opcode.
Definition if_arp.h:64
uint8_t ar_pln
Network-layer address length.
Definition if_arp.h:62
uint16_t ar_hrd
Link-layer protocol.
Definition if_arp.h:53
void * data
Start of data.
Definition iobuf.h:53
struct ipoib_mac mac
Local MAC.
Definition ipoib.c:99
An IPoIB MAC address.
Definition ipoib.h:18

References arphdr::ar_hln, arphdr::ar_hrd, arphdr::ar_op, arphdr::ar_pln, arp_sender_ha(), arp_sender_pa(), arp_target_ha(), arp_target_pa(), ARPHRD_INFINIBAND, ARPOP_REPLY, io_buffer::data, DBGC, ENOBUFS, ENXIO_ARP_REPLY, ETH_ALEN, eth_ntoa(), htons, iob_put, iob_tailroom(), ipoib_find_remac(), ipoib_device::mac, memcpy(), memset(), netdev, and NULL.

Referenced by ipoib_translate_tx().

◆ ipoib_translate_tx()

int ipoib_translate_tx ( struct net_device * netdev,
struct io_buffer * iobuf,
uint16_t net_proto )
static

Translate transmitted packet.

Parameters
netdevNetwork device
iobufPacket to be transmitted (with no link-layer headers)
net_protoNetwork-layer protocol (in network byte order)
Return values
rcReturn status code

Definition at line 397 of file ipoib.c.

398 {
399
400 switch ( net_proto ) {
401 case htons ( ETH_P_ARP ) :
403 case htons ( ETH_P_IP ) :
404 /* No translation needed */
405 return 0;
406 default:
407 /* Cannot handle other traffic via eIPoIB */
408 return -ENOTSUP;
409 }
410}
#define ENOTSUP
Operation not supported.
Definition errno.h:590
#define ETH_P_IP
Definition if_ether.h:19
#define ETH_P_ARP
Definition if_ether.h:20
static int ipoib_translate_tx_arp(struct net_device *netdev, struct io_buffer *iobuf)
Translate transmitted ARP packet.
Definition ipoib.c:341
return
Definition natsemi.h:326

References ENOTSUP, ETH_P_ARP, ETH_P_IP, htons, ipoib_translate_tx_arp(), and netdev.

Referenced by ipoib_transmit().

◆ ipoib_translate_rx_arp()

int ipoib_translate_rx_arp ( struct net_device * netdev,
struct io_buffer * iobuf,
struct ipoib_remac * remac )
static

Translate received ARP packet.

Parameters
netdevNetwork device
iobufReceived packet (with no link-layer headers)
remacConstructed Remote Ethernet MAC
Return values
rcReturn status code

Definition at line 420 of file ipoib.c.

422 {
423 struct ipoib_device *ipoib = netdev->priv;
424 struct arphdr *arphdr = iobuf->data;
425 void *sender_pa;
426 void *target_pa;
427 int rc;
428
429 /* Do nothing unless ARP contains IPoIB link-layer addresses */
430 if ( arphdr->ar_hln != sizeof ( ipoib->mac ) )
431 return 0;
432
433 /* Create REMAC cache entry */
434 if ( ( rc = ipoib_map_remac ( ipoib, remac,
435 arp_sender_ha ( arphdr ) ) ) != 0 ) {
436 DBGC ( ipoib, "IPoIB %p could not map REMAC: %s\n",
437 ipoib, strerror ( rc ) );
438 return rc;
439 }
440
441 /* Construct new packet */
442 sender_pa = arp_sender_pa ( arphdr );
443 target_pa = arp_target_pa ( arphdr );
446 memcpy ( arp_sender_pa ( arphdr ), sender_pa, arphdr->ar_pln );
447 memcpy ( arp_target_pa ( arphdr ), target_pa, arphdr->ar_pln );
448 memcpy ( arp_sender_ha ( arphdr ), remac, ETH_ALEN );
450 if ( arphdr->ar_op == ARPOP_REPLY ) {
451 /* Assume received replies were directed to us */
452 memcpy ( arp_target_ha ( arphdr ), netdev->ll_addr, ETH_ALEN );
453 }
454 iob_unput ( iobuf, ( 2 * ( sizeof ( ipoib->mac ) - ETH_ALEN ) ) );
455
456 return 0;
457}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
#define ARPHRD_ETHER
Ethernet 10Mbps.
Definition if_arp.h:17
#define iob_unput(iobuf, len)
Definition iobuf.h:140
static int ipoib_map_remac(struct ipoib_device *ipoib, const struct ipoib_remac *remac, const struct ipoib_mac *mac)
Add IPoIB MAC to REMAC cache.
Definition ipoib.c:186
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79

References arphdr::ar_hln, arphdr::ar_hrd, arphdr::ar_op, arphdr::ar_pln, arp_sender_ha(), arp_sender_pa(), arp_target_ha(), arp_target_pa(), ARPHRD_ETHER, ARPOP_REPLY, io_buffer::data, DBGC, ETH_ALEN, htons, iob_unput, ipoib_map_remac(), ipoib_device::mac, memcpy(), memset(), netdev, rc, and strerror().

Referenced by ipoib_translate_rx().

◆ ipoib_translate_rx()

int ipoib_translate_rx ( struct net_device * netdev,
struct io_buffer * iobuf,
struct ipoib_remac * remac,
uint16_t net_proto )
static

Translate received packet.

Parameters
netdevNetwork device
iobufReceived packet (with no link-layer headers)
remacConstructed Remote Ethernet MAC
net_protoNetwork-layer protocol (in network byte order)
Return values
rcReturn status code

Definition at line 468 of file ipoib.c.

471 {
472
473 switch ( net_proto ) {
474 case htons ( ETH_P_ARP ) :
475 return ipoib_translate_rx_arp ( netdev, iobuf, remac );
476 case htons ( ETH_P_IP ) :
477 /* No translation needed */
478 return 0;
479 default:
480 /* Cannot handle other traffic via eIPoIB */
481 return -ENOTSUP;
482 }
483}
static int ipoib_translate_rx_arp(struct net_device *netdev, struct io_buffer *iobuf, struct ipoib_remac *remac)
Translate received ARP packet.
Definition ipoib.c:420

References ENOTSUP, ETH_P_ARP, ETH_P_IP, htons, ipoib_translate_rx_arp(), and netdev.

Referenced by ipoib_complete_recv().

◆ ipoib_transmit()

int ipoib_transmit ( struct net_device * netdev,
struct io_buffer * iobuf )
static

Transmit packet via IPoIB network device.

Parameters
netdevNetwork device
iobufI/O buffer
Return values
rcReturn status code

Definition at line 499 of file ipoib.c.

500 {
501 struct ipoib_device *ipoib = netdev->priv;
502 struct ib_device *ibdev = ipoib->ibdev;
503 struct ethhdr *ethhdr;
504 struct iphdr *iphdr;
505 struct ipoib_hdr *ipoib_hdr;
506 struct ipoib_remac *remac;
507 struct ipoib_mac *mac;
508 struct ib_address_vector *dest;
509 struct ib_address_vector av;
510 uint16_t net_proto;
511 int rc;
512
513 /* Sanity check */
514 if ( iob_len ( iobuf ) < sizeof ( *ethhdr ) ) {
515 DBGC ( ipoib, "IPoIB %p buffer too short\n", ipoib );
516 return -EINVAL;
517 }
518
519 /* Attempting transmission while link is down will put the
520 * queue pair into an error state, so don't try it.
521 */
522 if ( ! ib_link_ok ( ibdev ) )
523 return -ENETUNREACH;
524
525 /* Strip eIPoIB header */
526 ethhdr = iobuf->data;
527 remac = ( ( struct ipoib_remac * ) ethhdr->h_dest );
528 net_proto = ethhdr->h_protocol;
529 iob_pull ( iobuf, sizeof ( *ethhdr ) );
530
531 /* Identify destination address */
532 if ( is_multicast_ether_addr ( remac ) ) {
533
534 /* Transmit multicasts as broadcasts, for simplicity */
535 dest = &ipoib->broadcast.av;
536
537 } else if ( ( mac = ipoib_find_remac ( ipoib, remac ) ) ) {
538
539 /* Construct address vector from IPoIB MAC */
540 dest = &av;
541 memset ( dest, 0, sizeof ( *dest ) );
542 dest->qpn = ( ntohl ( mac->flags__qpn ) & IB_QPN_MASK );
543 dest->qkey = ipoib->broadcast.av.qkey;
544 dest->gid_present = 1;
545 memcpy ( &dest->gid, &mac->gid, sizeof ( dest->gid ) );
546 if ( ( rc = ib_resolve_path ( ibdev, dest ) ) != 0 ) {
547 /* Path not resolved yet */
548 return rc;
549 }
550
551 } else {
552
553 /* Generate a new ARP request (if possible) to trigger
554 * population of the REMAC cache entry.
555 */
556 if ( ( net_proto != htons ( ETH_P_IP ) ) ||
557 ( iob_len ( iobuf ) < sizeof ( *iphdr ) ) ) {
558 DBGC ( ipoib, "IPoIB %p no REMAC for %s non-IPv4 "
559 "packet type %04x\n", ipoib,
561 ntohs ( net_proto ) );
562 return -ENXIO_NON_IPV4;
563 }
564 iphdr = iobuf->data;
565 if ( ( rc = arp_tx_request ( netdev, &ipv4_protocol,
566 &iphdr->dest, &iphdr->src ) ) !=0){
567 DBGC ( ipoib, "IPoIB %p could not ARP for %s/%s/",
568 ipoib, eth_ntoa ( ethhdr->h_dest ),
569 inet_ntoa ( iphdr->dest ) );
570 DBGC ( ipoib, "%s: %s\n", inet_ntoa ( iphdr->src ),
571 strerror ( rc ) );
572 return rc;
573 }
574 DBGC ( ipoib, "IPoIB %p no REMAC for %s/%s/", ipoib,
576 DBGC ( ipoib, "%s\n", inet_ntoa ( iphdr->src ) );
577 return -ENXIO_ARP_SENT;
578 }
579
580 /* Translate packet if applicable */
581 if ( ( rc = ipoib_translate_tx ( netdev, iobuf, net_proto ) ) != 0 )
582 return rc;
583
584 /* Prepend real IPoIB header */
585 ipoib_hdr = iob_push ( iobuf, sizeof ( *ipoib_hdr ) );
586 ipoib_hdr->proto = net_proto;
587 ipoib_hdr->reserved = 0;
588
589 /* Transmit packet */
590 return ib_post_send ( ibdev, ipoib->qp, dest, iobuf );
591}
unsigned short uint16_t
Definition stdint.h:11
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" retur dest)
Definition string.h:151
int arp_tx_request(struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest, const void *net_source)
Transmit ARP request.
Definition arp.c:60
#define EINVAL
Invalid argument.
Definition errno.h:429
#define ENETUNREACH
Network unreachable.
Definition errno.h:489
int ib_resolve_path(struct ib_device *ibdev, struct ib_address_vector *av)
Resolve path.
Definition ib_pathrec.c:249
#define ntohl(value)
Definition byteswap.h:135
#define ntohs(value)
Definition byteswap.h:137
int ib_post_send(struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_address_vector *dest, struct io_buffer *iobuf)
Post send work queue entry.
Definition infiniband.c:416
static __always_inline int ib_link_ok(struct ib_device *ibdev)
Check link state of Infiniband device.
Definition infiniband.h:566
#define IB_QPN_MASK
QPN mask.
Definition infiniband.h:37
#define iob_push(iobuf, len)
Definition iobuf.h:89
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition iobuf.h:160
#define iob_pull(iobuf, len)
Definition iobuf.h:107
#define ENXIO_NON_IPV4
Definition ipoib.c:58
static int ipoib_translate_tx(struct net_device *netdev, struct io_buffer *iobuf, uint16_t net_proto)
Translate transmitted packet.
Definition ipoib.c:397
#define ENXIO_ARP_SENT
Definition ipoib.c:62
char * inet_ntoa(struct in_addr in)
Convert IPv4 address to dotted-quad notation.
Definition ipv4.c:814
An Ethernet link-layer header.
Definition if_ether.h:32
uint16_t h_protocol
Protocol ID.
Definition if_ether.h:38
uint8_t h_dest[ETH_ALEN]
Destination MAC address.
Definition if_ether.h:34
An Infiniband Address Vector.
Definition infiniband.h:73
unsigned long qkey
Queue key.
Definition infiniband.h:80
An Infiniband device.
Definition infiniband.h:399
An IPv4 packet header.
Definition ip.h:36
struct in_addr dest
Definition ip.h:46
struct in_addr src
Definition ip.h:45
struct ib_address_vector av
Address vector.
Definition ipoib.c:81
struct ib_device * ibdev
Underlying Infiniband device.
Definition ipoib.c:91
struct ib_queue_pair * qp
Queue pair.
Definition ipoib.c:97
IPoIB link-layer header.
Definition ipoib.h:33
uint16_t reserved
Reserved, must be zero.
Definition ipoib.h:37
uint16_t proto
Network-layer protocol.
Definition ipoib.h:35
eIPoIB Remote Ethernet MAC address
Definition ipoib.h:48

References arp_tx_request(), ipoib_broadcast::av, ipoib_device::broadcast, io_buffer::data, DBGC, dest, iphdr::dest, EINVAL, ENETUNREACH, ENXIO_ARP_SENT, ENXIO_NON_IPV4, eth_ntoa(), ETH_P_IP, ethhdr::h_dest, ethhdr::h_protocol, htons, ib_link_ok(), ib_post_send(), IB_QPN_MASK, ib_resolve_path(), ipoib_device::ibdev, inet_ntoa(), iob_len(), iob_pull, iob_push, ipoib_find_remac(), ipoib_translate_tx(), is_multicast_ether_addr(), mac, memcpy(), memset(), netdev, ntohl, ntohs, ipoib_hdr::proto, ib_address_vector::qkey, ipoib_device::qp, rc, ipoib_hdr::reserved, iphdr::src, and strerror().

◆ ipoib_complete_send()

void ipoib_complete_send ( struct ib_device *ibdev __unused,
struct ib_queue_pair * qp,
struct io_buffer * iobuf,
int rc )
static

Handle IPoIB send completion.

Parameters
ibdevInfiniband device
qpQueue pair
iobufI/O buffer
rcCompletion status code

Definition at line 601 of file ipoib.c.

603 {
604 struct ipoib_device *ipoib = ib_qp_get_ownerdata ( qp );
605
606 netdev_tx_complete_err ( ipoib->netdev, iobuf, rc );
607}
struct arbelprm_qp_db_record qp
Definition arbel.h:2
static __always_inline void * ib_qp_get_ownerdata(struct ib_queue_pair *qp)
Get Infiniband queue pair owner-private data.
Definition infiniband.h:665
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition netdevice.c:471
struct net_device * netdev
Network device.
Definition ipoib.c:89

References __unused, ib_qp_get_ownerdata(), ipoib_device::netdev, netdev_tx_complete_err(), qp, and rc.

◆ ipoib_complete_recv()

void ipoib_complete_recv ( struct ib_device *ibdev __unused,
struct ib_queue_pair * qp,
struct ib_address_vector * dest,
struct ib_address_vector * source,
struct io_buffer * iobuf,
int rc )
static

Handle IPoIB receive completion.

Parameters
ibdevInfiniband device
qpQueue pair
destDestination address vector, or NULL
sourceSource address vector, or NULL
iobufI/O buffer
rcCompletion status code

Definition at line 619 of file ipoib.c.

623 {
624 struct ipoib_device *ipoib = ib_qp_get_ownerdata ( qp );
625 struct net_device *netdev = ipoib->netdev;
626 struct ipoib_hdr *ipoib_hdr;
627 struct ethhdr *ethhdr;
628 struct ipoib_remac remac;
629 uint16_t net_proto;
630
631 /* Record errors */
632 if ( rc != 0 ) {
633 netdev_rx_err ( netdev, iobuf, rc );
634 return;
635 }
636
637 /* Sanity check */
638 if ( iob_len ( iobuf ) < sizeof ( struct ipoib_hdr ) ) {
639 DBGC ( ipoib, "IPoIB %p received packet too short to "
640 "contain IPoIB header\n", ipoib );
641 DBGC_HD ( ipoib, iobuf->data, iob_len ( iobuf ) );
642 netdev_rx_err ( netdev, iobuf, -EIO );
643 return;
644 }
645 if ( ! source ) {
646 DBGC ( ipoib, "IPoIB %p received packet without address "
647 "vector\n", ipoib );
648 netdev_rx_err ( netdev, iobuf, -ENOTTY );
649 return;
650 }
651
652 /* Strip real IPoIB header */
653 ipoib_hdr = iobuf->data;
654 net_proto = ipoib_hdr->proto;
655 iob_pull ( iobuf, sizeof ( *ipoib_hdr ) );
656
657 /* Construct source address from remote QPN and LID */
658 remac.qpn = htonl ( source->qpn | EIPOIB_QPN_LA );
659 remac.lid = htons ( source->lid );
660
661 /* Translate packet if applicable */
662 if ( ( rc = ipoib_translate_rx ( netdev, iobuf, &remac,
663 net_proto ) ) != 0 ) {
664 netdev_rx_err ( netdev, iobuf, rc );
665 return;
666 }
667
668 /* Prepend eIPoIB header */
669 ethhdr = iob_push ( iobuf, sizeof ( *ethhdr ) );
670 memcpy ( &ethhdr->h_source, &remac, sizeof ( ethhdr->h_source ) );
671 ethhdr->h_protocol = net_proto;
672
673 /* Construct destination address */
674 if ( dest->gid_present && IB_GID_MULTICAST ( &dest->gid ) ) {
675 /* Multicast GID: use the Ethernet broadcast address */
677 sizeof ( ethhdr->h_dest ) );
678 } else {
679 /* Assume destination address is local Ethernet MAC */
680 memcpy ( &ethhdr->h_dest, netdev->ll_addr,
681 sizeof ( ethhdr->h_dest ) );
682 }
683
684 /* Hand off to network layer */
685 netdev_rx ( netdev, iobuf );
686}
#define DBGC_HD(...)
Definition compiler.h:507
#define EIO
Input/output error.
Definition errno.h:434
#define ENOTTY
Inappropriate I/O control operation.
Definition errno.h:595
#define IB_GID_MULTICAST(gid)
Test for multicast GID.
Definition ib_packet.h:53
#define htonl(value)
Definition byteswap.h:134
static int ipoib_translate_rx(struct net_device *netdev, struct io_buffer *iobuf, struct ipoib_remac *remac, uint16_t net_proto)
Translate received packet.
Definition ipoib.c:468
#define EIPOIB_QPN_LA
eIPoIB REMAC locally-assigned address indicator
Definition ipoib.h:61
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition netdevice.c:549
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition netdevice.c:587
uint8_t h_source[ETH_ALEN]
Source MAC address.
Definition if_ether.h:36
unsigned int lid
Local ID.
Definition infiniband.h:82
unsigned long qpn
Queue Pair Number.
Definition infiniband.h:75

References __unused, io_buffer::data, DBGC, DBGC_HD, dest, EIO, EIPOIB_QPN_LA, ENOTTY, eth_broadcast, ethhdr::h_dest, ethhdr::h_protocol, ethhdr::h_source, htonl, htons, IB_GID_MULTICAST, ib_qp_get_ownerdata(), iob_len(), iob_pull, iob_push, ipoib_translate_rx(), ib_address_vector::lid, ipoib_remac::lid, memcpy(), ipoib_device::netdev, netdev, netdev_rx(), netdev_rx_err(), ipoib_hdr::proto, qp, ib_address_vector::qpn, ipoib_remac::qpn, and rc.

◆ ipoib_alloc_iob()

struct io_buffer * ipoib_alloc_iob ( size_t len)
static

Allocate IPoIB receive I/O buffer.

Parameters
lenLength of buffer
Return values
iobufI/O buffer, or NULL

Some Infiniband hardware requires 2kB alignment of receive buffers and provides no way to disable header separation. The result is that there are only four bytes of link-layer header (the real IPoIB header) before the payload. This is not sufficient space to insert an eIPoIB link-layer pseudo-header.

We therefore allocate I/O buffers offset to start slightly before the natural alignment boundary, in order to allow sufficient space.

Definition at line 709 of file ipoib.c.

709 {
710 struct io_buffer *iobuf;
711 size_t reserve_len;
712
713 /* Calculate additional length required at start of buffer */
714 reserve_len = ( sizeof ( struct ethhdr ) -
715 sizeof ( struct ipoib_hdr ) );
716
717 /* Allocate buffer */
718 iobuf = alloc_iob_raw ( ( len + reserve_len ), len, -reserve_len );
719 if ( iobuf ) {
720 iob_reserve ( iobuf, reserve_len );
721 }
722 return iobuf;
723}
ring len
Length.
Definition dwmac.h:226
struct io_buffer * alloc_iob_raw(size_t len, size_t align, size_t offset)
Allocate I/O buffer with specified alignment and offset.
Definition iobuf.c:49
#define iob_reserve(iobuf, len)
Definition iobuf.h:72
A persistent I/O buffer.
Definition iobuf.h:38

References alloc_iob_raw(), iob_reserve, and len.

◆ ipoib_poll()

void ipoib_poll ( struct net_device * netdev)
static

Poll IPoIB network device.

Parameters
netdevNetwork device

Definition at line 735 of file ipoib.c.

735 {
736 struct ipoib_device *ipoib = netdev->priv;
737 struct ib_device *ibdev = ipoib->ibdev;
738
739 /* Poll Infiniband device */
740 ib_poll_eq ( ibdev );
741
742 /* Poll the retry timers (required for IPoIB multicast join) */
743 retry_poll();
744}
void ib_poll_eq(struct ib_device *ibdev)
Poll event queue.
Definition infiniband.c:878
void retry_poll(void)
Poll the retry timer list.
Definition retry.c:198

References ib_poll_eq(), ipoib_device::ibdev, netdev, and retry_poll().

◆ ipoib_join_complete()

void ipoib_join_complete ( struct ib_mc_membership * membership,
int rc )

Handle IPv4 broadcast multicast group join completion.

Parameters
membershipMulticast group membership
rcStatus code

Definition at line 752 of file ipoib.c.

752 {
753 struct ipoib_device *ipoib = container_of ( membership,
754 struct ipoib_device,
756
757 /* Record join status as link status */
758 netdev_link_err ( ipoib->netdev, rc );
759}
void netdev_link_err(struct net_device *netdev, int rc)
Mark network device as having a specific link state.
Definition netdevice.c:208
#define container_of(ptr, type, field)
Get containing structure.
Definition stddef.h:36
struct ib_mc_membership membership
Multicast group membership.
Definition ipoib.c:83

References ipoib_device::broadcast, container_of, ipoib_broadcast::membership, ipoib_device::netdev, netdev_link_err(), and rc.

Referenced by ipoib_join_broadcast_group().

◆ ipoib_join_broadcast_group()

int ipoib_join_broadcast_group ( struct ipoib_device * ipoib)
static

Join IPv4 broadcast multicast group.

Parameters
ipoibIPoIB device
Return values
rcReturn status code

Definition at line 767 of file ipoib.c.

767 {
768 int rc;
769
770 /* Join multicast group */
771 if ( ( rc = ib_mcast_join ( ipoib->ibdev, ipoib->qp,
772 &ipoib->broadcast.membership,
773 &ipoib->broadcast.av, 0,
774 ipoib_join_complete ) ) != 0 ) {
775 DBGC ( ipoib, "IPoIB %p could not join broadcast group: %s\n",
776 ipoib, strerror ( rc ) );
777 return rc;
778 }
779
780 return 0;
781}
int ib_mcast_join(struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_mc_membership *membership, struct ib_address_vector *av, unsigned int mask, void(*complete)(struct ib_mc_membership *membership, int rc))
Join multicast group.
Definition ib_mcast.c:152
void ipoib_join_complete(struct ib_mc_membership *membership, int rc)
Handle IPv4 broadcast multicast group join completion.
Definition ipoib.c:752

References ipoib_broadcast::av, ipoib_device::broadcast, DBGC, ib_mcast_join(), ipoib_device::ibdev, ipoib_join_complete(), ipoib_broadcast::membership, ipoib_device::qp, rc, and strerror().

Referenced by ipoib_link_state_changed().

◆ ipoib_leave_broadcast_group()

void ipoib_leave_broadcast_group ( struct ipoib_device * ipoib)
static

Leave IPv4 broadcast multicast group.

Parameters
ipoibIPoIB device

Definition at line 788 of file ipoib.c.

788 {
789
790 /* Leave multicast group */
791 ib_mcast_leave ( ipoib->ibdev, ipoib->qp,
792 &ipoib->broadcast.membership );
793}
void ib_mcast_leave(struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_mc_membership *membership)
Leave multicast group.
Definition ib_mcast.c:209

References ipoib_device::broadcast, ib_mcast_leave(), ipoib_device::ibdev, ipoib_broadcast::membership, and ipoib_device::qp.

Referenced by ipoib_close(), and ipoib_link_state_changed().

◆ ipoib_link_state_changed()

void ipoib_link_state_changed ( struct ipoib_device * ipoib)
static

Handle link status change.

Parameters
ipoibIPoIB device

Definition at line 800 of file ipoib.c.

800 {
801 struct ib_device *ibdev = ipoib->ibdev;
802 struct net_device *netdev = ipoib->netdev;
803 int rc;
804
805 /* Leave existing broadcast group */
806 if ( ipoib->qp )
808
809 /* Update MAC address based on potentially-new GID prefix */
810 memcpy ( &ipoib->mac.gid.s.prefix, &ibdev->gid.s.prefix,
811 sizeof ( ipoib->mac.gid.s.prefix ) );
812
813 /* Update broadcast MAC GID based on potentially-new partition key */
814 ipoib->broadcast.mac.gid.words[2] =
815 htons ( ibdev->pkey | IB_PKEY_FULL );
816
817 /* Construct broadcast address vector from broadcast MAC address */
818 memset ( &ipoib->broadcast.av, 0, sizeof ( ipoib->broadcast.av ) );
820 ipoib->broadcast.av.gid_present = 1;
821 memcpy ( &ipoib->broadcast.av.gid, &ipoib->broadcast.mac.gid,
822 sizeof ( ipoib->broadcast.av.gid ) );
823
824 /* Set net device link state to reflect Infiniband link state */
825 rc = ib_link_rc ( ibdev );
827
828 /* Join new broadcast group */
829 if ( ib_is_open ( ibdev ) && ib_link_ok ( ibdev ) && ipoib->qp &&
830 ( ( rc = ipoib_join_broadcast_group ( ipoib ) ) != 0 ) ) {
831 DBGC ( ipoib, "IPoIB %p could not rejoin broadcast group: "
832 "%s\n", ipoib, strerror ( rc ) );
834 return;
835 }
836}
#define EINPROGRESS_JOINING
Link status for "broadcast join in progress".
Definition eoib.c:56
int ib_link_rc(struct ib_device *ibdev)
Get link state.
Definition infiniband.c:594
#define IB_PKEY_FULL
Infiniband partition key full membership flag.
Definition infiniband.h:43
#define IB_QPN_BROADCAST
Broadcast QPN.
Definition infiniband.h:34
static int ib_is_open(struct ib_device *ibdev)
Check whether or not Infiniband device is open.
Definition infiniband.h:577
static int ipoib_join_broadcast_group(struct ipoib_device *ipoib)
Join IPv4 broadcast multicast group.
Definition ipoib.c:767
static void ipoib_leave_broadcast_group(struct ipoib_device *ipoib)
Leave IPv4 broadcast multicast group.
Definition ipoib.c:788
unsigned int gid_present
GID is present.
Definition infiniband.h:91
union ib_gid gid
GID, if present.
Definition infiniband.h:93
uint16_t pkey
Partition key.
Definition infiniband.h:450
union ib_gid gid
Port GID (comprising GID prefix and port GUID)
Definition infiniband.h:442
union ib_gid gid
Port GID.
Definition ipoib.h:26
uint16_t words[8]
Definition ib_packet.h:36
struct ib_gid::@251011351113275240012301235177256303262052134237 s
union ib_guid prefix
Definition ib_packet.h:40

References ipoib_broadcast::av, ipoib_device::broadcast, DBGC, EINPROGRESS_JOINING, ib_address_vector::gid, ib_device::gid, ipoib_mac::gid, ib_address_vector::gid_present, htons, ib_is_open(), ib_link_ok(), ib_link_rc(), IB_PKEY_FULL, IB_QPN_BROADCAST, ipoib_device::ibdev, ipoib_join_broadcast_group(), ipoib_leave_broadcast_group(), ipoib_broadcast::mac, ipoib_device::mac, memcpy(), memset(), ipoib_device::netdev, netdev, netdev_link_err(), ib_device::pkey, ib_gid::prefix, ipoib_device::qp, ib_address_vector::qpn, rc, ib_gid::s, strerror(), and ib_gid::words.

Referenced by ipoib_notify(), and ipoib_open().

◆ ipoib_open()

int ipoib_open ( struct net_device * netdev)
static

Open IPoIB network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 844 of file ipoib.c.

844 {
845 struct ipoib_device *ipoib = netdev->priv;
846 struct ib_device *ibdev = ipoib->ibdev;
847 int rc;
848
849 /* Open IB device */
850 if ( ( rc = ib_open ( ibdev ) ) != 0 ) {
851 DBGC ( ipoib, "IPoIB %p could not open device: %s\n",
852 ipoib, strerror ( rc ) );
853 goto err_ib_open;
854 }
855
856 /* Allocate completion queue */
857 if ( ( rc = ib_create_cq ( ibdev, IPOIB_NUM_CQES, &ipoib_cq_op,
858 &ipoib->cq ) ) != 0 ) {
859 DBGC ( ipoib, "IPoIB %p could not create completion queue: "
860 "%s\n", ipoib, strerror ( rc ) );
861 goto err_create_cq;
862 }
863
864 /* Allocate queue pair */
865 if ( ( rc = ib_create_qp ( ibdev, IB_QPT_UD, IPOIB_NUM_SEND_WQES,
866 ipoib->cq, IPOIB_NUM_RECV_WQES, ipoib->cq,
867 &ipoib_qp_op, netdev->name,
868 &ipoib->qp ) ) != 0 ) {
869 DBGC ( ipoib, "IPoIB %p could not create queue pair: %s\n",
870 ipoib, strerror ( rc ) );
871 goto err_create_qp;
872 }
873 ib_qp_set_ownerdata ( ipoib->qp, ipoib );
874
875 /* Update MAC address with QPN */
876 ipoib->mac.flags__qpn = htonl ( ipoib->qp->qpn );
877
878 /* Fill receive rings */
879 ib_refill_recv ( ibdev, ipoib->qp );
880
881 /* Fake a link status change to join the broadcast group */
882 ipoib_link_state_changed ( ipoib );
883
884 return 0;
885
886 ib_destroy_qp ( ibdev, ipoib->qp );
887 err_create_qp:
888 ib_destroy_cq ( ibdev, ipoib->cq );
889 err_create_cq:
890 ib_close ( ibdev );
891 err_ib_open:
892 return rc;
893}
void ib_refill_recv(struct ib_device *ibdev, struct ib_queue_pair *qp)
Refill receive work queue.
Definition infiniband.c:556
void ib_destroy_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Destroy completion queue.
Definition infiniband.c:145
int ib_create_cq(struct ib_device *ibdev, unsigned int num_cqes, struct ib_completion_queue_operations *op, struct ib_completion_queue **new_cq)
Create completion queue.
Definition infiniband.c:98
int ib_open(struct ib_device *ibdev)
Open port.
Definition infiniband.c:652
void ib_close(struct ib_device *ibdev)
Close port.
Definition infiniband.c:716
void ib_destroy_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Destroy queue pair.
Definition infiniband.c:314
int ib_create_qp(struct ib_device *ibdev, enum ib_queue_pair_type type, unsigned int num_send_wqes, struct ib_completion_queue *send_cq, unsigned int num_recv_wqes, struct ib_completion_queue *recv_cq, struct ib_queue_pair_operations *op, const char *name, struct ib_queue_pair **new_qp)
Create queue pair.
Definition infiniband.c:199
static __always_inline void ib_qp_set_ownerdata(struct ib_queue_pair *qp, void *priv)
Set Infiniband queue pair owner-private data.
Definition infiniband.h:654
@ IB_QPT_UD
Definition infiniband.h:142
#define IPOIB_NUM_RECV_WQES
Number of IPoIB receive work queue entries.
Definition ipoib.c:71
static void ipoib_link_state_changed(struct ipoib_device *ipoib)
Handle link status change.
Definition ipoib.c:800
#define IPOIB_NUM_SEND_WQES
Number of IPoIB send work queue entries.
Definition ipoib.c:68
static struct ib_completion_queue_operations ipoib_cq_op
IPoIB completion operations.
Definition ipoib.c:689
static struct ib_queue_pair_operations ipoib_qp_op
IPoIB queue pair operations.
Definition ipoib.c:726
#define IPOIB_NUM_CQES
Number of IPoIB completion entries.
Definition ipoib.c:74
unsigned long qpn
Queue pair number.
Definition infiniband.h:166
struct ib_completion_queue * cq
Completion queue.
Definition ipoib.c:95
uint32_t flags__qpn
Queue pair number.
Definition ipoib.h:24

References ipoib_device::cq, DBGC, ipoib_mac::flags__qpn, htonl, ib_close(), ib_create_cq(), ib_create_qp(), ib_destroy_cq(), ib_destroy_qp(), ib_open(), ib_qp_set_ownerdata(), IB_QPT_UD, ib_refill_recv(), ipoib_device::ibdev, ipoib_cq_op, ipoib_link_state_changed(), IPOIB_NUM_CQES, IPOIB_NUM_RECV_WQES, IPOIB_NUM_SEND_WQES, ipoib_qp_op, ipoib_device::mac, netdev, ipoib_device::qp, ib_queue_pair::qpn, rc, and strerror().

◆ ipoib_close()

void ipoib_close ( struct net_device * netdev)
static

Close IPoIB network device.

Parameters
netdevNetwork device

Definition at line 900 of file ipoib.c.

900 {
901 struct ipoib_device *ipoib = netdev->priv;
902 struct ib_device *ibdev = ipoib->ibdev;
903
904 /* Flush REMAC cache */
905 ipoib_flush_remac ( ipoib );
906
907 /* Leave broadcast group */
909
910 /* Remove QPN from MAC address */
911 ipoib->mac.flags__qpn = 0;
912
913 /* Tear down the queues */
914 ib_destroy_qp ( ibdev, ipoib->qp );
915 ipoib->qp = NULL;
916 ib_destroy_cq ( ibdev, ipoib->cq );
917 ipoib->cq = NULL;
918
919 /* Close IB device */
920 ib_close ( ibdev );
921}
static void ipoib_flush_remac(struct ipoib_device *ipoib)
Flush REMAC cache.
Definition ipoib.c:220

References ipoib_device::cq, ipoib_mac::flags__qpn, ib_close(), ib_destroy_cq(), ib_destroy_qp(), ipoib_device::ibdev, ipoib_flush_remac(), ipoib_leave_broadcast_group(), ipoib_device::mac, netdev, NULL, and ipoib_device::qp.

◆ ipoib_probe()

int ipoib_probe ( struct ib_device * ibdev)
static

Probe IPoIB device.

Parameters
ibdevInfiniband device
Return values
rcReturn status code

Definition at line 937 of file ipoib.c.

937 {
938 struct net_device *netdev;
939 struct ipoib_device *ipoib;
940 int rc;
941
942 /* Allocate network device */
943 netdev = alloc_ipoibdev ( sizeof ( *ipoib ) );
944 if ( ! netdev )
945 return -ENOMEM;
947 ipoib = netdev->priv;
948 netdev->dev = ibdev->dev;
949 memset ( ipoib, 0, sizeof ( *ipoib ) );
950 ipoib->netdev = netdev;
951 ipoib->ibdev = ibdev;
952 INIT_LIST_HEAD ( &ipoib->peers );
953
954 /* Extract hardware address */
955 memcpy ( netdev->hw_addr, &ibdev->gid.s.guid,
956 sizeof ( ibdev->gid.s.guid ) );
957 memcpy ( netdev->ll_addr, ibdev->lemac, ETH_ALEN );
958
959 /* Set local MAC address */
960 memcpy ( &ipoib->mac.gid.s.guid, &ibdev->gid.s.guid,
961 sizeof ( ipoib->mac.gid.s.guid ) );
962
963 /* Set default broadcast MAC address */
965 sizeof ( ipoib->broadcast.mac ) );
966
967 /* Add to list of IPoIB devices */
968 list_add_tail ( &ipoib->list, &ipoib_devices );
969
970 /* Register network device */
971 if ( ( rc = register_netdev ( netdev ) ) != 0 )
972 goto err_register_netdev;
973
974 return 0;
975
977 err_register_netdev:
978 list_del ( &ipoib->list );
980 netdev_put ( netdev );
981 return rc;
982}
struct net_device * alloc_ipoibdev(size_t priv_size)
Allocate IPoIB device.
Definition ipoib.c:315
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition list.h:94
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition list.h:46
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition netdevice.c:942
int register_netdev(struct net_device *netdev)
Register network device.
Definition netdevice.c:760
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition netdevice.h:519
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition netdevice.h:532
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition netdevice.h:576
struct device * dev
Underlying device.
Definition infiniband.h:411
uint8_t lemac[ETH_ALEN]
IPoIB LEMAC (if non-default)
Definition infiniband.h:465
An IPoIB broadcast address.
Definition ipoib.c:77
struct list_head list
List of IPoIB devices.
Definition ipoib.c:93
union ib_guid guid
Definition ib_packet.h:41

References alloc_ipoibdev(), ipoib_device::broadcast, ib_device::dev, ENOMEM, ETH_ALEN, ib_device::gid, ipoib_mac::gid, ib_gid::guid, ipoib_device::ibdev, INIT_LIST_HEAD, ipoib_operations, ib_device::lemac, ipoib_device::list, list_add_tail, list_del, ipoib_broadcast::mac, ipoib_device::mac, memcpy(), memset(), ipoib_device::netdev, netdev, netdev_init(), netdev_nullify(), netdev_put(), ipoib_device::peers, rc, register_netdev(), ib_gid::s, and unregister_netdev().

◆ ipoib_notify()

void ipoib_notify ( struct ib_device * ibdev)
static

Handle device or link status change.

Parameters
ibdevInfiniband device

Definition at line 989 of file ipoib.c.

989 {
990 struct ipoib_device *ipoib;
991
992 /* Handle link status change for any attached IPoIB devices */
993 list_for_each_entry ( ipoib, &ipoib_devices, list ) {
994 if ( ipoib->ibdev != ibdev )
995 continue;
996 ipoib_link_state_changed ( ipoib );
997 }
998}

References ipoib_device::ibdev, ipoib_link_state_changed(), ipoib_device::list, and list_for_each_entry.

◆ ipoib_remove()

void ipoib_remove ( struct ib_device * ibdev)
static

Remove IPoIB device.

Parameters
ibdevInfiniband device

Definition at line 1005 of file ipoib.c.

1005 {
1006 struct ipoib_device *ipoib;
1007 struct ipoib_device *tmp;
1008 struct net_device *netdev;
1009
1010 /* Remove any attached IPoIB devices */
1011 list_for_each_entry_safe ( ipoib, tmp, &ipoib_devices, list ) {
1012 if ( ipoib->ibdev != ibdev )
1013 continue;
1014 netdev = ipoib->netdev;
1016 list_del ( &ipoib->list );
1018 netdev_put ( netdev );
1019 }
1020}
struct list_head list
List of network devices.
Definition netdevice.h:357

References ipoib_device::ibdev, ipoib_device::list, net_device::list, list_del, list_for_each_entry_safe, ipoib_device::netdev, netdev, netdev_nullify(), netdev_put(), tmp, and unregister_netdev().

◆ ipoib_netdev()

struct net_device * ipoib_netdev ( struct ib_device * ibdev)

Find IPoIB network device.

Parameters
ibdevInfiniband device
Return values
netdevIPoIB network device, or NULL if not found

Definition at line 1036 of file ipoib.c.

1036 {
1037 struct ipoib_device *ipoib;
1038
1039 /* Find matching IPoIB device */
1040 list_for_each_entry ( ipoib, &ipoib_devices, list ) {
1041 if ( ipoib->ibdev != ibdev )
1042 continue;
1043 return ipoib->netdev;
1044 }
1045 return NULL;
1046}

References ipoib_device::ibdev, ipoib_device::list, list_for_each_entry, ipoib_device::netdev, and NULL.

Referenced by golan_register_ibdev().

Variable Documentation

◆ ipoib_broadcast

struct ipoib_mac ipoib_broadcast
static
Initial value:
= {
.flags__qpn = htonl ( IB_QPN_BROADCAST ),
.gid.bytes = { 0xff, 0x12, 0x40, 0x1b, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff },
}

Broadcast IPoIB address.

Definition at line 107 of file ipoib.c.

107 {
108 .flags__qpn = htonl ( IB_QPN_BROADCAST ),
109 .gid.bytes = { 0xff, 0x12, 0x40, 0x1b, 0x00, 0x00, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff },
111};

◆ __errortab

struct errortab ipoib_errors [] __errortab
Initial value:
= {
}
#define EINFO_EINPROGRESS_JOINING
Definition eoib.c:57
#define __einfo_errortab(einfo)
Definition errortab.h:24

Human-readable message for the link status.

Definition at line 119 of file ipoib.c.

◆ ipoib_operations

struct net_device_operations ipoib_operations
static
Initial value:
= {
.open = ipoib_open,
.close = ipoib_close,
.transmit = ipoib_transmit,
.poll = ipoib_poll,
}
static void ipoib_close(struct net_device *netdev)
Close IPoIB network device.
Definition ipoib.c:900
static int ipoib_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet via IPoIB network device.
Definition ipoib.c:499
static void ipoib_poll(struct net_device *netdev)
Poll IPoIB network device.
Definition ipoib.c:735
static int ipoib_open(struct net_device *netdev)
Open IPoIB network device.
Definition ipoib.c:844

IPoIB network device operations.

Definition at line 126 of file ipoib.c.

Referenced by ipoib_discard_remac(), and ipoib_probe().

◆ __ll_protocol

struct ll_protocol ipoib_protocol __ll_protocol
Initial value:
= {
.name = "IPoIB",
.ll_proto = htons ( ARPHRD_ETHER ),
.hw_addr_len = sizeof ( union ib_guid ),
.ll_addr_len = ETH_ALEN,
.ll_header_len = ETH_HLEN,
.push = eth_push,
.pull = eth_pull,
.init_addr = ipoib_init_addr,
.ntoa = eth_ntoa,
.mc_hash = eth_mc_hash,
.eth_addr = eth_eth_addr,
.eui64 = eth_eui64,
.flags = LL_NAME_ONLY,
}
int eth_mc_hash(unsigned int af, const void *net_addr, void *ll_addr)
Hash multicast address.
Definition ethernet.c:194
int eth_push(struct net_device *netdev __unused, struct io_buffer *iobuf, const void *ll_dest, const void *ll_source, uint16_t net_proto)
Add Ethernet link-layer header.
Definition ethernet.c:78
int eth_eui64(const void *ll_addr, void *eui64)
Generate EUI-64 address.
Definition ethernet.c:235
int eth_pull(struct net_device *netdev __unused, struct io_buffer *iobuf, const void **ll_dest, const void **ll_source, uint16_t *net_proto, unsigned int *flags)
Remove Ethernet link-layer header.
Definition ethernet.c:102
int eth_eth_addr(const void *ll_addr, void *eth_addr)
Generate Ethernet-compatible compressed link-layer address.
Definition ethernet.c:223
#define ETH_HLEN
Definition if_ether.h:10
static void ipoib_init_addr(const void *hw_addr, void *ll_addr)
Initialise IPoIB link-layer address.
Definition ipoib.c:279
#define LL_NAME_ONLY
Local link-layer address functions only as a name.
Definition netdevice.h:211
An Infiniband Globally Unique Identifier.
Definition ib_packet.h:19

IPoIB protocol.

Ethernet protocol.

Definition at line 293 of file ipoib.c.

293 {
294 .name = "IPoIB",
295 .ll_proto = htons ( ARPHRD_ETHER ),
296 .hw_addr_len = sizeof ( union ib_guid ),
297 .ll_addr_len = ETH_ALEN,
298 .ll_header_len = ETH_HLEN,
299 .push = eth_push,
300 .pull = eth_pull,
301 .init_addr = ipoib_init_addr,
302 .ntoa = eth_ntoa,
303 .mc_hash = eth_mc_hash,
304 .eth_addr = eth_eth_addr,
305 .eui64 = eth_eui64,
306 .flags = LL_NAME_ONLY,
307};

◆ ipoib_cq_op

struct ib_completion_queue_operations ipoib_cq_op
static
Initial value:
= {
.complete_send = ipoib_complete_send,
.complete_recv = ipoib_complete_recv,
}
static void ipoib_complete_send(struct ib_device *ibdev __unused, struct ib_queue_pair *qp, struct io_buffer *iobuf, int rc)
Handle IPoIB send completion.
Definition ipoib.c:601
static void ipoib_complete_recv(struct ib_device *ibdev __unused, struct ib_queue_pair *qp, struct ib_address_vector *dest, struct ib_address_vector *source, struct io_buffer *iobuf, int rc)
Handle IPoIB receive completion.
Definition ipoib.c:619

IPoIB completion operations.

Definition at line 689 of file ipoib.c.

689 {
690 .complete_send = ipoib_complete_send,
691 .complete_recv = ipoib_complete_recv,
692};

Referenced by ipoib_open().

◆ ipoib_qp_op

struct ib_queue_pair_operations ipoib_qp_op
static
Initial value:
= {
.alloc_iob = ipoib_alloc_iob,
}
static struct io_buffer * ipoib_alloc_iob(size_t len)
Allocate IPoIB receive I/O buffer.
Definition ipoib.c:709

IPoIB queue pair operations.

Definition at line 726 of file ipoib.c.

726 {
727 .alloc_iob = ipoib_alloc_iob,
728};

Referenced by ipoib_open().

◆ __ib_driver

struct ib_driver ipoib_driver __ib_driver
Initial value:
= {
.name = "IPoIB",
.probe = ipoib_probe,
.notify = ipoib_notify,
.remove = ipoib_remove,
}
static int ipoib_probe(struct ib_device *ibdev)
Probe IPoIB device.
Definition ipoib.c:937
static void ipoib_notify(struct ib_device *ibdev)
Handle device or link status change.
Definition ipoib.c:989
static void ipoib_remove(struct ib_device *ibdev)
Remove IPoIB device.
Definition ipoib.c:1005

IPoIB driver.

Definition at line 1023 of file ipoib.c.

1023 {
1024 .name = "IPoIB",
1025 .probe = ipoib_probe,
1026 .notify = ipoib_notify,
1027 .remove = ipoib_remove,
1028};