signed VersionInfo1 (struct plc * plc) { struct channel * channel = (struct channel *)(plc->channel); struct message * message = (struct message *)(plc->message); #ifndef __GNUC__ #pragma pack (push,1) #endif struct __packed vs_sw_ver_request { struct ethernet_std ethernet; struct qualcomm_std qualcomm; } * request = (struct vs_sw_ver_request *) (message); struct __packed vs_sw_ver_confirm { struct ethernet_std ethernet; struct qualcomm_std qualcomm; uint8_t MSTATUS; uint8_t MDEVICEID; uint8_t MVERLENGTH; char MVERSION [PLC_VERSION_STRING]; } * confirm = (struct vs_sw_ver_confirm *) (message); #ifndef __GNUC__ #pragma pack (pop) #endif Request (plc, "Request Version Information"); memset (message, 0, sizeof (* message)); EthernetHeader (&request->ethernet, channel->peer, channel->host, channel->type); QualcommHeader (&request->qualcomm, 0, (VS_SW_VER | MMTYPE_REQ)); plc->packetsize = (ETHER_MIN_LEN - ETHER_CRC_LEN); if (SendMME (plc) <= 0) { error ((plc->flags & PLC_BAILOUT), errno, CHANNEL_CANTSEND); return (-1); } while (ReadMME (plc, 0, (VS_SW_VER | MMTYPE_CNF)) > 0) { if (confirm->MSTATUS) { Failure (plc, PLC_WONTDOIT); continue; } chipset (confirm); Display (plc, "%s %s", chipsetname (confirm->MDEVICEID), confirm->MVERSION); } return (0); }
signed Platform (struct channel * channel, const uint8_t device []) { struct message message; ssize_t packetsize; #ifndef __GNUC__ #pragma pack (push,1) #endif struct __packed vs_sw_ver_request { struct ethernet_std ethernet; struct qualcomm_std qualcomm; } * request = (struct vs_sw_ver_request *) (&message); struct __packed vs_sw_ver_confirm { struct ethernet_std ethernet; struct qualcomm_std qualcomm; uint8_t MSTATUS; uint8_t MDEVICEID; uint8_t MVERLENGTH; char MVERSION [PLC_VERSION_STRING]; } * confirm = (struct vs_sw_ver_confirm *) (&message); #ifndef __GNUC__ #pragma pack (pop) #endif memset (&message, 0, sizeof (message)); EthernetHeader (&request->ethernet, device, channel->host, channel->type); QualcommHeader (&request->qualcomm, 0, (VS_SW_VER | MMTYPE_REQ)); if (sendpacket (channel, &message, (ETHER_MIN_LEN - ETHER_CRC_LEN)) > 0) { while ((packetsize = readpacket (channel, &message, sizeof (message))) > 0) { if (!UnwantedMessage (&message, packetsize, 0, (VS_SW_VER | MMTYPE_CNF))) { chipset (confirm); printf (" %s", chipsetname (confirm->MDEVICEID)); printf (" %s", confirm->MVERSION); return (0); } } } return (-1); }
int main (int argc, const char * argv []) { extern struct channel channel; static const char *optv [] = { "C:i:eFN:p:P:qt:vx", "-C file -P file -N file", "Atheros Powerline Device Flash Utility for INT6300", "C f\twrite CFG file to device using VS_SET_SDRAM", "e\tredirect stderr messages to stdout", #if defined (WINPCAP) || defined (LIBPCAP) "i n\thost interface number [2]", #else "i s\thost interface name [" CHANNEL_ETHDEVICE "]", #endif "F[F]\tflash [force] NVRAM after firmware start using VS_MOD_NVM", "N f\twrite NVM file to device using VS_WR_MEM", "P f\twrite PIB file to device using VS_WR_MEM", "q\tquiet mode", #if defined (WINPCAP) || defined (LIBPCAP) "t n\tread capture time is (n) milliseconds [50]", #else "t n\tread timeout is (n) milliseconds [50]", #endif "v\tverbose mode", "x\texit on error", (const char *) (0) }; #include "../plc/plc.c" char firmware [PLC_VERSION_STRING]; signed c; if (getenv (PLCDEVICE)) { #if defined (WINPCAP) || defined (LIBPCAP) channel.ifindex = atoi (getenv (PLCDEVICE)); #else channel.ifname = strdup (getenv (PLCDEVICE)); #endif } optind = 1; opterr = 1; while ((c = getoptv (argc, argv, optv)) != -1) { switch ((char) (c)) { case 'i': #if defined (WINPCAP) || defined (LIBPCAP) channel.ifindex = atoi (optarg); #else channel.ifname = optarg; #endif break; case 'q': _setbits (channel.flags, CHANNEL_SILENCE); break; case 't': channel.timeout = (unsigned)(uintspec (optarg, 0, UINT_MAX)); break; case 'v': _setbits (channel.flags, CHANNEL_VERBOSE); break; } } openchannel (&channel); desuid (); optind = 1; opterr = 1; while ((c = getoptv (argc, argv, optv)) != -1) { switch ((char) (c)) { case 'C': if (!checkfilename (optarg)) { error (1, EINVAL, "%s", optarg); } if ((plc.CFG.file = open (optarg, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", optarg); } if (sdramfile (plc.CFG.file, optarg, plc.flags)) { error (1, ECANCELED, "CFG file %s is corrupt", optarg); } _setbits (plc.flags, PLC_SDRAM_CONFIG); plc.CFG.name = optarg; break; case 'e': dup2 (STDOUT_FILENO, STDERR_FILENO); break; case 'F': _setbits (plc.module, PLC_MODULE_NVM_PIB); if (_anyset (plc.flags, PLC_FLASH_DEVICE)) { _setbits (plc.module, VS_MODULE_FORCE); } _setbits (plc.flags, PLC_FLASH_DEVICE); break; case 'N': if (!checkfilename (optarg)) { error (1, EINVAL, "%s", optarg); } if ((plc.NVM.file = open (optarg, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", optarg); } plc.NVM.name = optarg; if (nvmfile1 (&plc.NVM)) { error (1, errno, "Bad firmware file: %s", plc.NVM.name); } _setbits (plc.flags, PLC_WRITE_MAC); break; case 'P': if (!checkfilename (optarg)) { error (1, EINVAL, "%s", optarg); } if ((plc.PIB.file = open (optarg, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", optarg); } plc.PIB.name = optarg; if (pibfile1 (&plc.PIB)) { error (1, errno, "Bad parameter file: %s", plc.PIB.name); } _setbits (plc.flags, PLC_WRITE_PIB); break; case 'q': _setbits (plc.flags, PLC_SILENCE); break; case 'v': _setbits (plc.flags, PLC_VERBOSE); break; case 'x': _setbits (plc.flags, PLC_BAILOUT); break; default: break; } } argc -= optind; argv += optind; if (argc) { error (1, ECANCELED, "Too many arguments"); } if (plc.CFG.file == -1) { error (1, ECANCELED, "No CFG file specified"); } if (plc.PIB.file == -1) { error (1, ECANCELED, "No PIB file specified"); } if (plc.NVM.file == -1) { error (1, ECANCELED, "No NVM file specified"); } if (!(plc.message = malloc (sizeof (struct message)))) { error (1, errno, PLC_NOMEMORY); } if (WaitForStart (&plc, firmware, sizeof (firmware))) { Failure (&plc, "Device must be connected"); return (-1); } if (plc.hardwareID > CHIPSET_INT6300) { Failure (&plc, "Device must be %s or earlier; try using int6kboot.", chipsetname (CHIPSET_INT6300)); return (-1); } if (strcmp (firmware, "BootLoader")) { Failure (&plc, "Bootloader must be running"); return (-1); } if (!StartDevice1 (&plc)) { if (_anyset (plc.flags, PLC_FLASH_DEVICE)) { UpgradeDevice1 (&plc); } } free (plc.message); closechannel (&channel); exit (0); }
int main (int argc, char const * argv []) { extern struct channel channel; static char const * optv [] = { "eFi:N:p:P:qS:t:vx", "-N file -P file [device] [device] [...]", "Qualcomm Atheros Panther/Lynx Powerline Device Bootstrapper", "e\tredirect stderr to stdout", "F[F]\tFlash [Force] non-volatile memory after boot", #if defined (WINPCAP) || defined (LIBPCAP) "i n\thost interface is (n) [" OPTSTR (CHANNEL_ETHNUMBER) "]", #else "i s\thost interface is (s) [" OPTSTR (CHANNEL_ETHDEVICE) "]", #endif "N f\tfirmware file is (f)", "P f\tparameter file is (f)", "q\tquiet mode", "S f\tsoftloader file is (f)", "t n\tread timeout is (n) milliseconds [" OPTSTR (CHANNEL_TIMEOUT) "]", "v\tverbose mode", "x\texit on error", (char const *) (0) }; #include "../plc/plc.c" char firmware [PLC_VERSION_STRING]; signed c; if (getenv (PLCDEVICE)) { #if defined (WINPCAP) || defined (LIBPCAP) channel.ifindex = atoi (getenv (PLCDEVICE)); #else channel.ifname = strdup (getenv (PLCDEVICE)); #endif } optind = 1; while ((c = getoptv (argc, argv, optv)) != -1) { switch (c) { case 'e': dup2 (STDOUT_FILENO, STDERR_FILENO); break; case 'F': _setbits (plc.module, (VS_MODULE_MAC | VS_MODULE_PIB)); if (_anyset (plc.flags, PLC_FLASH_DEVICE)) { _setbits (plc.module, VS_MODULE_FORCE); } _setbits (plc.flags, PLC_FLASH_DEVICE); break; case 'i': #if defined (WINPCAP) || defined (LIBPCAP) channel.ifindex = atoi (optarg); #else channel.ifname = optarg; #endif break; case 'N': if (!checkfilename (optarg)) { error (1, EINVAL, "%s", optarg); } if ((plc.NVM.file = open (plc.NVM.name = optarg, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc.NVM.name); } if (nvmfile2 (&plc.NVM)) { error (1, errno, "Bad NVM file: %s", plc.NVM.name); } _setbits (plc.flags, PLC_WRITE_MAC); break; case 'P': if (!checkfilename (optarg)) { error (1, EINVAL, "%s", optarg); } if ((plc.PIB.file = open (plc.PIB.name = optarg, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc.PIB.name); } if (pibfile2 (&plc.PIB)) { error (1, errno, "Bad PIB file: %s", plc.PIB.name); } _setbits (plc.flags, PLC_WRITE_PIB); break; case 'q': _setbits (channel.flags, CHANNEL_SILENCE); _setbits (plc.flags, PLC_SILENCE); break; case 'S': if (!checkfilename (optarg)) { error (1, EINVAL, "%s", optarg); } if ((plc.CFG.file = open (plc.CFG.name = optarg, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc.CFG.name); } if (nvmfile2 (&plc.CFG)) { error (1, errno, "Bad NVM file: %s", plc.CFG.name); } break; case 't': channel.timeout = (signed)(uintspec (optarg, 0, UINT_MAX)); break; case 'v': _setbits (channel.flags, CHANNEL_VERBOSE); _setbits (plc.flags, PLC_VERBOSE); break; case 'x': _setbits (plc.flags, PLC_BAILOUT); break; default: break; } } argc -= optind; argv += optind; if (argc) { error (1, ENOTSUP, ERROR_TOOMANY); } openchannel (&channel); if (!(plc.message = malloc (sizeof (* plc.message)))) { error (1, errno, PLC_NOMEMORY); } if (WaitForStart (&plc, firmware, sizeof (firmware))) { Failure (&plc, PLC_NODETECT); exit (1); } if (plc.hardwareID < CHIPSET_INT6400) { Failure (&plc, "Device must be %s or later; Use program int6kboot instead.", chipsetname (CHIPSET_INT6400)); exit (1); } if (strcmp (firmware, "BootLoader")) { Failure (&plc, "Bootloader must be running"); exit (1); } if (plc.PIB.file == -1) { error (1, ECANCELED, "No Parameter file named"); } if (plc.NVM.file == -1) { error (1, ECANCELED, "No Firmware file named"); } if (plc.CFG.file == -1) { if (_anyset (plc.flags, PLC_FLASH_DEVICE)) { error (1, ECANCELED, "No Softloader file named"); } } if (!InitDevice2 (&plc)) { if (!BootDevice2 (&plc)) { if (_anyset (plc.flags, PLC_FLASH_DEVICE)) { FlashDevice2 (&plc); } } } free (plc.message); closechannel (&channel); exit (0); }
signed VersionInfo2 (struct plc * plc) { struct channel * channel = (struct channel *)(plc->channel); struct message * message = (struct message *)(plc->message); #ifndef __GNUC__ #pragma pack (push,1) #endif struct __packed vs_sw_ver_request { struct ethernet_hdr ethernet; struct qualcomm_hdr qualcomm; uint32_t COOKIE; } * request = (struct vs_sw_ver_request *) (message); struct __packed vs_sw_ver_confirm { struct ethernet_hdr ethernet; struct qualcomm_hdr qualcomm; uint8_t MSTATUS; uint8_t MDEVICE_CLASS; uint8_t MVERLENGTH; char MVERSION [254]; uint32_t IDENT; uint32_t STEPPING_NUM; uint32_t COOKIE; uint32_t RSVD [6]; } * confirm = (struct vs_sw_ver_confirm *) (message); #ifndef __GNUC__ #pragma pack (pop) #endif Request (plc, "Request Version Information"); memset (message, 0, sizeof (* message)); EthernetHeader (&request->ethernet, channel->peer, channel->host, channel->type); QualcommHeader (&request->qualcomm, 0, (VS_SW_VER | MMTYPE_REQ)); request->COOKIE = HTOLE32 (plc->cookie); plc->packetsize = (ETHER_MIN_LEN - ETHER_CRC_LEN); if (SendMME (plc) <= 0) { error (PLC_EXIT (plc), errno, CHANNEL_CANTSEND); return (-1); } while (ReadMME (plc, 0, (VS_SW_VER | MMTYPE_CNF)) > 0) { #if 0 fprintf (stderr, "DEVICE CLASS (%d)\n", LE32TOH (confirm->MDEVICE_CLASS)); fprintf (stderr, "VERSION LENGTH (%d)\n", LE32TOH (confirm->MVERLENGTH)); fprintf (stderr, "VERSION STRING [%s]\n", LE32TOH (confirm->MVERSION)); fprintf (stderr, "IDENT [0x%08X]\n", LE32TOH (confirm->IDENT)); fprintf (stderr, "STEPPING NUMBER [0x%08X]\n", LE32TOH (confirm->STEPPING_NUM)); fprintf (stderr, "COOKIE [0x%08X]\n", LE32TOH (confirm->COOKIE)); #endif if (confirm->MSTATUS) { Failure (plc, PLC_WONTDOIT); continue; } chipset (confirm); Display (plc, "%s %s", chipsetname (confirm->MDEVICE_CLASS), confirm->MVERSION); } return (0); }