I don't think I understand the problem 
No problem –– I worded it wrong, now edited to fix! ––, the opposite: you can get even the progress meter back with simplest of TFTP servers.
If the size response is the same as reading a file containing the actual file size in bytes, and your own server synthesizes that file on the fly, users can use your client with any TFTP server, without losing functionality. With other TFTP servers they only need to create the size-file by hand. If they don't do that, the progress meter is not shown.
That is, when the TFTP client wants to load "
bootfile", it first requests file "
bootfileSIZE".
Your own TFTP server synthesizes its contents, the size of file "
bootfile" in bytes as an ASCII decimal string followed by a newline. If "
bootfile" does not exist, this file does not exist either. In practice, your TFTP server should always check the file existence first, and then, in the cannot-read case, check the filename suffix and if correct, only then trigger your custom handler.
Your client parses the response, and uses that length for the progress bar when loading "
bootfile", the proper boot data image file.
With any other TFTP server, the user can, but is not required to, to create the "
bootfileSIZE" file themselves, using e.g. the command
stat -L -c '%s' 'bootfile' > 'bootfileSIZE'If they do, it will let the client display the progress. If they don't, the progress is not shown.
Above,
SIZE is a valid but rare or reserved file name suffix. (In Linux, file names are simply non-empty byte sequences not containing 0/0x00 or 47/0x2F; every other value is technically allowed, just not supported by some non-Linux/POSIX/Unix filesystems.)
I believe this yields much wider compatibility than any of the other approaches for the server side, including the later RFCs.
If you wanted security or proper data integrity checks and connection resiliency, a custom transport on top of UDP using ChaCha20-Poly1305 or AES128-GCM is not difficult to implement. It is really the
key exchange, the handshake part, that is tricky; especially if you want to avoid RSA and Diffie–Hellman (because that is what makes TLS slow on old hardware). It is why I've looked into offloading the annoying parts to
Microchip ATECC608B via I²C, specifically using a small board with the IC, a supply bypass cap, and a 4-pin JST PH2.0 connector. To change keys, one just changes the tiny board (BOM < 1€ in singles); works even for IoT MCUs.