aboutsummaryrefslogtreecommitdiffstats
path: root/include/rdma
diff options
context:
space:
mode:
authorRoland Dreier <roland@purestorage.com>2014-01-23 02:24:21 -0500
committerRoland Dreier <roland@purestorage.com>2014-01-23 02:24:21 -0500
commitfb1b5034e4987b158179a62732fb6dfb8f7ec88e (patch)
tree93d02ff7f0f530286fd54d03b632c6eaabc9dcc9 /include/rdma
parent8f399921ea9a562bc8221258c4b8a7bd69577939 (diff)
parent27cdef637c25705b433d5c4deeef4cf8dcb75d6a (diff)
Merge branch 'ip-roce' into for-next
Conflicts: drivers/infiniband/hw/mlx4/main.c
Diffstat (limited to 'include/rdma')
-rw-r--r--include/rdma/ib_addr.h69
-rw-r--r--include/rdma/ib_cm.h1
-rw-r--r--include/rdma/ib_pack.h1
-rw-r--r--include/rdma/ib_sa.h3
-rw-r--r--include/rdma/ib_verbs.h21
5 files changed, 73 insertions, 22 deletions
diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h
index f3ac0f2c4c66..ce55906b54a0 100644
--- a/include/rdma/ib_addr.h
+++ b/include/rdma/ib_addr.h
@@ -38,10 +38,15 @@
38#include <linux/in6.h> 38#include <linux/in6.h>
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/inetdevice.h>
41#include <linux/socket.h> 42#include <linux/socket.h>
42#include <linux/if_vlan.h> 43#include <linux/if_vlan.h>
44#include <net/ipv6.h>
45#include <net/if_inet6.h>
46#include <net/ip.h>
43#include <rdma/ib_verbs.h> 47#include <rdma/ib_verbs.h>
44#include <rdma/ib_pack.h> 48#include <rdma/ib_pack.h>
49#include <net/ipv6.h>
45 50
46struct rdma_addr_client { 51struct rdma_addr_client {
47 atomic_t refcount; 52 atomic_t refcount;
@@ -72,7 +77,8 @@ struct rdma_dev_addr {
72 * rdma_translate_ip - Translate a local IP address to an RDMA hardware 77 * rdma_translate_ip - Translate a local IP address to an RDMA hardware
73 * address. 78 * address.
74 */ 79 */
75int rdma_translate_ip(struct sockaddr *addr, struct rdma_dev_addr *dev_addr); 80int rdma_translate_ip(struct sockaddr *addr, struct rdma_dev_addr *dev_addr,
81 u16 *vlan_id);
76 82
77/** 83/**
78 * rdma_resolve_ip - Resolve source and destination IP addresses to 84 * rdma_resolve_ip - Resolve source and destination IP addresses to
@@ -104,6 +110,10 @@ int rdma_copy_addr(struct rdma_dev_addr *dev_addr, struct net_device *dev,
104 110
105int rdma_addr_size(struct sockaddr *addr); 111int rdma_addr_size(struct sockaddr *addr);
106 112
113int rdma_addr_find_smac_by_sgid(union ib_gid *sgid, u8 *smac, u16 *vlan_id);
114int rdma_addr_find_dmac_by_grh(union ib_gid *sgid, union ib_gid *dgid, u8 *smac,
115 u16 *vlan_id);
116
107static inline u16 ib_addr_get_pkey(struct rdma_dev_addr *dev_addr) 117static inline u16 ib_addr_get_pkey(struct rdma_dev_addr *dev_addr)
108{ 118{
109 return ((u16)dev_addr->broadcast[8] << 8) | (u16)dev_addr->broadcast[9]; 119 return ((u16)dev_addr->broadcast[8] << 8) | (u16)dev_addr->broadcast[9];
@@ -126,41 +136,60 @@ static inline int rdma_addr_gid_offset(struct rdma_dev_addr *dev_addr)
126 return dev_addr->dev_type == ARPHRD_INFINIBAND ? 4 : 0; 136 return dev_addr->dev_type == ARPHRD_INFINIBAND ? 4 : 0;
127} 137}
128 138
129static inline void iboe_mac_vlan_to_ll(union ib_gid *gid, u8 *mac, u16 vid) 139static inline u16 rdma_vlan_dev_vlan_id(const struct net_device *dev)
130{ 140{
131 memset(gid->raw, 0, 16); 141 return dev->priv_flags & IFF_802_1Q_VLAN ?
132 *((__be32 *) gid->raw) = cpu_to_be32(0xfe800000); 142 vlan_dev_vlan_id(dev) : 0xffff;
133 if (vid < 0x1000) { 143}
134 gid->raw[12] = vid & 0xff; 144
135 gid->raw[11] = vid >> 8; 145static inline int rdma_ip2gid(struct sockaddr *addr, union ib_gid *gid)
136 } else { 146{
137 gid->raw[12] = 0xfe; 147 switch (addr->sa_family) {
138 gid->raw[11] = 0xff; 148 case AF_INET:
149 ipv6_addr_set_v4mapped(((struct sockaddr_in *)
150 addr)->sin_addr.s_addr,
151 (struct in6_addr *)gid);
152 break;
153 case AF_INET6:
154 memcpy(gid->raw, &((struct sockaddr_in6 *)addr)->sin6_addr, 16);
155 break;
156 default:
157 return -EINVAL;
139 } 158 }
140 memcpy(gid->raw + 13, mac + 3, 3); 159 return 0;
141 memcpy(gid->raw + 8, mac, 3);
142 gid->raw[8] ^= 2;
143} 160}
144 161
145static inline u16 rdma_vlan_dev_vlan_id(const struct net_device *dev) 162/* Important - sockaddr should be a union of sockaddr_in and sockaddr_in6 */
163static inline int rdma_gid2ip(struct sockaddr *out, union ib_gid *gid)
146{ 164{
147 return dev->priv_flags & IFF_802_1Q_VLAN ? 165 if (ipv6_addr_v4mapped((struct in6_addr *)gid)) {
148 vlan_dev_vlan_id(dev) : 0xffff; 166 struct sockaddr_in *out_in = (struct sockaddr_in *)out;
167 memset(out_in, 0, sizeof(*out_in));
168 out_in->sin_family = AF_INET;
169 memcpy(&out_in->sin_addr.s_addr, gid->raw + 12, 4);
170 } else {
171 struct sockaddr_in6 *out_in = (struct sockaddr_in6 *)out;
172 memset(out_in, 0, sizeof(*out_in));
173 out_in->sin6_family = AF_INET6;
174 memcpy(&out_in->sin6_addr.s6_addr, gid->raw, 16);
175 }
176 return 0;
149} 177}
150 178
151static inline void iboe_addr_get_sgid(struct rdma_dev_addr *dev_addr, 179static inline void iboe_addr_get_sgid(struct rdma_dev_addr *dev_addr,
152 union ib_gid *gid) 180 union ib_gid *gid)
153{ 181{
154 struct net_device *dev; 182 struct net_device *dev;
155 u16 vid = 0xffff; 183 struct in_device *ip4;
156 184
157 dev = dev_get_by_index(&init_net, dev_addr->bound_dev_if); 185 dev = dev_get_by_index(&init_net, dev_addr->bound_dev_if);
158 if (dev) { 186 if (dev) {
159 vid = rdma_vlan_dev_vlan_id(dev); 187 ip4 = (struct in_device *)dev->ip_ptr;
188 if (ip4 && ip4->ifa_list && ip4->ifa_list->ifa_address)
189 ipv6_addr_set_v4mapped(ip4->ifa_list->ifa_address,
190 (struct in6_addr *)gid);
160 dev_put(dev); 191 dev_put(dev);
161 } 192 }
162
163 iboe_mac_vlan_to_ll(gid, dev_addr->src_dev_addr, vid);
164} 193}
165 194
166static inline void rdma_addr_get_sgid(struct rdma_dev_addr *dev_addr, union ib_gid *gid) 195static inline void rdma_addr_get_sgid(struct rdma_dev_addr *dev_addr, union ib_gid *gid)
diff --git a/include/rdma/ib_cm.h b/include/rdma/ib_cm.h
index 0e3ff30647d5..f29e3a27c2cc 100644
--- a/include/rdma/ib_cm.h
+++ b/include/rdma/ib_cm.h
@@ -601,4 +601,5 @@ struct ib_cm_sidr_rep_param {
601int ib_send_cm_sidr_rep(struct ib_cm_id *cm_id, 601int ib_send_cm_sidr_rep(struct ib_cm_id *cm_id,
602 struct ib_cm_sidr_rep_param *param); 602 struct ib_cm_sidr_rep_param *param);
603 603
604int ib_update_cm_av(struct ib_cm_id *id, const u8 *smac, const u8 *alt_smac);
604#endif /* IB_CM_H */ 605#endif /* IB_CM_H */
diff --git a/include/rdma/ib_pack.h b/include/rdma/ib_pack.h
index b37fe3b10a9d..b1f7592e02e4 100644
--- a/include/rdma/ib_pack.h
+++ b/include/rdma/ib_pack.h
@@ -34,6 +34,7 @@
34#define IB_PACK_H 34#define IB_PACK_H
35 35
36#include <rdma/ib_verbs.h> 36#include <rdma/ib_verbs.h>
37#include <uapi/linux/if_ether.h>
37 38
38enum { 39enum {
39 IB_LRH_BYTES = 8, 40 IB_LRH_BYTES = 8,
diff --git a/include/rdma/ib_sa.h b/include/rdma/ib_sa.h
index 125f8714301d..7e071a6abb34 100644
--- a/include/rdma/ib_sa.h
+++ b/include/rdma/ib_sa.h
@@ -154,6 +154,9 @@ struct ib_sa_path_rec {
154 u8 packet_life_time_selector; 154 u8 packet_life_time_selector;
155 u8 packet_life_time; 155 u8 packet_life_time;
156 u8 preference; 156 u8 preference;
157 u8 smac[ETH_ALEN];
158 u8 dmac[ETH_ALEN];
159 u16 vlan_id;
157}; 160};
158 161
159#define IB_SA_MCMEMBER_REC_MGID IB_SA_COMP_MASK( 0) 162#define IB_SA_MCMEMBER_REC_MGID IB_SA_COMP_MASK( 0)
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index c6d343078617..8d4a1c06f7e4 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -48,6 +48,7 @@
48#include <linux/rwsem.h> 48#include <linux/rwsem.h>
49#include <linux/scatterlist.h> 49#include <linux/scatterlist.h>
50#include <linux/workqueue.h> 50#include <linux/workqueue.h>
51#include <uapi/linux/if_ether.h>
51 52
52#include <linux/atomic.h> 53#include <linux/atomic.h>
53#include <asm/uaccess.h> 54#include <asm/uaccess.h>
@@ -474,6 +475,8 @@ struct ib_ah_attr {
474 u8 static_rate; 475 u8 static_rate;
475 u8 ah_flags; 476 u8 ah_flags;
476 u8 port_num; 477 u8 port_num;
478 u8 dmac[ETH_ALEN];
479 u16 vlan_id;
477}; 480};
478 481
479enum ib_wc_status { 482enum ib_wc_status {
@@ -526,6 +529,8 @@ enum ib_wc_flags {
526 IB_WC_WITH_IMM = (1<<1), 529 IB_WC_WITH_IMM = (1<<1),
527 IB_WC_WITH_INVALIDATE = (1<<2), 530 IB_WC_WITH_INVALIDATE = (1<<2),
528 IB_WC_IP_CSUM_OK = (1<<3), 531 IB_WC_IP_CSUM_OK = (1<<3),
532 IB_WC_WITH_SMAC = (1<<4),
533 IB_WC_WITH_VLAN = (1<<5),
529}; 534};
530 535
531struct ib_wc { 536struct ib_wc {
@@ -546,6 +551,8 @@ struct ib_wc {
546 u8 sl; 551 u8 sl;
547 u8 dlid_path_bits; 552 u8 dlid_path_bits;
548 u8 port_num; /* valid only for DR SMPs on switches */ 553 u8 port_num; /* valid only for DR SMPs on switches */
554 u8 smac[ETH_ALEN];
555 u16 vlan_id;
549}; 556};
550 557
551enum ib_cq_notify_flags { 558enum ib_cq_notify_flags {
@@ -724,7 +731,11 @@ enum ib_qp_attr_mask {
724 IB_QP_MAX_DEST_RD_ATOMIC = (1<<17), 731 IB_QP_MAX_DEST_RD_ATOMIC = (1<<17),
725 IB_QP_PATH_MIG_STATE = (1<<18), 732 IB_QP_PATH_MIG_STATE = (1<<18),
726 IB_QP_CAP = (1<<19), 733 IB_QP_CAP = (1<<19),
727 IB_QP_DEST_QPN = (1<<20) 734 IB_QP_DEST_QPN = (1<<20),
735 IB_QP_SMAC = (1<<21),
736 IB_QP_ALT_SMAC = (1<<22),
737 IB_QP_VID = (1<<23),
738 IB_QP_ALT_VID = (1<<24),
728}; 739};
729 740
730enum ib_qp_state { 741enum ib_qp_state {
@@ -774,6 +785,10 @@ struct ib_qp_attr {
774 u8 rnr_retry; 785 u8 rnr_retry;
775 u8 alt_port_num; 786 u8 alt_port_num;
776 u8 alt_timeout; 787 u8 alt_timeout;
788 u8 smac[ETH_ALEN];
789 u8 alt_smac[ETH_ALEN];
790 u16 vlan_id;
791 u16 alt_vlan_id;
777}; 792};
778 793
779enum ib_wr_opcode { 794enum ib_wr_opcode {
@@ -1505,6 +1520,7 @@ static inline int ib_copy_to_udata(struct ib_udata *udata, void *src, size_t len
1505 * @next_state: Next QP state 1520 * @next_state: Next QP state
1506 * @type: QP type 1521 * @type: QP type
1507 * @mask: Mask of supplied QP attributes 1522 * @mask: Mask of supplied QP attributes
1523 * @ll : link layer of port
1508 * 1524 *
1509 * This function is a helper function that a low-level driver's 1525 * This function is a helper function that a low-level driver's
1510 * modify_qp method can use to validate the consumer's input. It 1526 * modify_qp method can use to validate the consumer's input. It
@@ -1513,7 +1529,8 @@ static inline int ib_copy_to_udata(struct ib_udata *udata, void *src, size_t len
1513 * and that the attribute mask supplied is allowed for the transition. 1529 * and that the attribute mask supplied is allowed for the transition.
1514 */ 1530 */
1515int ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state, 1531int ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state,
1516 enum ib_qp_type type, enum ib_qp_attr_mask mask); 1532 enum ib_qp_type type, enum ib_qp_attr_mask mask,
1533 enum rdma_link_layer ll);
1517 1534
1518int ib_register_event_handler (struct ib_event_handler *event_handler); 1535int ib_register_event_handler (struct ib_event_handler *event_handler);
1519int ib_unregister_event_handler(struct ib_event_handler *event_handler); 1536int ib_unregister_event_handler(struct ib_event_handler *event_handler);