aboutsummaryrefslogtreecommitdiffstats
path: root/include/rdma
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2010-11-03 10:51:26 -0400
committerTakashi Iwai <tiwai@suse.de>2010-11-03 10:51:26 -0400
commit69dbdd819599e2f3b77c172e83af512845bca5ad (patch)
tree49939d8b80ec2115a801eae2aebc21f23867c876 /include/rdma
parent87232dd49aeb6b7d1af291edca8bd129a82ef4b5 (diff)
parent75e3f3137cb570661c2ad3035a139dda671fbb63 (diff)
Merge branch 'fix/asoc' into for-linus
Diffstat (limited to 'include/rdma')
-rw-r--r--include/rdma/ib_addr.h134
-rw-r--r--include/rdma/ib_pack.h39
-rw-r--r--include/rdma/ib_user_verbs.h3
-rw-r--r--include/rdma/ib_verbs.h11
4 files changed, 177 insertions, 10 deletions
diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h
index fa0d52b8e622..b5fc9f39122b 100644
--- a/include/rdma/ib_addr.h
+++ b/include/rdma/ib_addr.h
@@ -39,7 +39,9 @@
39#include <linux/if_arp.h> 39#include <linux/if_arp.h>
40#include <linux/netdevice.h> 40#include <linux/netdevice.h>
41#include <linux/socket.h> 41#include <linux/socket.h>
42#include <linux/if_vlan.h>
42#include <rdma/ib_verbs.h> 43#include <rdma/ib_verbs.h>
44#include <rdma/ib_pack.h>
43 45
44struct rdma_addr_client { 46struct rdma_addr_client {
45 atomic_t refcount; 47 atomic_t refcount;
@@ -63,6 +65,7 @@ struct rdma_dev_addr {
63 unsigned char broadcast[MAX_ADDR_LEN]; 65 unsigned char broadcast[MAX_ADDR_LEN];
64 unsigned short dev_type; 66 unsigned short dev_type;
65 int bound_dev_if; 67 int bound_dev_if;
68 enum rdma_transport_type transport;
66}; 69};
67 70
68/** 71/**
@@ -127,9 +130,51 @@ static inline int rdma_addr_gid_offset(struct rdma_dev_addr *dev_addr)
127 return dev_addr->dev_type == ARPHRD_INFINIBAND ? 4 : 0; 130 return dev_addr->dev_type == ARPHRD_INFINIBAND ? 4 : 0;
128} 131}
129 132
133static inline void iboe_mac_vlan_to_ll(union ib_gid *gid, u8 *mac, u16 vid)
134{
135 memset(gid->raw, 0, 16);
136 *((__be32 *) gid->raw) = cpu_to_be32(0xfe800000);
137 if (vid < 0x1000) {
138 gid->raw[12] = vid & 0xff;
139 gid->raw[11] = vid >> 8;
140 } else {
141 gid->raw[12] = 0xfe;
142 gid->raw[11] = 0xff;
143 }
144 memcpy(gid->raw + 13, mac + 3, 3);
145 memcpy(gid->raw + 8, mac, 3);
146 gid->raw[8] ^= 2;
147}
148
149static inline u16 rdma_vlan_dev_vlan_id(const struct net_device *dev)
150{
151 return dev->priv_flags & IFF_802_1Q_VLAN ?
152 vlan_dev_vlan_id(dev) : 0xffff;
153}
154
155static inline void iboe_addr_get_sgid(struct rdma_dev_addr *dev_addr,
156 union ib_gid *gid)
157{
158 struct net_device *dev;
159 u16 vid = 0xffff;
160
161 dev = dev_get_by_index(&init_net, dev_addr->bound_dev_if);
162 if (dev) {
163 vid = rdma_vlan_dev_vlan_id(dev);
164 dev_put(dev);
165 }
166
167 iboe_mac_vlan_to_ll(gid, dev_addr->src_dev_addr, vid);
168}
169
130static inline void rdma_addr_get_sgid(struct rdma_dev_addr *dev_addr, union ib_gid *gid) 170static inline void rdma_addr_get_sgid(struct rdma_dev_addr *dev_addr, union ib_gid *gid)
131{ 171{
132 memcpy(gid, dev_addr->src_dev_addr + rdma_addr_gid_offset(dev_addr), sizeof *gid); 172 if (dev_addr->transport == RDMA_TRANSPORT_IB &&
173 dev_addr->dev_type != ARPHRD_INFINIBAND)
174 iboe_addr_get_sgid(dev_addr, gid);
175 else
176 memcpy(gid, dev_addr->src_dev_addr +
177 rdma_addr_gid_offset(dev_addr), sizeof *gid);
133} 178}
134 179
135static inline void rdma_addr_set_sgid(struct rdma_dev_addr *dev_addr, union ib_gid *gid) 180static inline void rdma_addr_set_sgid(struct rdma_dev_addr *dev_addr, union ib_gid *gid)
@@ -147,4 +192,91 @@ static inline void rdma_addr_set_dgid(struct rdma_dev_addr *dev_addr, union ib_g
147 memcpy(dev_addr->dst_dev_addr + rdma_addr_gid_offset(dev_addr), gid, sizeof *gid); 192 memcpy(dev_addr->dst_dev_addr + rdma_addr_gid_offset(dev_addr), gid, sizeof *gid);
148} 193}
149 194
195static inline enum ib_mtu iboe_get_mtu(int mtu)
196{
197 /*
198 * reduce IB headers from effective IBoE MTU. 28 stands for
199 * atomic header which is the biggest possible header after BTH
200 */
201 mtu = mtu - IB_GRH_BYTES - IB_BTH_BYTES - 28;
202
203 if (mtu >= ib_mtu_enum_to_int(IB_MTU_4096))
204 return IB_MTU_4096;
205 else if (mtu >= ib_mtu_enum_to_int(IB_MTU_2048))
206 return IB_MTU_2048;
207 else if (mtu >= ib_mtu_enum_to_int(IB_MTU_1024))
208 return IB_MTU_1024;
209 else if (mtu >= ib_mtu_enum_to_int(IB_MTU_512))
210 return IB_MTU_512;
211 else if (mtu >= ib_mtu_enum_to_int(IB_MTU_256))
212 return IB_MTU_256;
213 else
214 return 0;
215}
216
217static inline int iboe_get_rate(struct net_device *dev)
218{
219 struct ethtool_cmd cmd;
220
221 if (!dev->ethtool_ops || !dev->ethtool_ops->get_settings ||
222 dev->ethtool_ops->get_settings(dev, &cmd))
223 return IB_RATE_PORT_CURRENT;
224
225 if (cmd.speed >= 40000)
226 return IB_RATE_40_GBPS;
227 else if (cmd.speed >= 30000)
228 return IB_RATE_30_GBPS;
229 else if (cmd.speed >= 20000)
230 return IB_RATE_20_GBPS;
231 else if (cmd.speed >= 10000)
232 return IB_RATE_10_GBPS;
233 else
234 return IB_RATE_PORT_CURRENT;
235}
236
237static inline int rdma_link_local_addr(struct in6_addr *addr)
238{
239 if (addr->s6_addr32[0] == htonl(0xfe800000) &&
240 addr->s6_addr32[1] == 0)
241 return 1;
242
243 return 0;
244}
245
246static inline void rdma_get_ll_mac(struct in6_addr *addr, u8 *mac)
247{
248 memcpy(mac, &addr->s6_addr[8], 3);
249 memcpy(mac + 3, &addr->s6_addr[13], 3);
250 mac[0] ^= 2;
251}
252
253static inline int rdma_is_multicast_addr(struct in6_addr *addr)
254{
255 return addr->s6_addr[0] == 0xff;
256}
257
258static inline void rdma_get_mcast_mac(struct in6_addr *addr, u8 *mac)
259{
260 int i;
261
262 mac[0] = 0x33;
263 mac[1] = 0x33;
264 for (i = 2; i < 6; ++i)
265 mac[i] = addr->s6_addr[i + 10];
266}
267
268static inline u16 rdma_get_vlan_id(union ib_gid *dgid)
269{
270 u16 vid;
271
272 vid = dgid->raw[11] << 8 | dgid->raw[12];
273 return vid < 0x1000 ? vid : 0xffff;
274}
275
276static inline struct net_device *rdma_vlan_dev_real_dev(const struct net_device *dev)
277{
278 return dev->priv_flags & IFF_802_1Q_VLAN ?
279 vlan_dev_real_dev(dev) : 0;
280}
281
150#endif /* IB_ADDR_H */ 282#endif /* IB_ADDR_H */
diff --git a/include/rdma/ib_pack.h b/include/rdma/ib_pack.h
index cbb50f4da3dd..b37fe3b10a9d 100644
--- a/include/rdma/ib_pack.h
+++ b/include/rdma/ib_pack.h
@@ -37,6 +37,8 @@
37 37
38enum { 38enum {
39 IB_LRH_BYTES = 8, 39 IB_LRH_BYTES = 8,
40 IB_ETH_BYTES = 14,
41 IB_VLAN_BYTES = 4,
40 IB_GRH_BYTES = 40, 42 IB_GRH_BYTES = 40,
41 IB_BTH_BYTES = 12, 43 IB_BTH_BYTES = 12,
42 IB_DETH_BYTES = 8 44 IB_DETH_BYTES = 8
@@ -210,14 +212,32 @@ struct ib_unpacked_deth {
210 __be32 source_qpn; 212 __be32 source_qpn;
211}; 213};
212 214
215struct ib_unpacked_eth {
216 u8 dmac_h[4];
217 u8 dmac_l[2];
218 u8 smac_h[2];
219 u8 smac_l[4];
220 __be16 type;
221};
222
223struct ib_unpacked_vlan {
224 __be16 tag;
225 __be16 type;
226};
227
213struct ib_ud_header { 228struct ib_ud_header {
229 int lrh_present;
214 struct ib_unpacked_lrh lrh; 230 struct ib_unpacked_lrh lrh;
215 int grh_present; 231 int eth_present;
216 struct ib_unpacked_grh grh; 232 struct ib_unpacked_eth eth;
217 struct ib_unpacked_bth bth; 233 int vlan_present;
234 struct ib_unpacked_vlan vlan;
235 int grh_present;
236 struct ib_unpacked_grh grh;
237 struct ib_unpacked_bth bth;
218 struct ib_unpacked_deth deth; 238 struct ib_unpacked_deth deth;
219 int immediate_present; 239 int immediate_present;
220 __be32 immediate_data; 240 __be32 immediate_data;
221}; 241};
222 242
223void ib_pack(const struct ib_field *desc, 243void ib_pack(const struct ib_field *desc,
@@ -230,9 +250,12 @@ void ib_unpack(const struct ib_field *desc,
230 void *buf, 250 void *buf,
231 void *structure); 251 void *structure);
232 252
233void ib_ud_header_init(int payload_bytes, 253void ib_ud_header_init(int payload_bytes,
234 int grh_present, 254 int lrh_present,
235 int immediate_present, 255 int eth_present,
256 int vlan_present,
257 int grh_present,
258 int immediate_present,
236 struct ib_ud_header *header); 259 struct ib_ud_header *header);
237 260
238int ib_ud_header_pack(struct ib_ud_header *header, 261int ib_ud_header_pack(struct ib_ud_header *header,
diff --git a/include/rdma/ib_user_verbs.h b/include/rdma/ib_user_verbs.h
index a17f77106149..fe5b05177a2c 100644
--- a/include/rdma/ib_user_verbs.h
+++ b/include/rdma/ib_user_verbs.h
@@ -205,7 +205,8 @@ struct ib_uverbs_query_port_resp {
205 __u8 active_width; 205 __u8 active_width;
206 __u8 active_speed; 206 __u8 active_speed;
207 __u8 phys_state; 207 __u8 phys_state;
208 __u8 reserved[3]; 208 __u8 link_layer;
209 __u8 reserved[2];
209}; 210};
210 211
211struct ib_uverbs_alloc_pd { 212struct ib_uverbs_alloc_pd {
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index 857b3b9cf120..e04c4888d1fd 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -75,6 +75,12 @@ enum rdma_transport_type {
75enum rdma_transport_type 75enum rdma_transport_type
76rdma_node_get_transport(enum rdma_node_type node_type) __attribute_const__; 76rdma_node_get_transport(enum rdma_node_type node_type) __attribute_const__;
77 77
78enum rdma_link_layer {
79 IB_LINK_LAYER_UNSPECIFIED,
80 IB_LINK_LAYER_INFINIBAND,
81 IB_LINK_LAYER_ETHERNET,
82};
83
78enum ib_device_cap_flags { 84enum ib_device_cap_flags {
79 IB_DEVICE_RESIZE_MAX_WR = 1, 85 IB_DEVICE_RESIZE_MAX_WR = 1,
80 IB_DEVICE_BAD_PKEY_CNTR = (1<<1), 86 IB_DEVICE_BAD_PKEY_CNTR = (1<<1),
@@ -1010,6 +1016,8 @@ struct ib_device {
1010 int (*query_port)(struct ib_device *device, 1016 int (*query_port)(struct ib_device *device,
1011 u8 port_num, 1017 u8 port_num,
1012 struct ib_port_attr *port_attr); 1018 struct ib_port_attr *port_attr);
1019 enum rdma_link_layer (*get_link_layer)(struct ib_device *device,
1020 u8 port_num);
1013 int (*query_gid)(struct ib_device *device, 1021 int (*query_gid)(struct ib_device *device,
1014 u8 port_num, int index, 1022 u8 port_num, int index,
1015 union ib_gid *gid); 1023 union ib_gid *gid);
@@ -1222,6 +1230,9 @@ int ib_query_device(struct ib_device *device,
1222int ib_query_port(struct ib_device *device, 1230int ib_query_port(struct ib_device *device,
1223 u8 port_num, struct ib_port_attr *port_attr); 1231 u8 port_num, struct ib_port_attr *port_attr);
1224 1232
1233enum rdma_link_layer rdma_port_get_link_layer(struct ib_device *device,
1234 u8 port_num);
1235
1225int ib_query_gid(struct ib_device *device, 1236int ib_query_gid(struct ib_device *device,
1226 u8 port_num, int index, union ib_gid *gid); 1237 u8 port_num, int index, union ib_gid *gid);
1227 1238