The device address contains unsigned character arrays, which contain raw
GID addresses.  The GIDs may not be naturally aligned, so do not cast
them to structures or unions.

Signed-off-by: Sean Hefty <[EMAIL PROTECTED]>
---
This fixes an alignment issue pointed out by Michael when adding MGID
support to the ib_addr module.

Index: include/rdma/ib_addr.h
===================================================================
--- include/rdma/ib_addr.h      (revision 8224)
+++ include/rdma/ib_addr.h      (working copy)
@@ -89,14 +89,16 @@ static inline void ib_addr_set_pkey(stru
        dev_addr->broadcast[9] = (unsigned char) pkey;
 }
 
-static inline union ib_gid *ib_addr_get_mgid(struct rdma_dev_addr *dev_addr)
+static inline void ib_addr_get_mgid(struct rdma_dev_addr *dev_addr,
+                                   union ib_gid *gid)
 {
-       return  (union ib_gid *) (dev_addr->broadcast + 4);
+       memcpy(gid, dev_addr->broadcast + 4, sizeof *gid);
 }
 
-static inline union ib_gid *ib_addr_get_sgid(struct rdma_dev_addr *dev_addr)
+static inline void ib_addr_get_sgid(struct rdma_dev_addr *dev_addr,
+                                   union ib_gid *gid)
 {
-       return  (union ib_gid *) (dev_addr->src_dev_addr + 4);
+       memcpy(gid, dev_addr->src_dev_addr + 4, sizeof *gid);
 }
 
 static inline void ib_addr_set_sgid(struct rdma_dev_addr *dev_addr,
@@ -105,9 +107,10 @@ static inline void ib_addr_set_sgid(stru
        memcpy(dev_addr->src_dev_addr + 4, gid, sizeof *gid);
 }
 
-static inline union ib_gid *ib_addr_get_dgid(struct rdma_dev_addr *dev_addr)
+static inline void ib_addr_get_dgid(struct rdma_dev_addr *dev_addr,
+                                   union ib_gid *gid)
 {
-       return  (union ib_gid *) (dev_addr->dst_dev_addr + 4);
+       memcpy(gid, dev_addr->dst_dev_addr + 4, sizeof *gid);
 }
 
 static inline void ib_addr_set_dgid(struct rdma_dev_addr *dev_addr,
Index: core/ucma_ib.c
===================================================================
--- core/ucma_ib.c      (revision 8224)
+++ core/ucma_ib.c      (working copy)
@@ -40,27 +40,27 @@ static int ucma_get_paths(struct rdma_cm
        struct ib_sa_cursor *cursor;
        struct ib_sa_path_rec *path;
        struct ib_user_path_rec user_path;
-       union ib_gid *gid;
+       union ib_gid gid;
        int left, ret = 0;
        u16 pkey;
 
        if (!id->device)
                return -ENODEV;
 
-       gid = ib_addr_get_dgid(&id->route.addr.dev_addr);
+       ib_addr_get_dgid(&id->route.addr.dev_addr, &gid);
        pkey = ib_addr_get_pkey(&id->route.addr.dev_addr);
-       cursor = ib_create_path_cursor(id->device, id->port_num, gid);
+       cursor = ib_create_path_cursor(id->device, id->port_num, &gid);
        if (IS_ERR(cursor))
                return PTR_ERR(cursor);
 
-       gid = ib_addr_get_sgid(&id->route.addr.dev_addr);
+       ib_addr_get_sgid(&id->route.addr.dev_addr, &gid);
        left = *len;
        *len = 0;
 
        for (path = ib_get_next_sa_attr(&cursor); path;
             path = ib_get_next_sa_attr(&cursor)) {
                if (pkey == path->pkey &&
-                   !memcmp(gid, path->sgid.raw, sizeof *gid)) {
+                   !memcmp(&gid, path->sgid.raw, sizeof gid)) {
                        if (paths) {
                                ib_copy_path_rec_to_user(&user_path, path);
                                if (copy_to_user(paths, &user_path,
Index: core/cma.c
===================================================================
--- core/cma.c  (revision 8224)
+++ core/cma.c  (working copy)
@@ -278,14 +278,14 @@ static void cma_detach_from_dev(struct r
 static int cma_acquire_ib_dev(struct rdma_id_private *id_priv)
 {
        struct cma_device *cma_dev;
-       union ib_gid *gid;
+       union ib_gid gid;
        int ret = -ENODEV;
 
-       gid = ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr);
+       ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr, &gid),
 
        mutex_lock(&lock);
        list_for_each_entry(cma_dev, &dev_list, list) {
-               ret = ib_find_cached_gid(cma_dev->device, gid,
+               ret = ib_find_cached_gid(cma_dev->device, &gid,
                                         &id_priv->id.port_num, NULL);
                if (!ret) {
                        cma_attach_to_dev(id_priv, cma_dev);
@@ -1266,8 +1266,8 @@ static int cma_query_ib_route(struct rdm
        struct ib_sa_path_rec path_rec;
 
        memset(&path_rec, 0, sizeof path_rec);
-       path_rec.sgid = *ib_addr_get_sgid(addr);
-       path_rec.dgid = *ib_addr_get_dgid(addr);
+       ib_addr_get_sgid(addr, &path_rec.sgid);
+       ib_addr_get_dgid(addr, &path_rec.dgid);
        path_rec.pkey = cpu_to_be16(ib_addr_get_pkey(addr));
        path_rec.numb_path = 1;
 
@@ -1326,8 +1326,10 @@ static int cma_resolve_ib_route(struct r
                goto err1;
        }
 
+       ib_addr_get_sgid(addr, &route->path_rec->sgid);
+       ib_addr_get_dgid(addr, &route->path_rec->dgid);
        ret = ib_get_path_rec(id_priv->id.device, id_priv->id.port_num,
-                             ib_addr_get_sgid(addr), ib_addr_get_dgid(addr),
+                             &route->path_rec->sgid, &route->path_rec->dgid,
                              ib_addr_get_pkey(addr), route->path_rec);
        if (!ret) {
                route->num_paths = 1;
@@ -1463,7 +1465,7 @@ static int cma_bind_loopback(struct rdma
 {
        struct cma_device *cma_dev;
        struct ib_port_attr port_attr;
-       union ib_gid *gid;
+       union ib_gid gid;
        u16 pkey;
        int ret;
        u8 p;
@@ -1484,8 +1486,7 @@ static int cma_bind_loopback(struct rdma
        }
 
 port_found:
-       gid = ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr);
-       ret = ib_get_cached_gid(cma_dev->device, p, 0, gid);
+       ret = ib_get_cached_gid(cma_dev->device, p, 0, &gid);
        if (ret)
                goto out;
 
@@ -1493,6 +1494,7 @@ port_found:
        if (ret)
                goto out;
 
+       ib_addr_set_sgid(&id_priv->id.route.addr.dev_addr, &gid);
        ib_addr_set_pkey(&id_priv->id.route.addr.dev_addr, pkey);
        id_priv->id.port_num = p;
        cma_attach_to_dev(id_priv, cma_dev);
@@ -1539,6 +1541,7 @@ static int cma_resolve_loopback(struct r
 {
        struct cma_work *work;
        struct sockaddr_in *src_in, *dst_in;
+       union ib_gid gid;
        int ret;
 
        work = kzalloc(sizeof *work, GFP_KERNEL);
@@ -1551,8 +1554,8 @@ static int cma_resolve_loopback(struct r
                        goto err;
        }
 
-       ib_addr_set_dgid(&id_priv->id.route.addr.dev_addr,
-                        ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr));
+       ib_addr_get_sgid(&id_priv->id.route.addr.dev_addr, &gid);
+       ib_addr_set_dgid(&id_priv->id.route.addr.dev_addr, &gid);
 
        if (cma_zero_addr(&id_priv->id.route.addr.src_addr)) {
                src_in = (struct sockaddr_in *)&id_priv->id.route.addr.src_addr;
@@ -2153,8 +2156,9 @@ static int cma_join_ib_multicast(struct 
        ib_sa_comp_mask comp_mask;
        int ret;
 
+       ib_addr_get_mgid(dev_addr, &rec.mgid);
        ret = ib_get_mcmember_rec(id_priv->id.device, id_priv->id.port_num,
-                                 ib_addr_get_mgid(dev_addr), &rec);
+                                 &rec.mgid, &rec);
        if (ret)
                return ret;
 
@@ -2163,8 +2167,8 @@ static int cma_join_ib_multicast(struct 
        mc_map[8] = ib_addr_get_pkey(dev_addr) >> 8;
        mc_map[9] = (unsigned char) ib_addr_get_pkey(dev_addr);
 
-       rec.mgid = *(union ib_gid *) (mc_map + 4);
-       rec.port_gid = *ib_addr_get_sgid(dev_addr);
+       memcpy(&rec.mgid.raw, mc_map + 4, sizeof rec.mgid);
+       ib_addr_get_sgid(dev_addr, &rec.port_gid);
        rec.pkey = cpu_to_be16(ib_addr_get_pkey(dev_addr));
        rec.join_state = 1;
        rec.qkey = sin->sin_addr.s_addr;
Index: core/ucma.c
===================================================================
--- core/ucma.c (revision 8224)
+++ core/ucma.c (working copy)
@@ -453,10 +453,10 @@ static void ucma_copy_ib_route(struct rd
        switch (route->num_paths) {
        case 0:
                dev_addr = &route->addr.dev_addr;
-               memcpy(&resp->ib_route[0].dgid, ib_addr_get_dgid(dev_addr),
-                      sizeof(union ib_gid));
-               memcpy(&resp->ib_route[0].sgid, ib_addr_get_sgid(dev_addr),
-                      sizeof(union ib_gid));
+               ib_addr_get_dgid(dev_addr,
+                                (union ib_gid *) &resp->ib_route[0].dgid);
+               ib_addr_get_sgid(dev_addr,
+                                (union ib_gid *) &resp->ib_route[0].sgid);
                resp->ib_route[0].pkey = 
cpu_to_be16(ib_addr_get_pkey(dev_addr));
                break;
        case 2:


_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to