}
}
-static __be16 ss_get_port(const struct sockaddr_storage *ss)
-{
- if (ss->ss_family == AF_INET)
- return ((struct sockaddr_in *)ss)->sin_port;
- else if (ss->ss_family == AF_INET6)
- return ((struct sockaddr_in6 *)ss)->sin6_port;
- BUG();
-}
-
static void cma_save_ip4_info(struct rdma_cm_id *id, struct rdma_cm_id *listen_id,
struct cma_hdr *hdr)
{
struct ib_cm_event *ib_event)
{
struct cma_hdr *hdr;
- u8 ip_ver = 0;
if (listen_id->route.addr.src_addr.ss_family == AF_IB) {
if (ib_event->event == IB_CM_REQ_RECEIVED)
if (hdr->cma_version != CMA_VERSION)
return -EINVAL;
- if (listen_id->ps == RDMA_PS_SDP)
- ip_ver = sdp_get_ip_ver((struct sdp_hh *)hdr);
- else
- ip_ver = cma_get_ip_ver(hdr);
+ if (listen_id->ps == RDMA_PS_SDP) {
+ switch (sdp_get_ip_ver((struct sdp_hh *)hdr)) {
+ case 4:
+ cma_save_ip4_info_sdp(id, listen_id, hdr);
+ break;
+ case 6:
+ cma_save_ip6_info_sdp(id, listen_id, hdr);
+ break;
+ default:
+ return -EINVAL;
+ }
+ return 0;
+ }
- switch (ip_ver) {
+ switch (cma_get_ip_ver(hdr)) {
case 4:
cma_save_ip4_info(id, listen_id, hdr);
break;
return (struct sockaddr *) &id_priv->id.route.addr.dst_addr;
}
+static __be16 ss_get_port(const struct sockaddr_storage *ss)
+{
+ if (ss->ss_family == AF_INET)
+ return ((struct sockaddr_in *)ss)->sin_port;
+ else if (ss->ss_family == AF_INET6)
+ return ((struct sockaddr_in6 *)ss)->sin6_port;
+ BUG();
+}
#endif /* _CMA_PRIV_H */
return 0;
}
+
+void cma_save_ip4_info_sdp(struct rdma_cm_id *id, struct rdma_cm_id *listen_id,
+ struct cma_hdr *cma_hdr)
+{
+ struct sockaddr_in *ip4;
+ struct sdp_hh *hdr = (struct sdp_hh *)cma_hdr;
+
+ ip4 = (struct sockaddr_in *) &id->route.addr.src_addr;
+ ip4->sin_family = AF_INET;
+ ip4->sin_addr.s_addr = hdr->dst_addr.ip4.addr;
+ ip4->sin_port = ss_get_port(&listen_id->route.addr.src_addr);
+
+ ip4 = (struct sockaddr_in *) &id->route.addr.dst_addr;
+ ip4->sin_family = AF_INET;
+ ip4->sin_addr.s_addr = hdr->src_addr.ip4.addr;
+ ip4->sin_port = hdr->port;
+}
+
+void cma_save_ip6_info_sdp(struct rdma_cm_id *id, struct rdma_cm_id *listen_id,
+ struct cma_hdr *cma_hdr)
+{
+ struct sockaddr_in6 *ip6;
+ struct sdp_hh *hdr = (struct sdp_hh *)cma_hdr;
+
+ ip6 = (struct sockaddr_in6 *) &id->route.addr.src_addr;
+ ip6->sin6_family = AF_INET6;
+ ip6->sin6_addr = hdr->dst_addr.ip6;
+ ip6->sin6_port = ss_get_port(&listen_id->route.addr.src_addr);
+
+ ip6 = (struct sockaddr_in6 *) &id->route.addr.dst_addr;
+ ip6->sin6_family = AF_INET6;
+ ip6->sin6_addr = hdr->src_addr.ip6;
+ ip6->sin6_port = hdr->port;
+
+}
extern int cma_format_hdr_sdp(void *hdr, struct rdma_id_private *id_priv);
+extern void cma_save_ip4_info_sdp(struct rdma_cm_id *id,
+ struct rdma_cm_id *listen_id,
+ struct cma_hdr *hdr);
+
+extern void cma_save_ip6_info_sdp(struct rdma_cm_id *id,
+ struct rdma_cm_id *listen_id,
+ struct cma_hdr *hdr);
+
#endif /* _CMA_SDP_PRIV_H */