[SLOF] [PATCH v2 03/11] libnet: Pass tftp_retries and ip_version via struct filename_ip
Alexey Kardashevskiy
aik at ozlabs.ru
Fri May 25 12:57:22 AEST 2018
On 25/5/18 12:26 am, Thomas Huth wrote:
> On 24.05.2018 11:01, Alexey Kardashevskiy wrote:
>> On 19/5/18 1:45 am, Thomas Huth wrote:
>>> When we will support loading of pxelinux.cfg files later, we have to call
>>> the tftp load function multiple times from different places. To avoid that
>>> we've also got to pass around the tftp_retries and ip_version information
>>> via function parameters to all spots, let's rather put them into struct
>>> filename_ip since we've got this struct filename_ip info available every-
>>> where already.
>>> While we're at it, also drop the __attribute__((packed)) from the struct.
>>> The struct is only used internally, without exchanging it with the outside
>>> world, so the attribute is certainly not necessary here.
>>>
>>> Reviewed-by: Greg Kurz <groug at kaod.org>
>>> Signed-off-by: Thomas Huth <thuth at redhat.com>
>>> ---
>>> lib/libnet/netload.c | 11 ++++++-----
>>> lib/libnet/tftp.c | 6 +++---
>>> lib/libnet/tftp.h | 10 +++++-----
>>> 3 files changed, 14 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/lib/libnet/netload.c b/lib/libnet/netload.c
>>> index 8dca654..407d173 100644
>>> --- a/lib/libnet/netload.c
>>> +++ b/lib/libnet/netload.c
>>> @@ -404,13 +404,12 @@ static void seed_rng(uint8_t mac[])
>>> srand(seed);
>>> }
>>>
>>> -static int tftp_load(filename_ip_t *fnip, unsigned char *buffer, int len,
>>> - unsigned int retries, int ip_vers)
>>> +static int tftp_load(filename_ip_t *fnip, void *buffer, int len)
>>> {
>>> tftp_err_t tftp_err;
>>> int rc;
>>>
>>> - rc = tftp(fnip, buffer, len, retries, &tftp_err, ip_vers);
>>> + rc = tftp(fnip, buffer, len, &tftp_err);
>>>
>>> if (rc > 0) {
>>> printf(" TFTP: Received %s (%d KBytes)\n", fnip->filename,
>>> @@ -737,6 +736,9 @@ int netload(char *buffer, int len, char *args_fs, int alen)
>>> fn_ip.filename[sizeof(fn_ip.filename)-1] = 0;
>>> }
>>>
>>> + fn_ip.ip_version = ip_version;
>>> + fn_ip.tftp_retries = obp_tftp_args.tftp_retries;
>>> +
>>> if (ip_version == 4) {
>>> printf(" Requesting file \"%s\" via TFTP from %d.%d.%d.%d\n",
>>> fn_ip.filename,
>>> @@ -752,8 +754,7 @@ int netload(char *buffer, int len, char *args_fs, int alen)
>>> }
>>>
>>> /* Do the TFTP load and print error message if necessary */
>>> - rc = tftp_load(&fn_ip, (unsigned char *)buffer, len,
>>> - obp_tftp_args.tftp_retries, ip_version);
>>> + rc = tftp_load(&fn_ip, buffer, len);
>>>
>>> if (obp_tftp_args.ip_init == IP_INIT_DHCP)
>>> dhcp_send_release(fn_ip.fd);
>>> diff --git a/lib/libnet/tftp.c b/lib/libnet/tftp.c
>>> index 5e7951f..b7121fe 100644
>>> --- a/lib/libnet/tftp.c
>>> +++ b/lib/libnet/tftp.c
>>> @@ -501,12 +501,12 @@ void handle_tftp_dun(uint8_t err_code)
>>> * NON ZERO - size of received file
>>> */
>>> int tftp(filename_ip_t * _fn_ip, unsigned char *_buffer, int _len,
>>> - unsigned int _retries, tftp_err_t * _tftp_err, int _ip_version)
>>> + tftp_err_t * _tftp_err)
>>> {
>>> - retries = _retries;
>>> + retries = _fn_ip->tftp_retries;
>>> fn_ip = _fn_ip;
>>> len = _len;
>>> - ip_version = _ip_version;
>>> + ip_version = _fn_ip->ip_version;
>>> tftp_errno = 0;
>>> tftp_err = _tftp_err;
>>> tftp_err->bad_tftp_packets = 0;
>>> diff --git a/lib/libnet/tftp.h b/lib/libnet/tftp.h
>>> index a09cf71..c94c94d 100644
>>> --- a/lib/libnet/tftp.h
>>> +++ b/lib/libnet/tftp.h
>>> @@ -29,8 +29,10 @@ struct filename_ip {
>>> ip6_addr_t server_ip6;
>>> ip6_addr_t dns_ip6;
>>> char filename[256];
>>> - int fd;
>>> -} __attribute__ ((packed));
>>> + int fd;
>>> + int ip_version;
>>
>> This one makes sense.
>>
>>> + int tftp_retries;
>>
>> This one does not. It is filename_ip, not obp_tftp_args or anything else
>> with "_args" in the end.
>
> obp_tftp_args is only there for the parameter parsing of the string that
> is passed from obp-tftp Open Firmware package to the libnet code. It is
> strictly limited to the netload.c file, and it is for example also not
> used at all by the netload code of the s390x firmware in QEMU (which
> uses the other parts of SLOF's libnet code). So it would not make sense
> to pass obp_tftp_args to the code in tftp.c.
I was not suggesting reuse, I just used it as an example of a slightly more
informative name ;)
btw obp_tftp_args_t::filename[100] vs. filename_ip::filename[256] - it
feels like the latter can be easily reduced to 140-ish (path + uuid) with
no harm but probably this is for another day (both definitions came in the
initial commit).
> If you're confused by the "filename_ip" name, we could maybe simply
> rename that one to "netload_params" or "netload_args" instead ... or I
> could simply revert that change in my patches so that we continue to
> pass the tftp retries variable as normal function parameter instead...
> just let me know what you prefer.
Passing "retries" separately seems better.
>> The mac address (from pxelinux_load_cfg, for example) would make more sense
>> as a part of filename_ip imho.
>
> Yes, maybe ... but it didn't annoy me as much as the tftp_retries when I
> reworked the code, so unless you really want me to include it into the
> structure here, I'd rather keep it separated for now.
Sure.
--
Alexey
More information about the SLOF
mailing list