~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/ipxe/src/include/ipxe/eoib.h

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef _IPXE_EOIB_H
 
2
#define _IPXE_EOIB_H
 
3
 
 
4
/** @file
 
5
 *
 
6
 * Ethernet over Infiniband
 
7
 *
 
8
 */
 
9
 
 
10
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
11
 
 
12
#include <stdint.h>
 
13
#include <byteswap.h>
 
14
#include <ipxe/netdevice.h>
 
15
#include <ipxe/infiniband.h>
 
16
#include <ipxe/ib_mcast.h>
 
17
 
 
18
/** An EoIB header */
 
19
struct eoib_header {
 
20
        /** Signature */
 
21
        uint16_t magic;
 
22
        /** Reserved */
 
23
        uint16_t reserved;
 
24
} __attribute__ (( packed ));
 
25
 
 
26
/** EoIB magic signature */
 
27
#define EOIB_MAGIC 0x8919
 
28
 
 
29
/** An EoIB device */
 
30
struct eoib_device {
 
31
        /** Name */
 
32
        const char *name;
 
33
        /** Network device */
 
34
        struct net_device *netdev;
 
35
        /** Underlying Infiniband device */
 
36
        struct ib_device *ibdev;
 
37
        /** List of EoIB devices */
 
38
        struct list_head list;
 
39
        /** Broadcast address */
 
40
        struct ib_address_vector broadcast;
 
41
 
 
42
        /** Completion queue */
 
43
        struct ib_completion_queue *cq;
 
44
        /** Queue pair */
 
45
        struct ib_queue_pair *qp;
 
46
        /** Broadcast group membership */
 
47
        struct ib_mc_membership membership;
 
48
 
 
49
        /** Peer cache */
 
50
        struct list_head peers;
 
51
 
 
52
        /** Send duplicate packet to gateway (or NULL)
 
53
         *
 
54
         * @v eoib              EoIB device
 
55
         * @v original          Original I/O buffer
 
56
         */
 
57
        void ( * duplicate ) ( struct eoib_device *eoib,
 
58
                               struct io_buffer *original );
 
59
        /** Gateway (if any) */
 
60
        struct ib_address_vector gateway;
 
61
        /** Multicast group additional component mask */
 
62
        unsigned int mask;
 
63
};
 
64
 
 
65
/**
 
66
 * Check if EoIB device uses a gateway
 
67
 *
 
68
 * @v eoib              EoIB device
 
69
 * @v has_gw            EoIB device uses a gateway
 
70
 */
 
71
static inline int eoib_has_gateway ( struct eoib_device *eoib ) {
 
72
 
 
73
        return ( eoib->duplicate != NULL );
 
74
}
 
75
 
 
76
/**
 
77
 * Force creation of multicast group
 
78
 *
 
79
 * @v eoib              EoIB device
 
80
 */
 
81
static inline void eoib_force_group_creation ( struct eoib_device *eoib ) {
 
82
 
 
83
        /* Some dubious EoIB implementations require each endpoint to
 
84
         * force the creation of the multicast group.  Yes, this makes
 
85
         * it impossible for the group parameters (e.g. SL) to ever be
 
86
         * modified without breaking backwards compatiblity with every
 
87
         * existing driver.
 
88
         */
 
89
        eoib->mask = ( IB_SA_MCMEMBER_REC_PKEY | IB_SA_MCMEMBER_REC_QKEY |
 
90
                       IB_SA_MCMEMBER_REC_SL | IB_SA_MCMEMBER_REC_FLOW_LABEL |
 
91
                       IB_SA_MCMEMBER_REC_TRAFFIC_CLASS );
 
92
}
 
93
 
 
94
extern int eoib_create ( struct ib_device *ibdev, const uint8_t *hw_addr,
 
95
                         struct ib_address_vector *broadcast,
 
96
                         const char *name );
 
97
extern struct eoib_device * eoib_find ( struct ib_device *ibdev,
 
98
                                        const uint8_t *hw_addr );
 
99
extern void eoib_destroy ( struct eoib_device *eoib );
 
100
extern void eoib_set_gateway ( struct eoib_device *eoib,
 
101
                               struct ib_address_vector *av );
 
102
 
 
103
#endif /* _IPXE_EOIB_H */