]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
Fix struct alignment with cris architecture
authorAndy Gay <andy@andynet.net>
Fri, 11 Aug 2006 00:25:40 +0000 (20:25 -0400)
committerStephen Hemminger <shemminger@osdl.org>
Fri, 11 Aug 2006 16:44:36 +0000 (09:44 -0700)
[IPROUTE]: Fix struct alignment with cris architecture

gcc for the cris arch does not pad structures to the next multiple of 4
bytes, as the i386 gcc does.

This causes errors like this when displaying xfrm policies:

# ip x p
!!!Deficit 3, rta_len=300
src 192.168.251.32/29 dst 192.168.251.32/29
        dir in priority 0
!!!Deficit 3, rta_len=180
src 0.0.0.0/0 dst 192.168.251.32/29
        dir in priority 2208
....

Similar errors are seen from ip x s.

This patch fixes the errors when printing. I'm not sure whether we
should worry about other uses of the affected structs, I've not seen any
other bad effects from this though, so hopefully this is enough.

(Thanks to Herbert Xu for pointing out that NLMSG_SPACE is the correct
macro to use here.)

Tested against 2.6.17.6 kernel on i386, and 2.6.16.1 kernel on cris.

Signed-off-by: Andy Gay <andy@andynet.net>
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
ip/xfrm_policy.c
ip/xfrm_state.c

index 433b5136b4782dfb56a4d8e1bbd0c97b891431bc..340e7df793b3463facc571ee0dcdcd72546121d2 100644 (file)
@@ -354,15 +354,15 @@ int xfrm_policy_print(const struct sockaddr_nl *who, struct nlmsghdr *n,
 
        if (n->nlmsg_type == XFRM_MSG_DELPOLICY)  {
                xpid = NLMSG_DATA(n);
-               len -= NLMSG_LENGTH(sizeof(*xpid));
+               len -= NLMSG_SPACE(sizeof(*xpid));
        } else if (n->nlmsg_type == XFRM_MSG_POLEXPIRE) {
                xpexp = NLMSG_DATA(n);
                xpinfo = &xpexp->pol;
-               len -= NLMSG_LENGTH(sizeof(*xpexp));
+               len -= NLMSG_SPACE(sizeof(*xpexp));
        } else {
                xpexp = NULL;
                xpinfo = NLMSG_DATA(n);
-               len -= NLMSG_LENGTH(sizeof(*xpinfo));
+               len -= NLMSG_SPACE(sizeof(*xpinfo));
        }
 
        if (len < 0) {
index 3eefaff82c7dce49f7d4c4f06f43490aa6b3e7c0..1d61685a149e5548063dd05179955517d78942fa 100644 (file)
@@ -575,15 +575,15 @@ int xfrm_state_print(const struct sockaddr_nl *who, struct nlmsghdr *n,
        if (n->nlmsg_type == XFRM_MSG_DELSA) {
                /* Dont blame me for this .. Herbert made me do it */
                xsid = NLMSG_DATA(n);
-               len -= NLMSG_LENGTH(sizeof(*xsid));
+               len -= NLMSG_SPACE(sizeof(*xsid));
        } else if (n->nlmsg_type == XFRM_MSG_EXPIRE) {
                xexp = NLMSG_DATA(n);
                xsinfo = &xexp->state;
-               len -= NLMSG_LENGTH(sizeof(*xexp));
+               len -= NLMSG_SPACE(sizeof(*xexp));
        } else {
                xexp = NULL;
                xsinfo = NLMSG_DATA(n);
-               len -= NLMSG_LENGTH(sizeof(*xsinfo));
+               len -= NLMSG_SPACE(sizeof(*xsinfo));
        }
 
        if (len < 0) {