    /*====================================================================*
     *
     *   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.
     *
     *--------------------------------------------------------------------*/

    #ifndef PLC_HEADER
    #define PLC_HEADER

    /*====================================================================*
     *   system header files;
     *--------------------------------------------------------------------*/

    #include <stdint.h>

    /*====================================================================*
     *   custom header files;
     *--------------------------------------------------------------------*/

    #include "../ether/channel.h"
    #include "../key/HPAVKey.h"
    #include "../tools/types.h"
    #include "../plc/chipset.h"
    #include "../mme/mme.h"
    #include "../nvm/nvm.h"
    #include "../pib/pib.h"

    /*====================================================================*
     *   constants; these codes are returned in the DEVICEID field of the
     *   firmware VS_SW_VER message;
     *--------------------------------------------------------------------*/

    #define PLC_MODULE_SOFTLOADER           0x00
    #define PLC_MODULE_FIRMWARE             (1 << 0)
    #define PLC_MODULE_PARAMETERS           (1 << 1)
    #define PLC_MODULE_NVM_PIB              (PLC_MODULE_PARAMETERS | PLC_MODULE_FIRMWARE)
    #define PLC_MODULE_OPERATION            (1 << 3)
    #define PLC_MODULE_UPGRADE              (PLC_MODULE_OPERATION | PLC_MODULE_PARAMETERS | PLC_MODULE_FIRMWARE)
    #define PLC_MODULE_FORCE_FLASH          (1 << 4)
    #define PLC_MODULE_DO_NOT_REBOOT        (1 << 5)
    #define PLC_MODULE_ALTERNATE_SECTION    (1 << 6)
    #define PLC_MODULE_FORCE_SECTION        (1 << 7)

    /*====================================================================*
     *   constants;
     *--------------------------------------------------------------------*/

    #define PLC_VERSION_STRING 0xFF
    #define PLC_RECORD_SIZE 1024
    #define PLC_MODULE_SIZE 1400
    #define PLC_SLOTS 6

    #define LEGACY_PIBOFFSET 0x01F00000
    #define INT6x00_PIBOFFSET 0x01000000
    #define AR7x00_PIBOFFSET 0x00200000

    #define INT_CARRIERS 1155
    #define AMP_CARRIERS 2880
    #define PLC_CARRIERS 1345
    #define AMP_BITS 9

    /*====================================================================*
     *   device manager flagword bits;
     *--------------------------------------------------------------------*/

    /*
     *   We reuse flagword bits in various programs to avoid proliferating
     *   flagwords; make sure that one program does not use multiple names
     *   ro refer to the same bit;
     */

    #define PLC_BAILOUT           (1 << 0)
    #define PLC_SILENCE           (1 << 1)
    #define PLC_VERBOSE           (1 << 2)
    #define PLC_ANALYSE           (1 << 3)
    #define PLC_ERASE_DEVICE      PLC_ANALYSE /* ampinit, plcinit */
    #define PLC_NEWLINE           PLC_ANALYSE /* ampID, plcID */
    #define PLC_WAITFORRESET      (1 << 4)
    #define PLC_WAITFORSTART      (1 << 5)
    #define PLC_WAITFORASSOC      (1 << 6)
    #define PLC_REMOTEHOSTS       PLC_WAITFORASSOC
    #define PLC_RESET_DEVICE      (1 << 7)
    #define PLC_RANDOM_ADDR       PLC_RESET_DEVICE
    #define PLC_TIM_GARGRAVE      PLC_RESET_DEVICE
    #define PLC_BRIDGE_LIST       PLC_RESET_DEVICE /* plclist, amplist */
    #define PLC_FACTORY_DEFAULTS  (1 << 8)
    #define PLC_FOREVER           PLC_FACTORY_DEFAULTS /* plctest */
    #define PLC_GRAPH             PLC_FACTORY_DEFAULTS /* plctone */
    #define PLC_DAEMON            PLC_FACTORY_DEFAULTS /* plchost */
    #define PLC_REMOTE_LIST       PLC_FACTORY_DEFAULTS /* plclist, amplist */
    #define PLC_BINARY            PLC_FACTORY_DEFAULTS /* ampsnif */
    #define PLC_FORCE_FLASH       PLC_FACTORY_DEFAULTS /* plchost */
    #define PLC_NETWORK           (1 << 9)
    #define PLC_OPEN_SESSION      PLC_NETWORK /* plcmod */
    #define PLC_MONITOR           PLC_NETWORK /* ampsnif */
    #define PLC_XML_FORMAT        PLC_NETWORK /* int6klog */
    #define PLC_VERSION           (1 << 10)
    #define PLC_WRITE_MODULE      PLC_VERSION /* plcmod */
    #define PLC_MANUFACTURER      (1 << 11)
    #define PLC_READ_MODULE       PLC_MANUFACTURER /* plcmod */
    #define PLC_READ_MAC          (1 << 12)
    #define PLC_DUMP_MODULE       PLC_READ_MAC /* int6mod */
    #define PLC_LOCAL_TRAFFIC     PLC_READ_MAC /* int6krate, amprate, plcrate */
    #define PLC_READ_PIB          (1 << 13)
    #define PLC_NETWORK_TRAFFIC   PLC_READ_PIB /* plcrate */
    #define PLC_READ_IDENTITY     (1 << 14)
    #define PLC_UNCODED_RATES     PLC_READ_IDENTITY /* plcrate */
    #define PLC_WRITE_MAC         (1 << 15)
    #define PLC_LINK_STATS        PLC_WRITE_MAC /* plcstat */
    #define PLC_WRITE_PIB         (1 << 16)
    #define PLC_TONE_MAP          PLC_WRITE_PIB /* plcstat */
    #define PLC_FLASH_DEVICE      (1 << 17)
    #define PLC_COMMIT_MODULE     PLC_FLASH_DEVICE /* plcmod */
    #define PLC_QUICK_FLASH       (1 << 18)
    #define PLC_SETLOCALKEY       (1 << 19)
    #define PLC_RXONLY            PLC_SETLOCALKEY
    #define PLC_SETREMOTEKEY      (1 << 20)
    #define PLC_TXONLY            PLC_SETREMOTEKEY
    #define PLC_SDRAM_INFO        (1 << 21)
    #define PLC_SDRAM_CONFIG      (1 << 22)
    #define PLC_CONFIGURE         PLC_SDRAM_CONFIG /* plcotst */
    #define PLC_NVRAM_INFO        (1 << 23)
    #define PLC_ATTRIBUTES        (1 << 24)
    #define PLC_PUSH_BUTTON       (1 << 25)
    #define PLC_READ_CFG          (1 << 26)
    #define PLC_ERASE_SECTOR      PLC_READ_CFG
    #define PLC_RD_MOD_WR_PIB     (1 << 27)
    #define PLC_SNIFFER           PLC_RD_MOD_WR_PIB /* ampsnif */
    #define PLC_READ_ALL          PLC_RD_MOD_WR_PIB /* ampinit */
    #define PLC_WATCHDOG_REPORT   (1 << 28)
    #define PLC_RESULTS           PLC_WATCHDOG_REPORT /* plcotst */
    #define PLC_HOST_ACTION       (1 << 29)
    #define PLC_LINK_STATUS       PLC_HOST_ACTION
    #define PLC_MULTICAST_INFO    (1 << 30)
    #define PLC_RX_TONEMAPS       PLC_HOST_ACTION /* plcstat */

    /*====================================================================*
     *   message format strings;
     *--------------------------------------------------------------------*/

    #define PLC_BADVALUE "Invalid or suspect data"
    #define PLC_WONTDOIT "Device refused request"
    #define PLC_NODEVICE "Need a device. Try 'local' or '00:B0:52:00:00:01'."
    #define PLC_BADFRAME "Unexpected response"
    #define PLC_NODETECT "Device must be connected"
    #define PLC_NOMEMORY "Not enough memory"
    #define PLC_NOTREADY "Function not implemented"

    #define PLC_ERR_OFFSET "Data offset error"
    #define PLC_ERR_LENGTH "Data length error"

    #define PLC_BAD_MAC "Have '%s' instead of MAC address"
    #define PLC_BAD_DAK "Have '%s' instead of DAK"
    #define PLC_BAD_NMK "Have '%s' instead of NMK"

    #define PLC_EXIT(plc) ((signed) (plc->flags & PLC_BAILOUT))

    /*====================================================================*
     *    program constants;
     *--------------------------------------------------------------------*/

    #define PLCDEVICE "PLC"

    #define HARDWAREID 0
    #define SOFTWAREID 0
    #define PLCSESSION 0x78563412
    #define HOSTACTION 0
    #define SECTORCODE 0
    #define PUSHBUTTON 1
    #define MODULECODE (VS_MODULE_MAC | VS_MODULE_PIB)
    #define READACTION 0
    #define FLASH_SIZE 0x200000
    #define PLCOUPLING 0

    #define PLC_STATE 0
    #define PLC_TIMER 60
    #define PLC_SLEEP 0
    #define PLC_COUNT 1
    #define PLC_INDEX 0
    #define PLC_FLAGS 0

    #define PLC_MEMTYPE_AUTO 1
    #define PLC_MEMTYPE_ITCM 2
    #define PLC_MEMTYPE_DTCM 3
    #define PLC_MEMTYPE_SRAM 4
    #define PLC_MEMTYPE_SDRAM 5

    #define PLC_ECHOTIME 3
    #define PLC_LONGTIME (unsigned)(~0)

    /*====================================================================*
     *   common mac address names;
     *--------------------------------------------------------------------*/

    #define PLCDEVICES 3

    extern struct _term_ const devices [PLCDEVICES];

    /*====================================================================*
     *
     *   the plc structure holds everything needed to perform powerline
     *   device management operations including a channel structure for
     *   Ethernet interface management and a message structure for data
     *   buffer management;
     *
     *   the channel structure holds information needed to open, read,
     *   write and close a raw socket; it differs in detail depending
     *   on constants WINPCAP and LIBPCAP;
     *
     *   character array address[] holds a decoded ethernet address for
     *   display purposes because humans cannot read;
     *
     *   byte array LMA[] holds the Qualcomm Local Broadcast Address
     *   because it is used in so many places;
     *
     *   byte arrays NMK[] and DAK[] hold encryption keys used by some
     *   operations;
     *
     *   the socket _file_ structure holds the descriptor and interface
     *   name of the host NIC where the name is eth0, eth1, ... or ethn;
     *
     *   the three _file_ structures, CFG, NVM, and PIB hold descriptors
     *   and filenames for files written to the device;
     *
     *   the three _file_ structures cfg, nvm and pib hold
     *   descriptors and filenames of files read from the device;
     *
     *   integers retry and timer are used by program plcwait;
     *
     *   integers index, count and pause control command line looping
     *   and waiting;
     *
     *   flag_t flags contains bits that define program operations and
     *   control utility program flow;
     *
     *--------------------------------------------------------------------*/

    typedef struct plc

    {
    	struct channel * channel;
    	struct message * message;
    	void * content;
    	ssize_t packetsize;
    	uint8_t MAC [ETHER_ADDR_LEN];
    	uint8_t RDA [ETHER_ADDR_LEN];
    	uint8_t NMK [HPAVKEY_NMK_LEN];
    	uint8_t DAK [HPAVKEY_DAK_LEN];
    	struct _file_ CFG;
    	struct _file_ cfg;
    	struct _file_ SFT;
    	struct _file_ sft;
    	struct _file_ NVM;
    	struct _file_ nvm;
    	struct _file_ PIB;
    	struct _file_ pib;
    	struct _file_ XML;
    	struct _file_ rpt;
    	struct _file_ socket;
    	uint32_t hardwareID;
    	uint32_t softwareID;
    	uint32_t cookie;
    	uint8_t action;
    	uint8_t sector;
    	uint8_t module;
    	uint8_t pushbutton;
    	uint8_t readaction;
    	uint8_t coupling;
    	unsigned flash_size;
    	unsigned state;
    	unsigned timer;
    	unsigned sleep;
    	unsigned count;
    	unsigned index;
    	flag_t flags;
    	flag_t flag2;
    }

    PLC;

    /*====================================================================*
     *  fixer-upper functions that compensate for errors and omissions;
     *--------------------------------------------------------------------*/

    void chipset (void const * memory);
    char const * chipsetname (uint8_t chipset);

    /*====================================================================*
     *   functions;
     *--------------------------------------------------------------------*/

    signed Attributes (struct plc *);
    signed Attributes1 (struct plc *);
    signed Attributes2 (struct plc *);
    signed BootDevice (struct plc *);
    signed BootDevice1 (struct plc *);
    signed BootDevice2 (struct plc *);
    signed BootDeviceFirmware (struct plc *);
    signed BootDeviceParameters (struct plc *);
    signed BootFirmware1 (struct plc *);
    signed BootFirmware2 (struct plc *);
    signed BootParameters1 (struct plc *);
    signed BootParameters2 (struct plc *);
    signed ChangeIdent (struct plc *);
    signed CrossTraffic (struct plc *);
    signed CrossTrafficOne (struct plc *);
    signed CrossTrafficTwo (struct plc *);
    signed DeviceIdent (struct plc *);
    signed EmulateHost (struct plc *);
    signed EmulateHost64 (struct plc *);
    signed EraseFlashSector (struct plc *);
    signed ExecuteApplets (struct plc *);
    signed ExecuteApplets1 (struct plc *);
    signed ExecuteApplets2 (struct plc *);
    signed FactoryDefaults (struct plc *);
    signed FactoryReset (struct plc *);
    signed FlashNVM (struct plc *);
    signed FlashPTS (struct plc *);
    signed FlashDevice (struct plc *);
    signed FlashDevice0 (struct plc *);
    signed FlashDevice1 (struct plc *);
    signed FlashDevice2 (struct plc *, uint32_t options);
    signed FlashFirmware (struct plc *, uint32_t options);
    signed FlashParameters (struct plc *, uint32_t options);
    signed FlashUpgrade (struct plc *, uint32_t options);
    signed FlashNVM (struct plc *);
    signed FlashSoftloader (struct plc *, uint32_t options);
    signed HostActionResponse (struct plc *);
    signed Identity (struct plc *);
    signed Identity1 (struct plc *);
    signed Identity2 (struct plc *);
    signed InitDevice (struct plc *);
    signed InitDevice1 (struct plc *);
    signed InitDevice2 (struct plc *);
    signed LinkStatistics (struct plc *);
    signed LinkStatus (struct plc *);
    signed ListLocalDevices (struct plc * plc, char const * space, char const * comma);
    signed LocalTrafficSend (struct plc * plc);
    signed Antiphon (struct plc * plc, uint8_t osa [], uint8_t oda []);
    signed MDUTrafficStats (struct plc *, uint8_t command, uint8_t session, uint8_t slave);
    signed MfgString (struct plc *);
    signed MulticastInfo1 (struct plc *);
    signed MulticastInfo2 (struct plc *);
    signed NVMSelect (struct plc *, signed (struct plc *), signed (struct plc *));
    signed NVRAMInfo (struct plc *);
    signed NetInfo (struct plc *);
    signed NetInfo1 (struct plc *);
    signed NetInfo2 (struct plc *);
    signed NetworkDevices (struct plc *, void * memory, size_t extent);
    signed NetworkDevices1 (struct plc *, void * memory, size_t extent);
    signed NetworkDevices2 (struct plc *, void * memory, size_t extent);
    signed NetworkInfoStats (struct plc *);
    signed NetworkInformation (struct plc *);
    signed NetworkInformation1 (struct plc *);
    signed NetworkInformation2 (struct plc *);
    signed NetworkProbe (struct plc *);
    signed NetworkTraffic (struct plc *);
    signed NetworkTraffic1 (struct plc *);
    signed NetworkTraffic2 (struct plc *);
    signed PLCSelect (struct plc *, signed method1 (struct plc *), signed method2 (struct plc *));
    signed PhyRates (struct plc *);
    signed PhyRates1 (struct plc *);
    signed PhyRates2 (struct plc *);
    signed RxRates2 (struct plc *);
    signed TxRates2 (struct plc *);
    signed PushButton (struct plc *);
    signed ReadFMI (struct plc *, uint8_t MMV, uint16_t MMTYPE);
    signed ReadMFG (struct plc *, uint8_t MMV, uint16_t MMTYPE);
    signed ReadMME (struct plc *, uint8_t MMV, uint16_t MMTYPE);
    signed ReadFirmware (struct plc *);
    signed ReadFirmware1 (struct plc *);
    signed ReadFirmware2 (struct plc *);
    signed ReadParameterBlock (struct plc *, void * memory, size_t extent);
    signed ReadParameters (struct plc *);
    signed ReadParameters1 (struct plc *);
    signed ReadParameters2 (struct plc *);
    signed ListRemoteDevices (struct plc *, char const * space, char const * comma);
    signed ListRemoteDevices1 (struct plc *, char const * space, char const * comma);
    signed ListRemoteDevices2 (struct plc *, char const * space, char const * comma);
    signed RemoteHosts (struct plc *);
    signed Reset (struct plc *);
    signed ResetAndWait (struct plc *);
    signed ResetDevice (struct plc *);
    signed SDRAMInfo (struct plc *);
    signed SendMME (struct plc *);
    signed SetNMK (struct plc *);
    signed SignalToNoise1 (struct plc *);
    signed SignalToNoise2 (struct plc *);
    signed SlaveMembership (struct plc *);
    signed StartDevice (struct plc *);
    signed StartDevice1 (struct plc *);
    signed StartDevice2 (struct plc *);
    signed StartFirmware (struct plc *, unsigned module, void const * header);
    signed StartFirmware1 (struct plc *, unsigned module, const struct nvm_header1 *);
    signed StartFirmware2 (struct plc *, unsigned module, const struct nvm_header2 *);
    signed ToneMaps1 (struct plc *);
    signed ToneMaps2 (struct plc *);
    signed Topology (struct plc *);
    signed Topology1 (struct plc *);
    signed Topology2 (struct plc *);
    signed Traffic (struct plc *);
    signed Traffic1 (struct plc *);
    signed Traffic2 (struct plc *);
    signed Traffic3 (struct plc *);
    signed Transmit (struct plc *, uint8_t osa [], uint8_t oda []);
    signed UpgradeDevice1 (struct plc *);
    signed MDUTrafficStats (struct plc *, uint8_t command, uint8_t session, uint8_t slave);
    signed VersionInfo (struct plc *);
    signed VersionInfo1 (struct plc *);
    signed VersionInfo2 (struct plc *);
    signed WaitForAssoc (struct plc *);
    signed WaitForAssoc1 (struct plc *);
    signed WaitForAssoc2 (struct plc *);
    signed WaitForBootLoader (struct plc *);
    signed WaitForReset (struct plc *, char buffer [], size_t length);
    signed WaitForStart (struct plc *, char buffer [], size_t length);
    signed WaitForRestart (struct plc *);
    signed WatchdogReport (struct plc *);
    signed WriteCFG (struct plc *);
    signed WriteExecuteApplet2 (struct plc *, unsigned module, const struct nvm_header2 *);
    signed WriteExecuteFirmware (struct plc *, unsigned module, void const * nvm_header);
    signed WriteExecuteFirmware1 (struct plc *, unsigned module, const struct nvm_header1 *);
    signed WriteExecuteFirmware2 (struct plc *, unsigned module, const struct nvm_header2 *);
    signed WriteExecuteParameters (struct plc *, unsigned module, void const * nvm_header);
    signed WriteExecuteParameters1 (struct plc *, unsigned module, const struct nvm_header1 *);
    signed WriteExecuteParameters2 (struct plc *, unsigned module, const struct nvm_header2 *);
    signed WriteExecutePIB (struct plc *, unsigned offset, struct pib_header *);
    signed WriteFirmware (struct plc *, unsigned module, void const * nvm_header);
    signed WriteFirmware1 (struct plc *, unsigned module, const struct nvm_header1 *);
    signed WriteFirmware2 (struct plc *, unsigned module, const struct nvm_header2 *);
    signed WriteMEM (struct plc *, struct _file_ *, unsigned module, uint32_t offset, uint32_t extent);
    signed WriteMOD (struct plc *, uint8_t module, void const * memory, size_t extent);
    signed WriteNVM (struct plc *);
    signed WritePIB (struct plc *);
    signed WriteParameters (struct plc *, unsigned module, void const * nvm_header);
    signed WriteParameters1 (struct plc *, unsigned module, const struct nvm_header1 *);
    signed WriteParameters2 (struct plc *, unsigned module, const struct nvm_header2 *);

    /*====================================================================*
     *
     *--------------------------------------------------------------------*/

    #define PLC_FORMAT_HEX 0
    #define PLC_FORMAT_DEC 1
    #define PLC_FORMAT_BIN 2
    #define PLC_FORMAT_ASC 3

    #ifndef __GNUC__
    #pragma pack (push,1)
    #endif

    struct __packed plcproperty

    {
    	uint8_t PROP_OPTION;
    	uint8_t PROP_FORMAT;
    	uint32_t PROP_NUMBER;
    	uint32_t PROP_VERSION;
    	uint32_t PROP_LENGTH;
    	uint8_t PROP_BUFFER [128];
    	uint8_t DATA_FORMAT;
    	uint32_t DATA_LENGTH;
    	uint8_t DATA_BUFFER [128];
    }

    plcproperty;

    #ifndef __GNUC__
    #pragma pack (pop)
    #endif

    /*====================================================================*
     *
     *--------------------------------------------------------------------*/

    signed GetProperty (struct plc *, struct plcproperty *);
    signed SetProperty (struct plc *, struct plcproperty *);

    /*====================================================================*
     *
     *--------------------------------------------------------------------*/

    typedef struct __packed plcstation

    {
    	uint8_t LOC;
    	uint8_t CCO;
    	uint8_t TEI;
    	uint8_t MAC [ETHER_ADDR_LEN];
    	uint8_t BDA [ETHER_ADDR_LEN];
    	uint16_t TX;
    	uint16_t RX;
    	char hardware [0x10];
    	char firmware [0x80];
    	char identity [0x40];
    }

    plcstation;
    typedef struct __packed plcnetwork

    {
    	signed ifname;
    	signed plcstations;
    	struct plcstation plcstation [1];
    }

    plcnetwork;
    typedef struct __packed plctopology

    {
    	signed plcnetworks;
    	struct plcnetwork plcnetwork [1];
    }

    pcltopology;

    /*====================================================================*
     *   functions that use struct channel and struct message directly
     *   instead of struct plc;
     *--------------------------------------------------------------------*/

    signed FlashMOD (struct channel *, uint8_t module);
    signed WriteModule (struct channel *, struct message *, void const * memory, size_t extent);
    signed WriteMemory (struct channel *, struct message *, struct _file_ *, uint32_t offset, uint32_t extent);
    unsigned LocalDevices (struct channel const *, struct message *, void * memory, size_t extent);
    signed Platform (struct channel *, const byte device []);
    signed PLCReadParameterBlock (struct channel *, struct message *, void * memory, size_t extent);
    signed PLCReadFirmwareImage (struct channel *, struct message *, void * memory, size_t extent);
    signed PLCTopology (struct channel *, struct message *, struct plctopology *);
    signed PLCTopologyPrint (struct plctopology *);

    /*====================================================================*
     *   vs_module_spec message;
     *--------------------------------------------------------------------*/

    #define PLC_MODULE_EXECUTE   (1 << 0)
    #define PLC_MODULE_ABSOLUTE (1 << 1)
    #define PLC_MODULE_RELATIVE (0 << 1)

    #define PLC_MODULE_READ_TIMEOUT 5000
    #define PLC_MODULE_REQUEST_TIMEOUT 60000
    #define PLC_MODULE_WRITE_TIMEOUT 90000

    #define PLC_MOD_OP_READ_MEMORY 0x00
    #define PLC_MOD_OP_READ_FLASH  0x01
    #define PLC_MOD_OP_START_SESSION  0x10
    #define PLC_MOD_OP_WRITE_MODULE   0x11
    #define PLC_MOD_OP_CLOSE_SESSION  0x12

    #define PLC_MODULEID 0x0000
    #define PLC_SUBMODULEID 0x0000

    #define PLC_MODULEID_MDIO_INIT  0x1000
    #define PLC_MODULEID_UART_ASYNC 0x2000
    #define PLC_MODULEID_ADDR_ENUM  0x3000
    #define PLC_MODULEID_POWER_MGT  0x4000
    #define PLC_MODULEID_TR069      0x4001
    #define PLC_MODULEID_FORWARDCFG 0x7000
    #define PLC_MODULEID_FIRMWARE   0x7001
    #define PLC_MODULEID_PARAMETERS 0x7002
    #define PLC_MODULEID_SOFTLOADER 0x7003
    #define PLC_MODULEID_RESERVED1  0x7004
    #define PLC_MODULEID_PIBMERGE   0x7005
    #define PLC_MODULEID_RESERVED2  0x7006

    typedef struct __packed vs_module_spec

    {
    	uint16_t MODULE_ID;
    	uint16_t MODULE_SUB_ID;
    	uint32_t MODULE_LENGTH;
    	uint32_t MODULE_CHKSUM;
    }

    vs_module_spec;

    #define PLC_COMMIT_FORCE   (1 << 0)
    #define PLC_COMMIT_NORESET (1 << 1)
    #define PLC_COMMIT_FACTPIB (1 << 31)

    /*====================================================================*
     *   functions;
     *--------------------------------------------------------------------*/

    signed ModuleSpec (struct _file_ *, struct vs_module_spec *);
    signed ModuleSession (struct plc *, unsigned modules, vs_module_spec *);
    signed ModuleWrite (struct plc *, struct _file_ *, unsigned module, vs_module_spec *);
    signed ModuleRead (struct plc *, struct _file_ *, uint16_t source, uint16_t module, uint16_t submodule);
    signed ModuleDump (struct plc *, uint16_t source, uint16_t module, uint16_t submodule);
    signed ModuleCommit (struct plc *, uint32_t flags);

    /*====================================================================*
     *   functions;
     *--------------------------------------------------------------------*/

    #ifdef __GNUC__

    __attribute__ ((format (printf, 2, 3)))

    #endif

    void Request (struct plc *, char const * format, ...);

    #ifdef __GNUC__

    __attribute__ ((format (printf, 2, 3)))

    #endif

    void Confirm (struct plc *, char const * format, ...);

    #ifdef __GNUC__

    __attribute__ ((format (printf, 2, 3)))

    #endif

    void Display (struct plc *, char const * format, ...);

    #ifdef __GNUC__

    __attribute__ ((format (printf, 2, 3)))

    #endif

    void Failure (struct plc *, char const * format, ...);

    /*====================================================================*
     *
     *--------------------------------------------------------------------*/

    #endif

[PREV] [HOME] [NEXT]