1[PATCHv7 3/4] libibverbs: Add API to retrieve eth MAC
2
3Add a command to retrieve the MAC address of a port's GID. This is required by
4libraries to build work requests when the port's link layer is Ethernet.
5
6Signed-off-by: Eli Cohen <eli@mellanox.co.il>
7---
8 include/infiniband/driver.h   |    1 +
9 include/infiniband/kern-abi.h |   20 +++++++++++++++++++-
10 src/cmd.c                     |   19 +++++++++++++++++++
11 src/libibverbs.map            |    1 +
12 4 files changed, 40 insertions(+), 1 deletions(-)
13
14Index: libibverbs/include/infiniband/driver.h
15===================================================================
16--- libibverbs.orig/include/infiniband/driver.h	2010-02-18 13:48:37.000000000 +0200
17+++ libibverbs/include/infiniband/driver.h	2010-02-18 13:50:53.000000000 +0200
18@@ -136,6 +136,11 @@ int ibv_cmd_create_ah(struct ibv_pd *pd,
19 int ibv_cmd_destroy_ah(struct ibv_ah *ah);
20 int ibv_cmd_attach_mcast(struct ibv_qp *qp, const union ibv_gid *gid, uint16_t lid);
21 int ibv_cmd_detach_mcast(struct ibv_qp *qp, const union ibv_gid *gid, uint16_t lid);
22+int ibv_cmd_get_eth_l2_addr(struct ibv_pd *pd, uint8_t port, const union ibv_gid *gid,
23+			    int sgid_idx, uint8_t *mac, uint16_t *vlan_id);
24+
25+int ibv_cmd_get_eth_l2_addr(struct ibv_pd *pd, uint8_t port, const union ibv_gid *gid,
26+                            int sgid_idx, uint8_t *mac, uint16_t *vlan_id);
27 
28 int ibv_dontfork_range(void *base, size_t size);
29 int ibv_dofork_range(void *base, size_t size);
30Index: libibverbs/include/infiniband/kern-abi.h
31===================================================================
32--- libibverbs.orig/include/infiniband/kern-abi.h	2010-02-18 13:48:46.000000000 +0200
33+++ libibverbs/include/infiniband/kern-abi.h	2010-02-18 13:50:53.000000000 +0200
34@@ -94,6 +94,7 @@ enum {
35 	IB_USER_VERBS_CMD_QUERY_XRC_RCV_QP,
36 	IB_USER_VERBS_CMD_REG_XRC_RCV_QP,
37 	IB_USER_VERBS_CMD_UNREG_XRC_RCV_QP,
38+	IB_USER_VERBS_CMD_GET_ETH_L2_ADDR,
39 };
40 
41 /*
42@@ -946,6 +947,7 @@ enum {
43 	IB_USER_VERBS_CMD_QUERY_XRC_RCV_QP_V2 = -1,
44 	IB_USER_VERBS_CMD_REG_XRC_RCV_QP_V2 = -1,
45 	IB_USER_VERBS_CMD_UNREG_XRC_RCV_QP_V2 = -1,
46+	IB_USER_VERBS_CMD_GET_ETH_L2_ADDR_V2 = -1,
47 };
48 
49 struct ibv_destroy_cq_v1 {
50@@ -1021,4 +1023,21 @@ struct ibv_create_srq_resp_v5 {
51 	__u32 srq_handle;
52 };
53 
54+struct ibv_get_eth_l2_addr {
55+        __u32 command;
56+        __u16 in_words;
57+        __u16 out_words;
58+        __u64 response;
59+        __u32 pd_handle;
60+        __u8  port;
61+        __u8  sgid_idx;
62+        __u8  reserved[2];
63+        __u8  dgid[16];
64+};
65+
66+struct ibv_get_eth_l2_addr_resp {
67+        __u8    mac[6];
68+        __u16   vlan_id;
69+};
70+
71 #endif /* KERN_ABI_H */
72Index: libibverbs/src/cmd.c
73===================================================================
74--- libibverbs.orig/src/cmd.c	2010-02-18 13:48:46.000000000 +0200
75+++ libibverbs/src/cmd.c	2010-02-18 13:50:53.000000000 +0200
76@@ -1407,4 +1407,24 @@ int ibv_cmd_unreg_xrc_rcv_qp(struct ibv_
77 	return 0;
78 }
79 
80+int ibv_cmd_get_eth_l2_addr(struct ibv_pd *pd, uint8_t port, const union ibv_gid *gid,
81+                            int sgid_idx, uint8_t *mac, uint16_t *vlan_id)
82+{
83+        struct ibv_get_eth_l2_addr cmd;
84+        struct ibv_get_eth_l2_addr_resp resp;
85+
86+        IBV_INIT_CMD_RESP(&cmd, sizeof cmd, GET_ETH_L2_ADDR, &resp, sizeof resp);
87+        memcpy(cmd.dgid, gid, sizeof cmd.dgid);
88+        cmd.pd_handle = pd->handle;
89+        cmd.port = port;
90+        cmd.sgid_idx = sgid_idx;
91+
92+        if (write(pd->context->cmd_fd, &cmd, sizeof cmd) != sizeof cmd)
93+                return errno;
94+
95+        memcpy(mac, resp.mac, 6);
96+        *vlan_id = resp.vlan_id;
97+
98+        return 0;
99+}
100 
101Index: libibverbs/src/libibverbs.map
102===================================================================
103--- libibverbs.orig/src/libibverbs.map	2010-02-18 13:48:37.000000000 +0200
104+++ libibverbs/src/libibverbs.map	2010-02-18 13:50:53.000000000 +0200
105@@ -64,6 +64,7 @@ IBVERBS_1.0 {
106 		ibv_cmd_destroy_ah;
107 		ibv_cmd_attach_mcast;
108 		ibv_cmd_detach_mcast;
109+		ibv_cmd_get_eth_l2_addr;
110 		ibv_copy_qp_attr_from_kern;
111 		ibv_copy_path_rec_from_kern;
112 		ibv_copy_path_rec_to_kern;
113