[U-Boot] [PATCH v3 7/8] net: remove CONFIG_MCAST_TFTP
Simon Goldschmidt
simon.k.r.goldschmidt at gmail.com
Sat Nov 17 16:48:20 UTC 2018
On 17.11.2018 17:05, Joe Hershberger wrote:
> Hi Simon,
>
> Thanks for tackling this.
>
> On Sat, Nov 17, 2018 at 6:31 AM Simon Goldschmidt
> <simon.k.r.goldschmidt at gmail.com> wrote:
>> This option seems unused as no mainline board enables it and it does
>> not compile since some years.
>>
>> Additionally, it has a potential buffer underrun issue (reported as
>> a side node in CVE-2018-18439).
>>
>> Instead of trying to fix a thing noone seems to use, let's rather
>> drop dead code.
>>
>> Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com>
>> ---
>>
>> Changes in v2:
>> - this patch is new in v2
>>
>> README | 9 --
>> drivers/net/rtl8139.c | 9 --
>> drivers/net/tsec.c | 52 --------
>> drivers/usb/gadget/ether.c | 3 -
>> include/net.h | 17 ---
>> net/eth-uclass.c | 4 -
>> net/eth_legacy.c | 46 --------
>> net/net.c | 9 +-
>> net/tftp.c | 223 +----------------------------------
> I think the TFTP stuff can be removed, but multicast in general
> probably not, since I believe IPv6 support requires it. I guess we
> could put it back at that time, but I'm a bit concerned that we will
> diverge and make that work harder. Maybe it's feasible to simply stop
> guarding multicast support in the core and drivers with the TFTP
> config and enable it at all times. The code size on that side is
> minimal.
Well, it was a bit hard for me to see what's general multicast and
what's tftp only, given that it's all using one tftp-related guard.
Maybe it would be better to drop this patch from the series to discuss
this in a separate thread?
Simon
>
> Thanks,
> -Joe
>
>> scripts/config_whitelist.txt | 1 -
>> 10 files changed, 2 insertions(+), 371 deletions(-)
>>
>> diff --git a/README b/README
>> index a46c7c63a4..97a3e9a84b 100644
>> --- a/README
>> +++ b/README
>> @@ -1429,15 +1429,6 @@ The following options need to be configured:
>> forwarded through a router.
>> (Environment variable "netmask")
>>
>> -- Multicast TFTP Mode:
>> - CONFIG_MCAST_TFTP
>> -
>> - Defines whether you want to support multicast TFTP as per
>> - rfc-2090; for example to work with atftp. Lets lots of targets
>> - tftp down the same boot image concurrently. Note: the Ethernet
>> - driver in use must provide a function: mcast() to join/leave a
>> - multicast group.
>> -
>> - BOOTP Recovery Mode:
>> CONFIG_BOOTP_RANDOM_DELAY
>>
>> diff --git a/drivers/net/rtl8139.c b/drivers/net/rtl8139.c
>> index 590f8ce154..79acd64bc0 100644
>> --- a/drivers/net/rtl8139.c
>> +++ b/drivers/net/rtl8139.c
>> @@ -183,12 +183,6 @@ static void rtl_reset(struct eth_device *dev);
>> static int rtl_transmit(struct eth_device *dev, void *packet, int length);
>> static int rtl_poll(struct eth_device *dev);
>> static void rtl_disable(struct eth_device *dev);
>> -#ifdef CONFIG_MCAST_TFTP/* This driver already accepts all b/mcast */
>> -static int rtl_bcast_addr(struct eth_device *dev, const u8 *bcast_mac, u8 set)
>> -{
>> - return (0);
>> -}
>> -#endif
>>
>> static struct pci_device_id supported[] = {
>> {PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8139},
>> @@ -229,9 +223,6 @@ int rtl8139_initialize(bd_t *bis)
>> dev->halt = rtl_disable;
>> dev->send = rtl_transmit;
>> dev->recv = rtl_poll;
>> -#ifdef CONFIG_MCAST_TFTP
>> - dev->mcast = rtl_bcast_addr;
>> -#endif
>>
>> eth_register (dev);
>>
>> diff --git a/drivers/net/tsec.c b/drivers/net/tsec.c
>> index 03a46da2f8..614097c6ce 100644
>> --- a/drivers/net/tsec.c
>> +++ b/drivers/net/tsec.c
>> @@ -78,52 +78,6 @@ static void tsec_configure_serdes(struct tsec_private *priv)
>> 0, TBI_CR, CONFIG_TSEC_TBICR_SETTINGS);
>> }
>>
>> -#ifdef CONFIG_MCAST_TFTP
>> -
>> -/* CREDITS: linux gianfar driver, slightly adjusted... thanx. */
>> -
>> -/* Set the appropriate hash bit for the given addr */
>> -
>> -/*
>> - * The algorithm works like so:
>> - * 1) Take the Destination Address (ie the multicast address), and
>> - * do a CRC on it (little endian), and reverse the bits of the
>> - * result.
>> - * 2) Use the 8 most significant bits as a hash into a 256-entry
>> - * table. The table is controlled through 8 32-bit registers:
>> - * gaddr0-7. gaddr0's MSB is entry 0, and gaddr7's LSB is entry
>> - * 255. This means that the 3 most significant bits in the
>> - * hash index which gaddr register to use, and the 5 other bits
>> - * indicate which bit (assuming an IBM numbering scheme, which
>> - * for PowerPC (tm) is usually the case) in the register holds
>> - * the entry.
>> - */
>> -#ifndef CONFIG_DM_ETH
>> -static int tsec_mcast_addr(struct eth_device *dev, const u8 *mcast_mac, u8 set)
>> -#else
>> -static int tsec_mcast_addr(struct udevice *dev, const u8 *mcast_mac, int set)
>> -#endif
>> -{
>> - struct tsec_private *priv = (struct tsec_private *)dev->priv;
>> - struct tsec __iomem *regs = priv->regs;
>> - u32 result, value;
>> - u8 whichbit, whichreg;
>> -
>> - result = ether_crc(MAC_ADDR_LEN, mcast_mac);
>> - whichbit = (result >> 24) & 0x1f; /* the 5 LSB = which bit to set */
>> - whichreg = result >> 29; /* the 3 MSB = which reg to set it in */
>> -
>> - value = BIT(31 - whichbit);
>> -
>> - if (set)
>> - setbits_be32(®s->hash.gaddr0 + whichreg, value);
>> - else
>> - clrbits_be32(®s->hash.gaddr0 + whichreg, value);
>> -
>> - return 0;
>> -}
>> -#endif /* Multicast TFTP ? */
>> -
>> /*
>> * Initialized required registers to appropriate values, zeroing
>> * those we don't care about (unless zero is bad, in which case,
>> @@ -720,9 +674,6 @@ static int tsec_initialize(bd_t *bis, struct tsec_info_struct *tsec_info)
>> dev->halt = tsec_halt;
>> dev->send = tsec_send;
>> dev->recv = tsec_recv;
>> -#ifdef CONFIG_MCAST_TFTP
>> - dev->mcast = tsec_mcast_addr;
>> -#endif
>>
>> /* Tell U-Boot to get the addr from the env */
>> for (i = 0; i < 6; i++)
>> @@ -862,9 +813,6 @@ static const struct eth_ops tsec_ops = {
>> .recv = tsec_recv,
>> .free_pkt = tsec_free_pkt,
>> .stop = tsec_halt,
>> -#ifdef CONFIG_MCAST_TFTP
>> - .mcast = tsec_mcast_addr,
>> -#endif
>> };
>>
>> static const struct udevice_id tsec_ids[] = {
>> diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
>> index 90ef1f055f..41fe41e1a6 100644
>> --- a/drivers/usb/gadget/ether.c
>> +++ b/drivers/usb/gadget/ether.c
>> @@ -2607,9 +2607,6 @@ int usb_eth_initialize(bd_t *bi)
>> netdev->halt = usb_eth_halt;
>> netdev->priv = l_priv;
>>
>> -#ifdef CONFIG_MCAST_TFTP
>> - #error not supported
>> -#endif
>> eth_register(netdev);
>> return 0;
>> }
>> diff --git a/include/net.h b/include/net.h
>> index 51c099dae2..072b658442 100644
>> --- a/include/net.h
>> +++ b/include/net.h
>> @@ -123,7 +123,6 @@ enum eth_recv_flags {
>> * called when no error was returned from recv - optional
>> * stop: Stop the hardware from looking for packets - may be called even if
>> * state == PASSIVE
>> - * mcast: Join or leave a multicast group (for TFTP) - optional
>> * write_hwaddr: Write a MAC address to the hardware (used to pass it to Linux
>> * on some platforms like ARM). This function expects the
>> * eth_pdata::enetaddr field to be populated. The method can
>> @@ -140,9 +139,6 @@ struct eth_ops {
>> int (*recv)(struct udevice *dev, int flags, uchar **packetp);
>> int (*free_pkt)(struct udevice *dev, uchar *packet, int length);
>> void (*stop)(struct udevice *dev);
>> -#ifdef CONFIG_MCAST_TFTP
>> - int (*mcast)(struct udevice *dev, const u8 *enetaddr, int join);
>> -#endif
>> int (*write_hwaddr)(struct udevice *dev);
>> int (*read_rom_hwaddr)(struct udevice *dev);
>> };
>> @@ -175,9 +171,6 @@ struct eth_device {
>> int (*send)(struct eth_device *, void *packet, int length);
>> int (*recv)(struct eth_device *);
>> void (*halt)(struct eth_device *);
>> -#ifdef CONFIG_MCAST_TFTP
>> - int (*mcast)(struct eth_device *, const u8 *enetaddr, u8 set);
>> -#endif
>> int (*write_hwaddr)(struct eth_device *);
>> struct eth_device *next;
>> int index;
>> @@ -287,12 +280,6 @@ int eth_rx(void); /* Check for received packets */
>> void eth_halt(void); /* stop SCC */
>> const char *eth_get_name(void); /* get name of current device */
>>
>> -#ifdef CONFIG_MCAST_TFTP
>> -int eth_mcast_join(struct in_addr mcast_addr, int join);
>> -u32 ether_crc(size_t len, unsigned char const *p);
>> -#endif
>> -
>> -
>> /**********************************************************************/
>> /*
>> * Protocol headers.
>> @@ -578,10 +565,6 @@ extern struct in_addr net_ntp_server; /* the ip address to NTP */
>> extern int net_ntp_time_offset; /* offset time from UTC */
>> #endif
>>
>> -#if defined(CONFIG_MCAST_TFTP)
>> -extern struct in_addr net_mcast_addr;
>> -#endif
>> -
>> /* Initialize the network adapter */
>> void net_init(void);
>> int net_loop(enum proto_t);
>> diff --git a/net/eth-uclass.c b/net/eth-uclass.c
>> index 91d861be41..bafa093c37 100644
>> --- a/net/eth-uclass.c
>> +++ b/net/eth-uclass.c
>> @@ -476,10 +476,6 @@ static int eth_post_probe(struct udevice *dev)
>> ops->free_pkt += gd->reloc_off;
>> if (ops->stop)
>> ops->stop += gd->reloc_off;
>> -#ifdef CONFIG_MCAST_TFTP
>> - if (ops->mcast)
>> - ops->mcast += gd->reloc_off;
>> -#endif
>> if (ops->write_hwaddr)
>> ops->write_hwaddr += gd->reloc_off;
>> if (ops->read_rom_hwaddr)
>> diff --git a/net/eth_legacy.c b/net/eth_legacy.c
>> index 2a9caa3509..7e82422b29 100644
>> --- a/net/eth_legacy.c
>> +++ b/net/eth_legacy.c
>> @@ -291,52 +291,6 @@ int eth_initialize(void)
>> return num_devices;
>> }
>>
>> -#ifdef CONFIG_MCAST_TFTP
>> -/* Multicast.
>> - * mcast_addr: multicast ipaddr from which multicast Mac is made
>> - * join: 1=join, 0=leave.
>> - */
>> -int eth_mcast_join(struct in_addr mcast_ip, int join)
>> -{
>> - u8 mcast_mac[ARP_HLEN];
>> - if (!eth_current || !eth_current->mcast)
>> - return -1;
>> - mcast_mac[5] = htonl(mcast_ip.s_addr) & 0xff;
>> - mcast_mac[4] = (htonl(mcast_ip.s_addr)>>8) & 0xff;
>> - mcast_mac[3] = (htonl(mcast_ip.s_addr)>>16) & 0x7f;
>> - mcast_mac[2] = 0x5e;
>> - mcast_mac[1] = 0x0;
>> - mcast_mac[0] = 0x1;
>> - return eth_current->mcast(eth_current, mcast_mac, join);
>> -}
>> -
>> -/* the 'way' for ethernet-CRC-32. Spliced in from Linux lib/crc32.c
>> - * and this is the ethernet-crc method needed for TSEC -- and perhaps
>> - * some other adapter -- hash tables
>> - */
>> -#define CRCPOLY_LE 0xedb88320
>> -u32 ether_crc(size_t len, unsigned char const *p)
>> -{
>> - int i;
>> - u32 crc;
>> - crc = ~0;
>> - while (len--) {
>> - crc ^= *p++;
>> - for (i = 0; i < 8; i++)
>> - crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0);
>> - }
>> - /* an reverse the bits, cuz of way they arrive -- last-first */
>> - crc = (crc >> 16) | (crc << 16);
>> - crc = (crc >> 8 & 0x00ff00ff) | (crc << 8 & 0xff00ff00);
>> - crc = (crc >> 4 & 0x0f0f0f0f) | (crc << 4 & 0xf0f0f0f0);
>> - crc = (crc >> 2 & 0x33333333) | (crc << 2 & 0xcccccccc);
>> - crc = (crc >> 1 & 0x55555555) | (crc << 1 & 0xaaaaaaaa);
>> - return crc;
>> -}
>> -
>> -#endif
>> -
>> -
>> int eth_init(void)
>> {
>> struct eth_device *old_current;
>> diff --git a/net/net.c b/net/net.c
>> index a5a216c3ee..72286e24f4 100644
>> --- a/net/net.c
>> +++ b/net/net.c
>> @@ -131,10 +131,6 @@ struct in_addr net_dns_server;
>> struct in_addr net_dns_server2;
>> #endif
>>
>> -#ifdef CONFIG_MCAST_TFTP /* Multicast TFTP */
>> -struct in_addr net_mcast_addr;
>> -#endif
>> -
>> /** END OF BOOTP EXTENTIONS **/
>>
>> /* Our ethernet address */
>> @@ -1215,10 +1211,7 @@ void net_process_received_packet(uchar *in_packet, int len)
>> dst_ip = net_read_ip(&ip->ip_dst);
>> if (net_ip.s_addr && dst_ip.s_addr != net_ip.s_addr &&
>> dst_ip.s_addr != 0xFFFFFFFF) {
>> -#ifdef CONFIG_MCAST_TFTP
>> - if (net_mcast_addr != dst_ip)
>> -#endif
>> - return;
>> + return;
>> }
>> /* Read source IP address for later use */
>> src_ip = net_read_ip(&ip->ip_src);
>> diff --git a/net/tftp.c b/net/tftp.c
>> index 68ffd81414..563ce3a06f 100644
>> --- a/net/tftp.c
>> +++ b/net/tftp.c
>> @@ -134,36 +134,6 @@ static char tftp_filename[MAX_LEN];
>> static unsigned short tftp_block_size = TFTP_BLOCK_SIZE;
>> static unsigned short tftp_block_size_option = TFTP_MTU_BLOCKSIZE;
>>
>> -#ifdef CONFIG_MCAST_TFTP
>> -#include <malloc.h>
>> -#define MTFTP_BITMAPSIZE 0x1000
>> -static unsigned *tftp_mcast_bitmap;
>> -static int tftp_mcast_prev_hole;
>> -static int tftp_mcast_bitmap_size = MTFTP_BITMAPSIZE;
>> -static int tftp_mcast_disabled;
>> -static int tftp_mcast_master_client;
>> -static int tftp_mcast_active;
>> -static int tftp_mcast_port;
>> -/* can get 'last' block before done..*/
>> -static ulong tftp_mcast_ending_block;
>> -
>> -static void parse_multicast_oack(char *pkt, int len);
>> -
>> -static void mcast_cleanup(void)
>> -{
>> - if (net_mcast_addr)
>> - eth_mcast_join(net_mcast_addr, 0);
>> - if (tftp_mcast_bitmap)
>> - free(tftp_mcast_bitmap);
>> - tftp_mcast_bitmap = NULL;
>> - net_mcast_addr.s_addr = 0;
>> - tftp_mcast_active = 0;
>> - tftp_mcast_port = 0;
>> - tftp_mcast_ending_block = -1;
>> -}
>> -
>> -#endif /* CONFIG_MCAST_TFTP */
>> -
>> static inline void store_block(int block, uchar *src, unsigned len)
>> {
>> ulong offset = block * tftp_block_size + tftp_block_wrap_offset;
>> @@ -196,10 +166,6 @@ static inline void store_block(int block, uchar *src, unsigned len)
>> memcpy(ptr, src, len);
>> unmap_sysmem(ptr);
>> }
>> -#ifdef CONFIG_MCAST_TFTP
>> - if (tftp_mcast_active)
>> - ext2_set_bit(block, tftp_mcast_bitmap);
>> -#endif
>>
>> if (net_boot_file_size < newsize)
>> net_boot_file_size = newsize;
>> @@ -275,9 +241,6 @@ static void show_block_marker(void)
>> static void restart(const char *msg)
>> {
>> printf("\n%s; starting again\n", msg);
>> -#ifdef CONFIG_MCAST_TFTP
>> - mcast_cleanup();
>> -#endif
>> net_start_again();
>> }
>>
>> @@ -332,12 +295,6 @@ static void tftp_send(void)
>> int len = 0;
>> ushort *s;
>>
>> -#ifdef CONFIG_MCAST_TFTP
>> - /* Multicast TFTP.. non-MasterClients do not ACK data. */
>> - if (tftp_mcast_active && tftp_state == STATE_DATA &&
>> - tftp_mcast_master_client == 0)
>> - return;
>> -#endif
>> /*
>> * We will always be sending some sort of packet, so
>> * cobble together the packet headers now.
>> @@ -372,31 +329,10 @@ static void tftp_send(void)
>> /* try for more effic. blk size */
>> pkt += sprintf((char *)pkt, "blksize%c%d%c",
>> 0, tftp_block_size_option, 0);
>> -#ifdef CONFIG_MCAST_TFTP
>> - /* Check all preconditions before even trying the option */
>> - if (!tftp_mcast_disabled) {
>> - tftp_mcast_bitmap = malloc(tftp_mcast_bitmap_size);
>> - if (tftp_mcast_bitmap && eth_get_dev()->mcast) {
>> - free(tftp_mcast_bitmap);
>> - tftp_mcast_bitmap = NULL;
>> - pkt += sprintf((char *)pkt, "multicast%c%c",
>> - 0, 0);
>> - }
>> - }
>> -#endif /* CONFIG_MCAST_TFTP */
>> len = pkt - xp;
>> break;
>>
>> case STATE_OACK:
>> -#ifdef CONFIG_MCAST_TFTP
>> - /* My turn! Start at where I need blocks I missed. */
>> - if (tftp_mcast_active)
>> - tftp_cur_block = ext2_find_next_zero_bit(
>> - tftp_mcast_bitmap,
>> - tftp_mcast_bitmap_size * 8, 0);
>> - /* fall through */
>> -#endif
>> -
>> case STATE_RECV_WRQ:
>> case STATE_DATA:
>> xp = pkt;
>> @@ -465,11 +401,7 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
>> int i;
>>
>> if (dest != tftp_our_port) {
>> -#ifdef CONFIG_MCAST_TFTP
>> - if (tftp_mcast_active &&
>> - (!tftp_mcast_port || dest != tftp_mcast_port))
>> -#endif
>> - return;
>> + return;
>> }
>> if (tftp_state != STATE_SEND_RRQ && src != tftp_remote_port &&
>> tftp_state != STATE_RECV_WRQ && tftp_state != STATE_SEND_WRQ)
>> @@ -549,12 +481,6 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
>> }
>> #endif
>> }
>> -#ifdef CONFIG_MCAST_TFTP
>> - parse_multicast_oack((char *)pkt, len - 1);
>> - if ((tftp_mcast_active) && (!tftp_mcast_master_client))
>> - tftp_state = STATE_DATA; /* passive.. */
>> - else
>> -#endif
>> #ifdef CONFIG_CMD_TFTPPUT
>> if (tftp_put_active) {
>> /* Get ready to send the first block */
>> @@ -582,11 +508,6 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
>> tftp_remote_port = src;
>> new_transfer();
>>
>> -#ifdef CONFIG_MCAST_TFTP
>> - if (tftp_mcast_active) { /* start!=1 common if mcast */
>> - tftp_prev_block = tftp_cur_block - 1;
>> - } else
>> -#endif
>> if (tftp_cur_block != 1) { /* Assertion */
>> puts("\nTFTP error: ");
>> printf("First block is not block 1 (%ld)\n",
>> @@ -612,44 +533,8 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
>> * Acknowledge the block just received, which will prompt
>> * the remote for the next one.
>> */
>> -#ifdef CONFIG_MCAST_TFTP
>> - /* if I am the MasterClient, actively calculate what my next
>> - * needed block is; else I'm passive; not ACKING
>> - */
>> - if (tftp_mcast_active) {
>> - if (len < tftp_block_size) {
>> - tftp_mcast_ending_block = tftp_cur_block;
>> - } else if (tftp_mcast_master_client) {
>> - tftp_mcast_prev_hole = ext2_find_next_zero_bit(
>> - tftp_mcast_bitmap,
>> - tftp_mcast_bitmap_size * 8,
>> - tftp_mcast_prev_hole);
>> - tftp_cur_block = tftp_mcast_prev_hole;
>> - if (tftp_cur_block >
>> - ((tftp_mcast_bitmap_size * 8) - 1)) {
>> - debug("tftpfile too big\n");
>> - /* try to double it and retry */
>> - tftp_mcast_bitmap_size <<= 1;
>> - mcast_cleanup();
>> - net_start_again();
>> - return;
>> - }
>> - tftp_prev_block = tftp_cur_block;
>> - }
>> - }
>> -#endif
>> tftp_send();
>>
>> -#ifdef CONFIG_MCAST_TFTP
>> - if (tftp_mcast_active) {
>> - if (tftp_mcast_master_client &&
>> - (tftp_cur_block >= tftp_mcast_ending_block)) {
>> - puts("\nMulticast tftp done\n");
>> - mcast_cleanup();
>> - net_set_state(NETLOOP_SUCCESS);
>> - }
>> - } else
>> -#endif
>> if (len < tftp_block_size)
>> tftp_complete();
>> break;
>> @@ -672,9 +557,6 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
>> case TFTP_ERR_FILE_ALREADY_EXISTS:
>> default:
>> puts("Starting again\n\n");
>> -#ifdef CONFIG_MCAST_TFTP
>> - mcast_cleanup();
>> -#endif
>> net_start_again();
>> break;
>> }
>> @@ -826,9 +708,6 @@ void tftp_start(enum proto_t protocol)
>> memset(net_server_ethaddr, 0, 6);
>> /* Revert tftp_block_size to dflt */
>> tftp_block_size = TFTP_BLOCK_SIZE;
>> -#ifdef CONFIG_MCAST_TFTP
>> - mcast_cleanup();
>> -#endif
>> #ifdef CONFIG_TFTP_TSIZE
>> tftp_tsize = 0;
>> tftp_tsize_num_hash = 0;
>> @@ -870,103 +749,3 @@ void tftp_start_server(void)
>> memset(net_server_ethaddr, 0, 6);
>> }
>> #endif /* CONFIG_CMD_TFTPSRV */
>> -
>> -#ifdef CONFIG_MCAST_TFTP
>> -/*
>> - * Credits: atftp project.
>> - */
>> -
>> -/*
>> - * Pick up BcastAddr, Port, and whether I am [now] the master-client.
>> - * Frame:
>> - * +-------+-----------+---+-------~~-------+---+
>> - * | opc | multicast | 0 | addr, port, mc | 0 |
>> - * +-------+-----------+---+-------~~-------+---+
>> - * The multicast addr/port becomes what I listen to, and if 'mc' is '1' then
>> - * I am the new master-client so must send ACKs to DataBlocks. If I am not
>> - * master-client, I'm a passive client, gathering what DataBlocks I may and
>> - * making note of which ones I got in my bitmask.
>> - * In theory, I never go from master->passive..
>> - * .. this comes in with pkt already pointing just past opc
>> - */
>> -static void parse_multicast_oack(char *pkt, int len)
>> -{
>> - int i;
>> - struct in_addr addr;
>> - char *mc_adr;
>> - char *port;
>> - char *mc;
>> -
>> - mc_adr = NULL;
>> - port = NULL;
>> - mc = NULL;
>> - /* march along looking for 'multicast\0', which has to start at least
>> - * 14 bytes back from the end.
>> - */
>> - for (i = 0; i < len - 14; i++)
>> - if (strcmp(pkt + i, "multicast") == 0)
>> - break;
>> - if (i >= (len - 14)) /* non-Multicast OACK, ign. */
>> - return;
>> -
>> - i += 10; /* strlen multicast */
>> - mc_adr = pkt + i;
>> - for (; i < len; i++) {
>> - if (*(pkt + i) == ',') {
>> - *(pkt + i) = '\0';
>> - if (port) {
>> - mc = pkt + i + 1;
>> - break;
>> - } else {
>> - port = pkt + i + 1;
>> - }
>> - }
>> - }
>> - if (!port || !mc_adr || !mc)
>> - return;
>> - if (tftp_mcast_active && tftp_mcast_master_client) {
>> - printf("I got a OACK as master Client, WRONG!\n");
>> - return;
>> - }
>> - /* ..I now accept packets destined for this MCAST addr, port */
>> - if (!tftp_mcast_active) {
>> - if (tftp_mcast_bitmap) {
>> - printf("Internal failure! no mcast.\n");
>> - free(tftp_mcast_bitmap);
>> - tftp_mcast_bitmap = NULL;
>> - tftp_mcast_disabled = 1;
>> - return;
>> - }
>> - /* I malloc instead of pre-declare; so that if the file ends
>> - * up being too big for this bitmap I can retry
>> - */
>> - tftp_mcast_bitmap = malloc(tftp_mcast_bitmap_size);
>> - if (!tftp_mcast_bitmap) {
>> - printf("No bitmap, no multicast. Sorry.\n");
>> - tftp_mcast_disabled = 1;
>> - return;
>> - }
>> - memset(tftp_mcast_bitmap, 0, tftp_mcast_bitmap_size);
>> - tftp_mcast_prev_hole = 0;
>> - tftp_mcast_active = 1;
>> - }
>> - addr = string_to_ip(mc_adr);
>> - if (net_mcast_addr.s_addr != addr.s_addr) {
>> - if (net_mcast_addr.s_addr)
>> - eth_mcast_join(net_mcast_addr, 0);
>> - net_mcast_addr = addr;
>> - if (eth_mcast_join(net_mcast_addr, 1)) {
>> - printf("Fail to set mcast, revert to TFTP\n");
>> - tftp_mcast_disabled = 1;
>> - mcast_cleanup();
>> - net_start_again();
>> - }
>> - }
>> - tftp_mcast_master_client = simple_strtoul((char *)mc, NULL, 10);
>> - tftp_mcast_port = (unsigned short)simple_strtoul(port, NULL, 10);
>> - printf("Multicast: %s:%d [%d]\n", mc_adr, tftp_mcast_port,
>> - tftp_mcast_master_client);
>> - return;
>> -}
>> -
>> -#endif /* Multicast TFTP */
>> diff --git a/scripts/config_whitelist.txt b/scripts/config_whitelist.txt
>> index 0627024e71..b2691206fb 100644
>> --- a/scripts/config_whitelist.txt
>> +++ b/scripts/config_whitelist.txt
>> @@ -1210,7 +1210,6 @@ CONFIG_MAX_FPGA_DEVICES
>> CONFIG_MAX_MEM_MAPPED
>> CONFIG_MAX_PKT
>> CONFIG_MAX_RAM_BANK_SIZE
>> -CONFIG_MCAST_TFTP
>> CONFIG_MCF5249
>> CONFIG_MCF5253
>> CONFIG_MCFFEC
>> --
>> 2.17.1
>>
>> _______________________________________________
>> U-Boot mailing list
>> U-Boot at lists.denx.de
>> https://lists.denx.de/listinfo/u-boot
More information about the U-Boot
mailing list