aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/network.c
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/etrax-2.6/image/e100boot/src/sbl/win32/network.c')
-rwxr-xr-xtarget/linux/etrax-2.6/image/e100boot/src/sbl/win32/network.c681
1 files changed, 0 insertions, 681 deletions
diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/network.c b/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/network.c
deleted file mode 100755
index 7ea5576273..0000000000
--- a/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/network.c
+++ /dev/null
@@ -1,681 +0,0 @@
-/*!***************************************************************************
-*!
-*! FILE NAME : network.c
-*!
-*! DESCRIPTION: Network boot stuff for e100boot.
-*!
-*! ---------------------------------------------------------------------------
-*! HISTORY
-*!
-*! DATE NAME CHANGES
-*! ---- ---- -------
-*! 1996 Ronny Raneup Initial version
-*! 2002 05 02 Ronny Ranerup Moved it into this file
-*! ---------------------------------------------------------------------------
-*! (C) Copyright 1999, 2000, 2001, 2002 Axis Communications AB, LUND, SWEDEN
-*!***************************************************************************/
-
-/************************** Include files ********************************/
-
-#include <stdio.h>
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <ctype.h>
-#include <sys/timeb.h>
-#include <winsock2.h>
-
-#include <pcap.h>
-#include <Packet32.h>
-#include <Ntddndis.h>
-
-#include <e100boot.h>
-#include <common.h>
-#include <network.h>
-
-/************************** Constants and macros *************************/
-
-#define CRC_LEN 4
-
-/************************** Type definitions *****************************/
-
-/************************** Global variables *****************************/
-
-udword highest_ack_received;
-udword last_ack_received = -1;
-int new_ack = FALSE;
-int got_new_packet = FALSE;
-
-unsigned char dst_addr_of_device[] = { 0x01, 0x40, 0x8c, 0x00, 0x01, 0x00 };
-unsigned char src_addr_of_device[] = { 0x02, 0x40, 0x8c, 0x00, 0x01, 0x00 };
-unsigned char eth_addr_local[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
-
-struct sockaddr sock_addr;
-int pPacket = 0;
-pcap_t *pd;
-
-pcap_handler handler;
-
-struct packet_buf first_rec_packet;
-struct packet_buf *last_rec_packet = &first_rec_packet;
-
-int promisc = 1; /* promiscuous mode */
-int all_ids = TRUE;
-
-int both_addresses = FALSE;
-int p_packet_bpl = 8;
-int printPacketType = CHAR;
-
-unsigned int id;
-int one_id_only = TRUE;
-
-unsigned char buf[16000]; /* pcap buffer */
-
-const struct pcap_pkthdr *hdrG;
-
-char host1[MAX_STRING_LEN]; /* name of ethernet host */
-char host2[MAX_STRING_LEN]; /* name of ethernet host */
-
-/************************** Function prototypes **************************/
-
-int gettimeofday (struct timeval *tv, void*);
-int timeout (struct timeval *tvThen, int ms);
-int highest_seq_received (void);
-struct packet_buf* ack_on_seq (int seq);
-struct packet_buf* packet_with_seq (int seq);
-struct timeval timeval_subtract (struct timeval *x, struct timeval *y);
-void GetNextPacket (void);
-void PrintPacket (const unsigned char *p, int size, int type);
-
-/****************************************************************************
-*#
-*# FUNCTION NAME: net_init
-*#
-*# DESCRIPTION:
-*#
-*#---------------------------------------------------------------------------
-*# HISTORY
-*#
-*# DATE NAME CHANGES
-*# ---- ---- -------
-*# 2002 05 02 ronny Initial version
-*#
-*#***************************************************************************/
-void
-net_init(void)
-{
- pcap_if_t* alldevs;
- pcap_if_t* d;
- char errbuf[PCAP_ERRBUF_SIZE];
- LPADAPTER pAdapter;
- char pOidDataBuf[sizeof(PACKET_OID_DATA)-1+sizeof(eth_addr_local)];
- PPACKET_OID_DATA pOidData;
-
- if (strlen(device) == 0) {
- /* Retrieve the device list */
- if (pcap_findalldevs(&alldevs, errbuf) == -1) {
- fprintf(stderr,"Error finding devices: %s\n", errbuf);
- exit(EXIT_FAILURE);
- }
-
- if (alldevs == NULL) {
- printf("\nNo network adapters found!\n");
- exit(EXIT_FAILURE);
- }
-
- /* Use first device/interface */
- d = alldevs;
- if (db1) printf("Using device %s (%s)\n", d->name,
- (d->description ? d->description :
- "No description available"));
- strcpy(device, d->name);
- pcap_freealldevs(alldevs);
- }
-
- if ((pd = pcap_open_live(device, 200, promisc, -1, errbuf)) == NULL) {
- printf("Error opening device %s\n", errbuf);
- exit(EXIT_FAILURE);
- }
-
- /* Determine Ethernet address */
- if ((pAdapter = PacketOpenAdapter(device)) == NULL) {
- printf("Error opening packet adapter!\n");
- exit(EXIT_FAILURE);
- }
-
- pOidData = &pOidDataBuf[0];
- pOidData->Oid = OID_802_3_CURRENT_ADDRESS;
- pOidData->Length = sizeof(eth_addr_local);
- if (!PacketRequest(pAdapter, FALSE, pOidData)) {
- printf("Error obtaining adapter Ethernet address!\n");
- exit(EXIT_FAILURE);
- }
-
- PacketCloseAdapter(pAdapter);
- pAdapter = NULL;
-
- memcpy(eth_addr_local, pOidData->Data, sizeof(eth_addr_local));
- if (db1) printf("Ethernet adress for device is %2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x\n",
- eth_addr_local[0],
- eth_addr_local[1],
- eth_addr_local[2],
- eth_addr_local[3],
- eth_addr_local[4],
- eth_addr_local[5]);
-
- handler = (pcap_handler) Handler;
-}
-
-/****************************************************************************
-*#
-*# FUNCTION NAME: NetBoot
-*#
-*# DESCRIPTION: The main network boot routine.
-*#
-*#---------------------------------------------------------------------------
-*# HISTORY
-*#
-*# DATE NAME CHANGES
-*# ---- ---- -------
-*# 2000 01 07 ronny Initial version
-*# 2002 05 02 ronny Fixed segv bug
-*#
-*#***************************************************************************/
-
-void
-NetBoot(void)
-{
- struct packet_buf *p;
- struct timeval tv;
-
- gettimeofday(&tv, NULL);
-
- p = create_packet(0);
- SendToDevice(p->data, p->size);
-
- while(1) {
- static int all_trans = FALSE;
-
- if (got_new_packet) {
- got_new_packet = FALSE;
-
- if (new_ack && first_packet) {
- if (db4) {
- printf("* got ACK %d.\n", last_ack_received);
- printf("* ACK wanted %d.\n", first_packet->seq);
- }
- if (last_ack_received == first_packet->seq) {
- if (!(p = create_packet(first_packet->seq+1))) {
- //break;
- }
- first_packet = free_packet(first_packet);
- }
- }
- }
-
- if (new_ack || timeout(&tv, 500)) {
- if (p) {
- SendToDevice(p->data, p->size);
- }
- new_ack = FALSE;
- gettimeofday(&tv, NULL);
- }
-
- GetNextPacket();
- }
-}
-
-/****************************************************************************
-*#
-*# FUNCTION NAME: GetNextPacket
-*#
-*# DESCRIPTION:
-*#
-*#---------------------------------------------------------------------------
-*# HISTORY
-*#
-*# DATE NAME CHANGES
-*# ---- ---- -------
-*# 961022 ronny Initial version
-*#
-*#***************************************************************************/
-
-void
-GetNextPacket(void)
-{
- int ret;
-
- if (db2) printf("> GetNextPacket\n");
-
- /* got_new_packet = FALSE;*/
- if ((ret = pcap_dispatch(pd, 1, handler, buf)) == -1) {
- pcap_perror(pd, "Error in pcap_dispatch");
- exit(EXIT_FAILURE);
- }
-
- if (db2) printf("< GetNextPacket\n");
-}
-
-/****************************************************************************
-*#
-*# FUNCTION NAME: Handler
-*#
-*# PARAMETERS:
-*#
-*# DESCRIPTION:
-*#
-*#---------------------------------------------------------------------------
-*# HISTORY
-*#
-*# DATE NAME CHANGES
-*# ---- ---- -------
-*# 961022 ronny Initial version
-*#
-*#***************************************************************************/
-
-void
-Handler(unsigned char *buf, const struct pcap_pkthdr *hdr,
- const unsigned char *p)
-{
- const unsigned char *src = &p[6];
- const unsigned char *dst = &p[0];
- struct packet_header_T *h = (struct packet_header_T*)p;
-
- if (db2) printf("> Handler\n");
- got_new_packet = TRUE;
- if ((!memcmp(src, eth_addr_local, 6) && !memcmp(dst, dst_addr_of_device, 6))
- || (!memcmp(src, src_addr_of_device, 6) && !memcmp(dst, eth_addr_local, 6))) {
- if (db1) printf("#RX######################################################\n");
- if (db1) printf("Length: %u(0x%x)\n", (udword)hdr->len, (udword)hdr->len);
- if (pPacket) PrintPacket(p, hdr->caplen, printPacketType);
- DecodeSvintoBoot(p);
- /* should clean up this... */
- if ((ntohl(h->type) == ACK)) {
- if (all_ids || (ntohl(h->id) == id)) {
- if (all_ids && one_id_only) {
- if (ntohl(h->id) == 0) {
- all_ids = FALSE;
- id = ntohl(h->id);
- printf("Booting device with random id %8.8x.\n", id);
- }
- }
- }
- else {
- printf("Got ACK from a new id, %8.8lx. Ignoring.\n",
- (unsigned long)ntohl(h->id));
- return;
- }
- new_ack = TRUE;
- last_ack_received = ntohl(h->seq);
- if (last_ack_received > highest_ack_received) {
- highest_ack_received = last_ack_received;
- }
- }
-
- if (db1) printf("#########################################################\n");
-
- }
- if (db2) printf("< Handler\n");
-}
-
-/****************************************************************************
-*#
-*# FUNCTION NAME: ack_on_seq
-*#
-*# PARAMETERS:
-*#
-*# DESCRIPTION:
-*#
-*#---------------------------------------------------------------------------
-*# HISTORY
-*#
-*# DATE NAME CHANGES
-*# ---- ---- -------
-*# 980817 ronny Initial version
-*#
-*#***************************************************************************/
-
-struct packet_buf *
-packet_with_seq(int seq)
-{
- static int last_seq = 0;
- struct packet_buf *p = first_packet;
- struct packet_header_T *h;
-
- if (seq < last_seq) {
- p = first_packet;
- }
-
- while(p) {
- h = (struct packet_header_T*)p->data;
- if (ntohl(h->seq) == seq) {
- return(p);
- }
- p = p->next;
- }
- return(NULL);
-}
-
-struct packet_buf *
-ack_on_seq(int seq)
-{
- struct packet_buf *p = &first_rec_packet;
- struct packet_header_T *h;
-
- if (db1) printf("***> ack_on_seq: %d.\n", seq);
-
- while (p) {
- /* printf("\nPacket at %x.\n", p);*/
- /* DecodeSvintoBoot(p->data);*/
- h = (struct packet_header_T*)p->data;
- if ( (ntohl(h->type) == ACK) && (ntohl(h->seq) == seq) ) {
- if (all_ids || ntohl(h->id) == id) {
- printf("***< ack_on_seq %d, ok.\n", seq);
- return(p);
- }
- }
- p = p->next;
- }
- if (db1) printf("***< ack_on_seq, no.\n");
- return(NULL);
-}
-
-int
-highest_seq_received(void)
-{
- struct packet_buf *p = &first_rec_packet;
- struct packet_header_T *h;
- int highest_seq = -1;
-
- if (db1) printf("***> highest_seq_received\n");
-
- while (p) {
- /* printf("\nPacket at %x.\n", p);*/
- /* DecodeSvintoBoot(p->data);*/
- h = (struct packet_header_T*)p->data;
- if ((ntohl(h->type) == ACK) && (all_ids || (ntohl(h->id) == id))) {
- if ((int)ntohl(h->seq) > highest_seq) {
- highest_seq = ntohl(h->seq);
- if (db4) printf("Highest seq: %d\n", highest_seq);
- }
- }
- p = p->next;
- }
-
- if (db1) printf("***< highest_seq_received: %d\n", highest_seq);
- return(highest_seq);
-}
-
-/****************************************************************************
-*#
-*# FUNCTION NAME: PrintPacket
-*#
-*# PARAMETERS:
-*#
-*# DESCRIPTION:
-*#
-*#---------------------------------------------------------------------------
-*# HISTORY
-*#
-*# DATE NAME CHANGES
-*# ---- ---- -------
-*# 961022 ronny Initial version
-*#
-*#***************************************************************************/
-
-void
-PrintPacket(const unsigned char *p, int size, int type)
-{
- int i;
-
- /* printf("size %d\n", size);*/
- for (i = 0; i != size; i++) {
- if (i % p_packet_bpl == 0)
- printf("\n%-4.4d: ", i);
- if (type == UDEC)
- printf("%-3d ", p[i]);
- else if (type == HEX)
- printf("%-2.2x ", p[i]);
- else if (type == CHAR) {
- if (isprint(p[i]))
- printf("%-3c ", p[i]);
- else
- printf("%-3d ", p[i]);
- }
- else if (type == ASCII) {
- if (isprint(p[i]))
- printf("%c", p[i]);
- else
- printf(".");
- }
- }
- printf("\n");
-}
-
-/****************************************************************************
-*#
-*# FUNCTION NAME: DecodeSvintoBoot
-*#
-*# PARAMETERS:
-*#
-*# DESCRIPTION: Decodes packets that follow the e100boot protocol.
-*#
-*#---------------------------------------------------------------------------
-*# HISTORY
-*#
-*# DATE NAME CHANGES
-*# ---- ---- -------
-*# 961022 ronny Initial version
-*#
-*#***************************************************************************/
-
-void
-DecodeSvintoBoot(const unsigned char *p)
-{
- char *str;
- volatile struct packet_header_T *ph = (struct packet_header_T*)p;
-
- /* printf("size %d \n", sizeof(struct packet_header_T));*/
-
- if (db4) printf("\n>DecodeSvintoBoot. Packet at 0x%x\n", (unsigned int)p);
- if (db1) {
- printf("%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x -> ", p[6],p[7],p[8],p[9],p[10], p[11]);
- printf("%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x\n", p[0],p[1],p[2],p[3],p[4], p[5]);
-
- printf("length : %4.4lx\n", (long)ntohs(ph->length));
- printf("snap1 : %8.8lx\n", (long)ntohl(ph->snap1));
- printf("snap2 : %8.8lx\n", (long)ntohl(ph->snap2));
-
- switch (ntohl(ph->tag)) {
- case 0xffffffff:
- str = "(host > ETRAX)";
- break;
- case 0xfffffffe:
- str = "(host < ETRAX)";
- break;
- default:
- str = "(unknown)";
- break;
- }
- printf("tag : %8.8lx %s\n", (unsigned long)ntohl(ph->tag), str);
- printf("seq : %8.8lx\n", (unsigned long)ntohl(ph->seq));
- }
-
- switch (ntohl(ph->type)) {
-
- case STRING:
- str = "(STRING)";
- fprintf(stderr, "%s", &p[sizeof(struct packet_header_T)]);
- find_string((char*)&p[sizeof(struct packet_header_T)]);
- break;
-
- case NET_INT: {
- char search_str[20];
-
- str = "(NET_INT)";
- sprintf(search_str, "0x%8.8lx", ntohl(*(udword*)&p[sizeof(struct packet_header_T)]));
- fprintf(stderr, search_str);
- find_string(search_str);
- break;
- }
-
- case NET_INT_NL: {
- char search_str[20];
-
- str = "(NET_INT_NL)";
- sprintf(search_str, "0x%8.8lx\n", ntohl(*(udword*)&p[sizeof(struct packet_header_T)]));
- fprintf(stderr, search_str);
- find_string(search_str);
- break;
- }
-
- case ACK:
- str = "(ACK)";
- break;
-
- case BOOT_PACKET:
- str = "(bootpacket)";
- break;
-
- case BOOT_CMDS:
- str = "(bootcmds)";
- break;
-
- default:
- str = "(unknown)";
- break;
- }
-
- if (db1) {
- printf("(type : %8.8lx %s)\n", (unsigned long)ntohl(ph->type), str);
- printf("(id : %8.8lx)\n", (unsigned long)ntohl(ph->id));
- id = ntohl(ph->id);
- }
-}
-
-/****************************************************************************
-*#
-*# FUNCTION NAME: SendToDevice
-*#
-*# PARAMETERS:
-*#
-*# DESCRIPTION:
-*#
-*#---------------------------------------------------------------------------
-*# DATE NAME CHANGES
-*# ---- ---- -------
-*# 980818 ronny Initial version
-*#
-*#***************************************************************************/
-
-void
-SendToDevice(unsigned char *data, int data_len)
-{
- char fName[MAX_STRING_LEN];
- FILE *fd;
- struct packet_header_T *h = (struct packet_header_T*) data;
-
- if (db1) printf("***> SendToDevice\n");
-
- if (db2) printf("Sending %d bytes at 0x%x to %s.\n", data_len, (unsigned int)data, device);
- if (db1) printf("#TX######################################################\n");
- if (db1) DecodeSvintoBoot(data);
-
- if (db1) printf("#########################################################\n");
- if (toFiles || cmdsOnly) {
- if (cmdsOnly) { /* use a simpler name */
- sprintf(fName, "e100boot.cmds");
- }
- else {
- sprintf(fName, "e100boot.seq%lu", (unsigned long)ntohl(h->seq));
- }
- if (db2) printf("Writing packet to file '%s'.\n", fName);
- if ((fd = fopen(fName, "w+")) == NULL) {
- printf("Cannot open/create '%s'. %s.\n", fName, strerror(errno));
- exit(EXIT_FAILURE);
- }
- fwrite(data, data_len, 1, fd);
- fclose(fd);
- }
- else if (pcap_sendpacket(pd, data, data_len) < 0) {
- perror("pcap_sendpacket failed!\n");
- exit(EXIT_FAILURE);
- }
-
- if (db1) printf("<*** SendToDevice\n");
-}
-
-/****************************************************************************
-*#
-*# FUNCTION NAME: timeout
-*#
-*# PARAMETERS:
-*#
-*# DESCRIPTION:
-*#
-*#---------------------------------------------------------------------------
-*# HISTORY
-*#
-*# DATE NAME CHANGES
-*# ---- ---- -------
-*# 980817 ronny Initial version
-*#
-*#***************************************************************************/
-
-int
-timeout(struct timeval *tvThen, int ms)
-{
- struct timeval tvNow;
- struct timeval tvDiff;
-
- (void) gettimeofday(&tvNow, NULL);
- tvDiff = timeval_subtract(&tvNow, tvThen);
- if (db4) printf("sec %d.%d\n", (int)tvDiff.tv_sec, (int)tvDiff.tv_usec);
- if (ms * 1000 < (tvDiff.tv_sec * 1000000 + tvDiff.tv_usec)) {
- if (db4) printf("TIMEOUT\n");
- return(TRUE);
- }
-
- return(FALSE);
-}
-
-/****************************************************************************
- *#
- *# FUNCTION NAME: timeval_subtract
- *#
- *# PARAMETERS:
- *#
- *# DESCRIPTION: Subtract x-y, and return result.
- *#
- *# DATE NAME CHANGES
- *# ---- ---- -------
- *# 970128 ronny Initial version
- *#
- *#***************************************************************************/
-
-struct timeval
-timeval_subtract(struct timeval *x, struct timeval *y)
-{
- struct timeval diff;
-
- diff.tv_sec = x->tv_sec - y->tv_sec;
- diff.tv_usec = x->tv_usec - y->tv_usec;
-
- if (diff.tv_usec < 0) {
- diff.tv_sec--;
- diff.tv_usec = 1000000 + diff.tv_usec;
- }
-
- return diff;
-}
-
-int
-gettimeofday(struct timeval *tv, void* tz_void)
-{
- struct _timeb tb;
- _ftime(&tb);
- tv->tv_sec = tb.time;
- tv->tv_usec = tb.millitm * 1000;
- return 0;
-}