/*====================================================================*
*
* Copyright (c) 2013 Qualcomm Atheros, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted (subject to the limitations
* in the disclaimer below) provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* * Neither the name of Qualcomm Atheros nor the names of
* its contributors may be used to endorse or promote products
* derived from this software without specific prior written
* permission.
*
* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
* GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE
* COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*--------------------------------------------------------------------*/
/*====================================================================*
*
* pib.h - PIB version definitions and declarations;
*
* The PIB undergoes periodic revision as new features are added;
* versions are distiguished from one another by the first two bytes;
*
* this file declares PIB header structure for PIBs released to
* date; it does not define the position of all PIB information
* because there must be some mystery to life;
*
* call function pibpeek() to display a buffer holding an unkown
* PIB structure;
*
*. Qualcomm Atheros HomePlug AV Powerline Toolkit;
*: Copyright (c) 2006-2010 by Intellon Corporation; ALL RIGHTS RESERVED;
*; For demonstration and evaluation only; Not for production use.
*
* Contributor(s):
* Charles Maier <cmaier@qca.qualcomm.com>
*
*--------------------------------------------------------------------*/
#ifndef PIB_HEADER
#define PIB_HEADER
/*====================================================================*
* system header files;
*--------------------------------------------------------------------*/
#include <stdio.h>
#include <stdint.h>
#include <errno.h>
#ifndef ETHER_ADDR_LEN
#define ETHER_ADDR_LEN 6 /* normally defined in ethernet.h or if_ether.h */
#endif
/*====================================================================*
* custom header files;
*--------------------------------------------------------------------*/
#include "../tools/types.h"
#include "../tools/memory.h"
#include "../key/HPAVKey.h"
/*====================================================================*
* constants;
*--------------------------------------------------------------------*/
#define PIB_NAME_LEN 32
#define PIB_HFID_LEN 64
#define PIB_TEXT_LEN 256
#define PIB_KEY_LEN 16
#define PIB_SILENCE (1 << 0)
#define PIB_VERBOSE (1 << 1)
#define PIB_MANIFEST (1 << 2)
#define PIB_MAC (1 << 3)
#define PIB_MACINC (1 << 4)
#define PIB_NMK (1 << 5)
#define PIB_DAK (1 << 6)
#define PIB_MFGSTRING (1 << 7)
#define PIB_USER (1 << 8)
#define PIB_NETWORK (1 << 9)
#define PIB_CCO_MODE (1 << 10)
#define PIB_NID (1 << 11)
#define PIB_CHECKED (1 << 12)
#define INT_PRESCALER_OFFSET 0x0A10
#define INT_PRESCALER_LENGTH (1155 * sizeof (uint32_t))
#define AMP_PRESCALER_OFFSET 0x0A30
#define AMP_PRESCALER_LENGTH ((2880 * 5) / sizeof (uint32_t))
#define PLC_PRESCALER_OFFSET 0x0F2B
#define PLC_PRESCALER_LENGTH (1345 / sizeof (uint32_t))
#define QCA_PRESCALER_OFFSET 0x12E8
#define QCA_PRESCALER_LENGTH 1345
#define INDEX_TO_FREQ(index) ((float)((index)+74)/40.96)
#define FREQ_TO_INDEX(freq) ((unsigned)(40.96*(freq))-74)
/*====================================================================*
* standard PIB message formats;
*--------------------------------------------------------------------*/
#define PIB_BADVERSION "%s found bad PIB version in %s", __func__
#define PIB_BADCONTENT "%s found wrong PIB content in %s", __func__
#define PIB_BADLENGTH "%s found wrong PIB image length in %s", __func__
#define PIB_BADCHECKSUM "%s found wrong PIB image checksum in %s", __func__
#define PIB_BADNID "%s found wrong Preferred NID in %s", __func__
/*====================================================================*
* Basic PIB header;
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed pib_header
{
uint8_t FWVERSION;
uint8_t PIBVERSION;
uint16_t RESERVED1;
uint16_t PIBLENGTH;
uint16_t RESERVED2;
uint32_t CHECKSUM;
}
pib_header;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* As of PIB 1.4 a generic structure evolved; this is the start;
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed simple_pib
{
uint16_t PIBVERSION;
uint16_t RESERVED1;
uint16_t PIBLENGTH;
uint16_t RESERVED2;
uint32_t CHECKSUM;
uint8_t MAC [ETHER_ADDR_LEN];
uint8_t DAK [HPAVKEY_DAK_LEN];
uint16_t RESERVED3;
uint8_t MFG [PIB_HFID_LEN];
uint8_t NMK [HPAVKEY_NMK_LEN];
uint8_t USR [PIB_HFID_LEN];
uint8_t NET [PIB_HFID_LEN];
uint8_t CCoSelection;
uint8_t CexistModeSelect;
uint8_t PLFreqSelect;
uint8_t RESERVED4;
uint8_t PreferredNID [HPAVKEY_NID_LEN];
uint8_t AutoFWUpgradeable;
uint8_t MDUConfiguration;
uint8_t MDURole;
uint8_t RESERVED5 [10];
uint8_t StaticNetworkConfiguration [128];
uint8_t InterfaceConfiguration [64];
}
simple_pib;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
*
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed PIB1
{
uint8_t FWVersion;
uint8_t PIBVersion;
uint16_t Reserved1;
uint16_t PIBLength;
}
PIB1;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB structure as of v1.2; this is deprecated;
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed PIB1_2
{
uint8_t FWVersion;
uint8_t PIBVersion;
uint16_t Reserved1;
uint8_t DAK [HPAVKEY_DAK_LEN];
uint8_t NMK [HPAVKEY_NMK_LEN];
uint8_t MAC [ETHER_ADDR_LEN];
uint32_t FLG;
}
PIB1_2;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB Structure as of v1.3; this is deprecated;
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed PIB1_3
{
uint8_t FWVersion;
uint8_t PIBVersion;
uint16_t Reserved1;
uint8_t MAC [ETHER_ADDR_LEN];
uint8_t DAK [HPAVKEY_DAK_LEN];
uint16_t Reserved2;
uint8_t MFG [PIB_HFID_LEN];
uint8_t NMK [HPAVKEY_NMK_LEN];
uint8_t USR [PIB_HFID_LEN];
uint8_t NET [PIB_HFID_LEN];
}
PIB1_3;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB sub-structure introduced as of v1.4
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed VersionHeader
{
uint8_t FWVersion;
uint8_t PIBVersion;
uint16_t Reserved1;
uint16_t PIBLength;
uint16_t Reserved2;
uint32_t Checksum;
}
VersionHeader;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB Structure as of v1.4
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed PIB1_4
{
struct VersionHeader VersionHeader;
struct __packed
{
uint8_t MAC [ETHER_ADDR_LEN];
uint8_t DAK [HPAVKEY_DAK_LEN];
uint16_t Reserved1;
uint8_t MFG [PIB_HFID_LEN];
uint8_t NMK [HPAVKEY_NMK_LEN];
uint8_t USR [PIB_HFID_LEN];
uint8_t NET [PIB_HFID_LEN];
uint8_t CCoSelection;
uint8_t CoexistModeSelection;
uint8_t FreqSelection;
uint8_t Reserved2;
}
LocalDeviceConfig;
}
PIB1_4;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB sub-structures introduced as of v1.5;
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed LocalDeviceConfig
{
uint8_t MAC [ETHER_ADDR_LEN];
uint8_t DAK [HPAVKEY_DAK_LEN];
uint16_t Reserved1;
uint8_t MFG [PIB_HFID_LEN];
uint8_t NMK [HPAVKEY_NMK_LEN];
uint8_t USR [PIB_HFID_LEN];
uint8_t NET [PIB_HFID_LEN];
uint8_t CCoSelection;
uint8_t CoexistModeSelect;
uint8_t PLFreqSelection;
uint8_t Reserved2;
uint8_t PreferredNID [HPAVKEY_NID_LEN];
uint8_t AutoFWUpgradeable;
uint8_t MDUConfiguration;
uint8_t MDURole;
uint8_t Reserved3 [10];
}
LocalDeviceConfig;
typedef struct __packed StaticNetworkConfig
{
uint8_t Reserved [128];
}
StaticNetworkConfig;
typedef struct __packed InterfaceConfig
{
uint8_t Reserved [96];
}
InterfaceConfig;
typedef struct __packed IGMPConfig
{
uint8_t Reserved [32];
}
IGMPConfig;
typedef struct __packed QoSParameters
{
uint8_t UnicastPriority;
uint8_t McastPriority;
uint8_t IGMPPriority;
uint8_t AVStreamPriority;
uint32_t PriorityTTL [4];
uint8_t EnableVLANOver;
uint8_t EnableTOSOver;
uint16_t Reserved1;
uint32_t VLANPrioTOSPrecMatrix;
uint8_t Reserved2 [2020];
}
QoSParameters;
typedef struct __packed ToneNotchParameters
{
uint8_t Reserved [5120];
}
ToneNotchParameters;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB structure as of v1.5
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed PIB1_5
{
struct VersionHeader VersionHeader;
struct LocalDeviceConfig LocalDeviceConfig;
struct StaticNetworkConfig StaticNetworkConfig;
struct InterfaceConfig InterfaceConfig;
struct IGMPConfig IGMPConfig;
struct QoSParameters QoSParameters;
struct ToneNotchParameters ToneNotchParameters;
}
PIB1_5;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB sub-structures introduced as of v2.0
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed FeatureConfiguration
{
uint8_t Reserved [128];
}
FeatureConfiguration;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB structure as of v2.0
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed PIB2_0
{
struct VersionHeader VersionHeader;
struct LocalDeviceConfig LocalDeviceConfig;
struct StaticNetworkConfig StaticNetworkConfig;
struct InterfaceConfig InterfaceConfig;
struct IGMPConfig IGMPConfig;
struct QoSParameters QoSParameters;
struct ToneNotchParameters ToneNotchParameters;
struct FeatureConfiguration FeatureConfiguration;
}
PIB2_0;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB sub-structures introduced as of v3.0;
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed V3_0Configuration
{
uint32_t AVLNMembership;
uint32_t SimpleConnectTimeout;
uint8_t EnableLEDThroughputIndicate;
uint8_t MidLEDThroughputThreshold;
uint8_t HighLEDThroughputThreshold;
uint8_t Reserved1;
uint32_t EnableUnicastQueriesToMembers;
uint32_t DisableExpireGroupMulticastInterval;
uint32_t DisableLEDTestLights;
uint8_t GPIOMap [12];
uint8_t Reserved [8];
}
V3_0Configuration;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB structure as of v3.0;
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed PIB3_0
{
struct VersionHeader VersionHeader;
struct LocalDeviceConfig LocalDeviceConfig;
struct StaticNetworkConfig StaticNetworkConfig;
struct InterfaceConfig InterfaceConfig;
struct IGMPConfig IGMPConfig;
struct QoSParameters QoSParameters;
struct ToneNotchParameters ToneNotchParameters;
struct FeatureConfiguration FeatureConfiguration;
struct V3_0Configuration V3_0Configuration;
}
PIB3_0;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB sub-structures introduced as of v3.1;
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed V3_1Configuration
{
uint8_t Reserved [128];
}
V3_1Configuration;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB structure as of v3.1;
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed PIB3_1
{
struct VersionHeader VersionHeader;
struct LocalDeviceConfig LocalDeviceConfig;
struct StaticNetworkConfig StaticNetworkConfig;
struct InterfaceConfig InterfaceConfig;
struct IGMPConfig IGMPConfig;
struct QoSParameters QoSParameters;
struct ToneNotchParameters ToneNotchParameters;
struct FeatureConfiguration FeatureConfiguration;
struct V3_0Configuration V3_0Configuration;
struct V3_1Configuration V3_1Configuration;
}
PIB3_1;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB structure as of v3.2
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed PIB3_2
{
struct VersionHeader VersionHeader;
struct LocalDeviceConfig LocalDeviceConfig;
struct StaticNetworkConfig StaticNetworkConfig;
struct InterfaceConfig InterfaceConfig;
struct IGMPConfig IGMPConfig;
struct QoSParameters QoSParameters;
struct ToneNotchParameters ToneNotchParameters;
struct FeatureConfiguration FeatureConfiguration;
struct V3_0Configuration V3_0Configuration;
struct V3_1Configuration V3_1Configuration;
}
PIB3_2;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB sub-structure introduced as of v3.3;
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed V3_3Configuration
{
uint8_t Reserved [64];
}
V3_3Configuration;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB structure as of v3.3
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed PIB3_3
{
struct VersionHeader VersionHeader;
struct LocalDeviceConfig LocalDeviceConfig;
struct StaticNetworkConfig StaticNetworkConfig;
struct InterfaceConfig InterfaceConfig;
struct IGMPConfig IGMPConfig;
struct QoSParameters QoSParameters;
struct ToneNotchParameters ToneNotchParameters;
struct FeatureConfiguration FeatureConfiguration;
struct V3_0Configuration V3_0Configuration;
struct V3_1Configuration V3_1Configuration;
struct V3_3Configuration V3_3Configuration;
}
PIB3_3;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB structure as of v3.4
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed PIB3_4
{
struct VersionHeader VersionHeader;
struct LocalDeviceConfig LocalDeviceConfig;
struct StaticNetworkConfig StaticNetworkConfig;
struct InterfaceConfig InterfaceConfig;
struct IGMPConfig IGMPConfig;
struct QoSParameters QoSParameters;
struct ToneNotchParameters ToneNotchParameters;
struct FeatureConfiguration FeatureConfiguration;
struct V3_0Configuration V3_0Configuration;
struct V3_1Configuration V3_1Configuration;
struct V3_3Configuration V3_3Configuration;
}
PIB3_4;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB sub-structure introduced as of v3.5
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed FeatureGroupEnablement
{
uint8_t Reserved [16];
}
FeatureGroupEnablement;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB structure as of v3.5
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed PIB3_5
{
struct VersionHeader VersionHeader;
struct LocalDeviceConfig LocalDeviceConfig;
struct StaticNetworkConfig StaticNetworkConfig;
struct InterfaceConfig InterfaceConfig;
struct IGMPConfig IGMPConfig;
struct QoSParameters QoSParameters;
struct ToneNotchParameters ToneNotchParameters;
struct FeatureConfiguration FeatureConfiguration;
struct V3_0Configuration V3_0Configuration;
struct V3_1Configuration V3_1Configuration;
struct V3_3Configuration V3_3Configuration;
struct FeatureGroupEnablement FeatureGroupEnablement;
}
PIB3_5;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* PIB structure as of v3.6
*--------------------------------------------------------------------*/
#ifndef __GNUC__
#pragma pack (push, 1)
#endif
typedef struct __packed PIB3_6
{
struct VersionHeader VersionHeader;
struct LocalDeviceConfig LocalDeviceConfig;
struct StaticNetworkConfig StaticNetworkConfig;
struct InterfaceConfig InterfaceConfig;
struct IGMPConfig IGMPConfig;
struct QoSParameters QoSParameters;
struct ToneNotchParameters ToneNotchParameters;
struct FeatureConfiguration FeatureConfiguration;
struct V3_0Configuration V3_0Configuration;
struct V3_1Configuration V3_1Configuration;
struct V3_3Configuration V3_3Configuration;
struct FeatureGroupEnablement FeatureGroupEnablement;
}
PIB3_6;
#ifndef __GNUC__
#pragma pack (pop)
#endif
/*====================================================================*
* functions;
*--------------------------------------------------------------------*/
signed pibseek (signed fd, char const * filename, flag_t flags);
signed pibfile (struct _file_ const * pib);
signed pibfile1 (struct _file_ const * pib);
signed pibfile2 (struct _file_ const * pib);
signed piblock (struct _file_ const * pib);
signed pibpeek1 (void const * memory);
signed pibpeek2 (void const * memory);
uint16_t pibscalers (struct _file_ * pib);
uint16_t psread (uint16_t values [], uint16_t limit, FILE * fp);
/*====================================================================*
*
*--------------------------------------------------------------------*/
#endif