On Sun, 18 Nov 2018, 5:49 AM Simon Goldschmidt < simon.k.r.goldschm...@gmail.com wrote:
> 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.goldschm...@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.goldschm...@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. Thanks Joe. I swear IPv6 is still on my todo list. 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? > I've got a reasonable handle on the mcast requirements for IPv6. Do you want me to have a go at separating these? Basically the network drivers need to retain the APIs (maybe with a CONFIG_MCAST option). The tftp parts can go and I'd need to take a closer look at net.c. 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@lists.denx.de > >> https://lists.denx.de/listinfo/u-boot > > > _______________________________________________ > U-Boot mailing list > U-Boot@lists.denx.de > https://lists.denx.de/listinfo/u-boot > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot