]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - net/bootme.c
net: cosmetic: Name ethaddr variables consistently
[karo-tx-uboot.git] / net / bootme.c
index 56ae37834707f2e55c3bcd7d1b015aa60df3ed68..f56f7acd79f2b578d56e1a49ee9e8ed437db15da 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define WINCE_VRAM_BASE                0x80000000
-#define CE_FIX_ADDRESS(a)      ((void *)((a) - WINCE_VRAM_BASE + CONFIG_SYS_SDRAM_BASE))
-
-#ifndef INT_MAX
-#define INT_MAX                        ((int)(~0 >> 1))
-#endif
-
-/* Bin image parse states */
-#define CE_PS_RTI_ADDR         0
-#define CE_PS_RTI_LEN          1
-#define CE_PS_E_ADDR           2
-#define CE_PS_E_LEN            3
-#define CE_PS_E_CHKSUM         4
-#define CE_PS_E_DATA           5
-
-#define CE_MIN(a, b)           (((a) < (b)) ? (a) : (b))
-#define CE_MAX(a, b)           (((a) > (b)) ? (a) : (b))
-
-#define _STRMAC(s)             #s
-#define STRMAC(s)              _STRMAC(s)
-
 static enum bootme_state bootme_state;
 static int bootme_src_port = 0xdeadface;
 static int bootme_dst_port = 0xdeadbeef;
 static uchar bootme_ether[ETH_ALEN];
-static IPaddr_t bootme_ip;
+static struct in_addr bootme_ip;
 static int bootme_timed_out;
-//static size_t input_len, input_size;
-//static void *input_packet;
 static const char *output_packet; /* used by first send udp */
 static int output_packet_len;
 static unsigned long bootme_timeout;
@@ -97,6 +74,7 @@ static inline void ce_dump_block(void *ptr, int length)
 
 static void bootme_timeout_handler(void)
 {
+       printf("%s\n", __func__);
        net_set_state(NETLOOP_SUCCESS);
        bootme_timed_out++;
 }
@@ -115,10 +93,10 @@ static inline int env_changed(int *id)
 
 static int env_id;
 
-static int is_broadcast(IPaddr_t ip)
+static int is_broadcast(struct in_addr ip)
 {
-       static IPaddr_t netmask;
-       static IPaddr_t our_ip;
+       static struct in_addr netmask;
+       static struct in_addr our_ip;
 
        return (ip == ~0 ||                             /* 255.255.255.255 */
            ((netmask & our_ip) == (netmask & ip) &&    /* on the same net */
@@ -163,13 +141,13 @@ static int check_net_config(void)
                        memset(bootme_ether, 0, sizeof(bootme_ether));
 
                net_init();
-               NetServerIP = bootme_ip;
+               net_copy_ip(&net_server_ip, &bootme_ip);
        }
        return 0;
 }
 
 static void bootme_wait_arp_handler(uchar *pkt, unsigned dest,
-                               IPaddr_t sip, unsigned src,
+                               struct in_addr sip, unsigned src,
                                unsigned len)
 {
        net_set_state(NETLOOP_SUCCESS); /* got arp reply - quit net loop */
@@ -190,18 +168,18 @@ static inline char next_cursor(char c)
        return 0;
 }
 
-static void bootme_handler(uchar *pkt, unsigned dest_port, IPaddr_t src_ip,
+static void bootme_handler(uchar *pkt, unsigned dest_port, struct in_addr src_ip,
                        unsigned src_port, unsigned len)
 {
        uchar *eth_pkt = pkt;
        unsigned eth_len = len;
        static char cursor = '|';
-       enum bootme_state last_state = BOOTME_INIT;
-#if 1
+       enum bootme_state last_state = bootme_state;
+
        debug("received packet of len %d from %pI4:%d to port %d\n",
                len, &src_ip, src_port, dest_port);
        ce_dump_block(pkt, len);
-#endif
+
        if (!bootme_packet_handler) {
                printf("No packet handler set for BOOTME protocol; dropping packet\n");
                return;
@@ -212,37 +190,47 @@ static void bootme_handler(uchar *pkt, unsigned dest_port, IPaddr_t src_ip,
        printf("%c\x08", cursor);
        cursor = next_cursor(cursor);
 
-       if (is_broadcast(bootme_ip)) {
-               bootme_ip = src_ip;
-       } else if (src_ip != bootme_ip) {
+       if (!is_broadcast(bootme_ip) && src_ip != bootme_ip) {
                debug("src_ip %pI4 does not match destination IP %pI4\n",
                        &src_ip, &bootme_ip);
                return; /* not from our server */
        }
-
-       last_state = bootme_state;
-       bootme_dst_port = src_port;
-       debug("bootme_dst_port set to %d\n", bootme_dst_port);
+       if (bootme_state == BOOTME_INIT || bootme_state == BOOTME_DEBUG_INIT) {
+               struct ethernet_hdr *eth = (struct ethernet_hdr *)(pkt -
+                                       NetEthHdrSize() - IP_UDP_HDR_SIZE);
+               memcpy(bootme_ether, eth->et_src, sizeof(bootme_ether));
+               printf("Target MAC address set to %pM\n", bootme_ether);
+
+               if (is_broadcast(bootme_ip)) {
+                       net_copy_ip(&bootme_ip, &src_ip);
+               }
+       }
        if (bootme_state == BOOTME_INIT) {
                bootme_src_port = EDBG_SVC_PORT;
                debug("%s: bootme_src_port set to %d\n", __func__, bootme_src_port);
        }
+
+       debug("bootme_dst_port %d -> %d\n", bootme_dst_port, src_port);
+       bootme_dst_port = src_port;
+
        bootme_state = bootme_packet_handler(eth_pkt, eth_len);
        debug("bootme_packet_handler() returned %d\n", bootme_state);
        if (bootme_state != last_state)
-               debug("bootme_state: %d -> %d\n", last_state, bootme_state);
+               debug("%s@%d: bootme_state: %d -> %d\n", __func__, __LINE__,
+                       last_state, bootme_state);
        switch (bootme_state) {
        case BOOTME_INIT:
+       case BOOTME_DEBUG_INIT:
                break;
 
        case BOOTME_DOWNLOAD:
                if (last_state != BOOTME_INIT)
-                       NetBootFileXferSize += len - 4;
+                       net_boot_file_size += len - 4;
                /* fallthru */
        case BOOTME_DEBUG:
-               if (last_state == BOOTME_INIT) {
+               if (last_state == BOOTME_INIT ||
+                       last_state == BOOTME_DEBUG_INIT)
                        bootme_timeout = 3 * 1000;
-               }
                NetSetTimeout(bootme_timeout, bootme_timeout_handler);
                break;
 
@@ -263,7 +251,7 @@ void BootmeStart(void)
                check_net_config();
 
        if (output_packet_len == 0 ||
-               memcmp(bootme_ether, NetEtherNullAddr, ETH_ALEN) != 0) {
+               is_valid_ethaddr(bootme_ether)) {
                /* wait for incoming packet */
                net_set_udp_handler(bootme_handler);
                bootme_timed_out = 0;
@@ -276,8 +264,11 @@ void BootmeStart(void)
                assert(NetTxPacket != NULL);
                pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE;
                memcpy(pkt, output_packet, output_packet_len);
+               debug("%s@%d: Sending ARP request:\n", __func__, __LINE__);
+               ce_dump_block(pkt, output_packet_len);
                NetSendUDPPacket(bootme_ether, bootme_ip, bootme_dst_port,
                                bootme_src_port, output_packet_len);
+               output_packet_len = 0;
        }
 }
 
@@ -285,23 +276,20 @@ int bootme_send_frame(const void *buf, size_t len)
 {
        int ret;
        struct eth_device *eth;
-       int inited = 0;
        uchar *pkt;
 
        eth = eth_get_dev();
        if (eth == NULL)
                return -EINVAL;
 
-       if (bootme_state == BOOTME_INIT)
+       if (bootme_state == BOOTME_INIT || bootme_state == BOOTME_DEBUG_INIT)
                check_net_config();
 
        debug("%s: buf: %p len: %u from %pI4:%d to %pI4:%d\n",
-               __func__, buf, len, &NetOurIP, bootme_src_port, &bootme_ip, bootme_dst_port);
-
-       if (memcmp(bootme_ether, NetEtherNullAddr, ETH_ALEN) == 0) {
-               if (eth->state == ETH_STATE_ACTIVE)
-                       return 0;       /* inside net loop */
+               __func__, buf, len, &NetOurIP, bootme_src_port, &bootme_ip,
+               bootme_dst_port);
 
+       if (is_zero_ether_addr(bootme_ether)) {
                output_packet = buf;
                output_packet_len = len;
                /* wait for arp reply and send packet */
@@ -325,7 +313,6 @@ int bootme_send_frame(const void *buf, size_t len)
                } else {
                        eth_init_state_only(gd->bd);
                }
-               inited = 1;
        }
 
        assert(NetTxPacket != NULL);
@@ -334,20 +321,18 @@ int bootme_send_frame(const void *buf, size_t len)
 
        ret = NetSendUDPPacket(bootme_ether, bootme_ip, bootme_dst_port,
                        bootme_src_port, len);
-       if (inited) {
-               debug("Stopping network\n");
-               if (eth_is_on_demand_init())
-                       eth_halt();
-               else
-                       eth_halt_state_only();
-       }
+       if (ret)
+               printf("Failed to send packet: %d\n", ret);
+
        return ret;
 }
 
-static void bootme_init(IPaddr_t server_ip)
+static void bootme_init(struct in_addr server_ip)
 {
+       debug("%s@%d: bootme_state: %d -> %d\n", __func__, __LINE__,
+               bootme_state, BOOTME_INIT);
        bootme_state = BOOTME_INIT;
-       bootme_ip = server_ip;
+       net_copy_ip(&bootme_ip, &server_ip);
        /* force reconfiguration in check_net_config() */
        env_id = 0;
 }
@@ -374,7 +359,10 @@ int BootMeDebugStart(bootme_hand_f *handler)
        bootme_packet_handler = handler;
 
        bootme_init(bootme_ip);
-       bootme_state = BOOTME_DEBUG;
+       debug("%s@%d: bootme_state: %d -> %d\n", __func__, __LINE__,
+               bootme_state, BOOTME_DEBUG_INIT);
+       bootme_state = BOOTME_DEBUG_INIT;
+
        bootme_timeout = 3 * 1000;
        NetSetTimeout(bootme_timeout, bootme_timeout_handler);
 
@@ -386,7 +374,7 @@ int BootMeDebugStart(bootme_hand_f *handler)
        return bootme_state;
 }
 
-int BootMeRequest(IPaddr_t server_ip, const void *buf, size_t len, int timeout)
+int BootMeRequest(struct in_addr server_ip, const void *buf, size_t len, int timeout)
 {
        bootme_init(server_ip);
        bootme_timeout = timeout * 1000;