From patchwork Thu May 12 12:57:06 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vitalii Demianets X-Patchwork-Id: 95314 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id E4E17B6FBC for ; Thu, 12 May 2011 23:52:40 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757335Ab1ELNwg (ORCPT ); Thu, 12 May 2011 09:52:36 -0400 Received: from mx3.cyfra.ua ([62.80.160.182]:37992 "EHLO mx3.cyfra.ua" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757075Ab1ELNwf (ORCPT ); Thu, 12 May 2011 09:52:35 -0400 X-Greylist: delayed 3275 seconds by postgrey-1.27 at vger.kernel.org; Thu, 12 May 2011 09:52:35 EDT Received: from c.15.173.a246.dynamic.cyfra.net ([62.80.173.15] helo=nppfactor.kiev.ua) by mx3.cyfra.ua with esmtp (Exim 4.63) (envelope-from ) id 1QKVTI-0000yj-Od; Thu, 12 May 2011 15:58:28 +0300 Received: from [192.168.0.20] (LUX [192.168.0.20]) by nppfactor.kiev.ua (Postfix) with ESMTP id D55DD22F27B; Thu, 12 May 2011 15:57:06 +0300 (EEST) From: Vitalii Demianets Organization: Factor-SPE To: Jay Vosburgh , Andy Gospodarek , Arnaldo Carvalho de Melo Subject: [PATCH] bonding, llc: Fix structure sizeof incompatibility for some PDUs Date: Thu, 12 May 2011 15:57:06 +0300 User-Agent: KMail/1.9.10 Cc: netdev@vger.kernel.org, bonding-devel@lists.sourceforge.net MIME-Version: 1.0 Content-Disposition: inline Message-Id: <201105121557.06679.vitas@nppfactor.kiev.ua> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org With some combinations of arch/compiler the sizeof operator on structure returns value greater than expected. In cases when the structure is used for mapping PDU fields it may lead to unexpected results (e.g. holes and alignment problems in skb data). Attribute "packed" prevents this undesired behavior. Signed-off-by: Vitalii Demianets --- drivers/net/bonding/bond_3ad.h | 10 +++++----- include/net/llc_pdu.h | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/net/bonding/bond_3ad.h b/drivers/net/bonding/bond_3ad.h index 291dbd4..6d6327a 100644 --- a/drivers/net/bonding/bond_3ad.h +++ b/drivers/net/bonding/bond_3ad.h @@ -39,7 +39,7 @@ typedef struct mac_addr { u8 mac_addr_value[ETH_ALEN]; -} mac_addr_t; +} __attribute__((packed)) mac_addr_t; enum { BOND_AD_STABLE = 0, @@ -134,12 +134,12 @@ typedef struct lacpdu { u8 tlv_type_terminator; // = terminator u8 terminator_length; // = 0 u8 reserved_50[50]; // = 0 -} lacpdu_t; +} __attribute__((packed)) lacpdu_t; typedef struct lacpdu_header { struct ethhdr hdr; struct lacpdu lacpdu; -} lacpdu_header_t; +} __attribute__((packed)) lacpdu_header_t; // Marker Protocol Data Unit(PDU) structure(43.5.3.2 in the 802.3ad standard) typedef struct bond_marker { @@ -155,12 +155,12 @@ typedef struct bond_marker { u8 tlv_type_terminator; // = 0x00 u8 terminator_length; // = 0x00 u8 reserved_90[90]; // = 0 -} bond_marker_t; +} __attribute__((packed)) bond_marker_t; typedef struct bond_marker_header { struct ethhdr hdr; struct bond_marker marker; -} bond_marker_header_t; +} __attribute__((packed)) bond_marker_header_t; #pragma pack() diff --git a/include/net/llc_pdu.h b/include/net/llc_pdu.h index 75b8e29..a8eeb3f 100644 --- a/include/net/llc_pdu.h +++ b/include/net/llc_pdu.h @@ -199,7 +199,7 @@ struct llc_pdu_sn { u8 ssap; u8 ctrl_1; u8 ctrl_2; -}; +} __attribute__((packed)); static inline struct llc_pdu_sn *llc_pdu_sn_hdr(struct sk_buff *skb) { @@ -211,7 +211,7 @@ struct llc_pdu_un { u8 dsap; u8 ssap; u8 ctrl_1; -}; +} __attribute__((packed)); static inline struct llc_pdu_un *llc_pdu_un_hdr(struct sk_buff *skb) { @@ -359,7 +359,7 @@ struct llc_xid_info { u8 fmt_id; /* always 0x81 for LLC */ u8 type; /* different if NULL/non-NULL LSAP */ u8 rw; /* sender receive window */ -}; +} __attribute__((packed)); /** * llc_pdu_init_as_xid_cmd - sets bytes 3, 4 & 5 of LLC header as XID @@ -415,7 +415,7 @@ struct llc_frmr_info { u8 curr_ssv; /* current send state variable val */ u8 curr_rsv; /* current receive state variable */ u8 ind_bits; /* indicator bits set with macro */ -}; +} __attribute__((packed)); extern void llc_pdu_set_cmd_rsp(struct sk_buff *skb, u8 type); extern void llc_pdu_set_pf_bit(struct sk_buff *skb, u8 bit_value);