From: Thomas Huth <thuth@redhat.com>
To: qemu-devel@nongnu.org, Christian Borntraeger <borntraeger@de.ibm.com>
Cc: Alexander Graf <agraf@suse.de>,
Farhan Ali <alifm@linux.vnet.ibm.com>,
David Hildenbrand <david@redhat.com>,
Jens Freimann <jfreiman@redhat.com>,
Eric Farman <farman@linux.vnet.ibm.com>
Subject: [Qemu-devel] [RFC PATCH 08/14] libnet: Refactor some code of netload() into a separate function
Date: Tue, 27 Jun 2017 13:48:14 +0200 [thread overview]
Message-ID: <1498564100-10045-9-git-send-email-thuth@redhat.com> (raw)
In-Reply-To: <1498564100-10045-1-git-send-email-thuth@redhat.com>
netload() is a huge function, it's easy to lose track here. So
let's refactor the TFTP-related loading and error printing code
into a separate function instead.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
pc-bios/s390-ccw/libnet/netload.c | 177 ++++++++++++++++++++------------------
1 file changed, 93 insertions(+), 84 deletions(-)
diff --git a/pc-bios/s390-ccw/libnet/netload.c b/pc-bios/s390-ccw/libnet/netload.c
index 8afe341..f872884 100644
--- a/pc-bios/s390-ccw/libnet/netload.c
+++ b/pc-bios/s390-ccw/libnet/netload.c
@@ -403,13 +403,101 @@ 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)
+{
+ tftp_err_t tftp_err;
+ int rc;
+
+ rc = tftp(fnip, buffer, len, retries, &tftp_err, 1, 1428, ip_vers);
+
+ if (rc > 0) {
+ printf(" TFTP: Received %s (%d KBytes)\n", fnip->filename,
+ rc / 1024);
+ } else if (rc == -1) {
+ netload_error(0x3003, "unknown TFTP error");
+ return -103;
+ } else if (rc == -2) {
+ netload_error(0x3004, "TFTP buffer of %d bytes "
+ "is too small for %s",
+ len, fnip->filename);
+ return -104;
+ } else if (rc == -3) {
+ netload_error(0x3009, "file not found: %s",
+ fnip->filename);
+ return -108;
+ } else if (rc == -4) {
+ netload_error(0x3010, "TFTP access violation");
+ return -109;
+ } else if (rc == -5) {
+ netload_error(0x3011, "illegal TFTP operation");
+ return -110;
+ } else if (rc == -6) {
+ netload_error(0x3012, "unknown TFTP transfer ID");
+ return -111;
+ } else if (rc == -7) {
+ netload_error(0x3013, "no such TFTP user");
+ return -112;
+ } else if (rc == -8) {
+ netload_error(0x3017, "TFTP blocksize negotiation failed");
+ return -116;
+ } else if (rc == -9) {
+ netload_error(0x3018, "file exceeds maximum TFTP transfer size");
+ return -117;
+ } else if (rc <= -10 && rc >= -15) {
+ char *icmp_err_str;
+ switch (rc) {
+ case -ICMP_NET_UNREACHABLE - 10:
+ icmp_err_str = "net unreachable";
+ break;
+ case -ICMP_HOST_UNREACHABLE - 10:
+ icmp_err_str = "host unreachable";
+ break;
+ case -ICMP_PROTOCOL_UNREACHABLE - 10:
+ icmp_err_str = "protocol unreachable";
+ break;
+ case -ICMP_PORT_UNREACHABLE - 10:
+ icmp_err_str = "port unreachable";
+ break;
+ case -ICMP_FRAGMENTATION_NEEDED - 10:
+ icmp_err_str = "fragmentation needed and DF set";
+ break;
+ case -ICMP_SOURCE_ROUTE_FAILED - 10:
+ icmp_err_str = "source route failed";
+ break;
+ default:
+ icmp_err_str = " UNKNOWN";
+ break;
+ }
+ netload_error(0x3005, "ICMP ERROR \"%s\"", icmp_err_str);
+ return -105;
+ } else if (rc == -40) {
+ netload_error(0x3014, "TFTP error occurred after "
+ "%d bad packets received",
+ tftp_err.bad_tftp_packets);
+ return -113;
+ } else if (rc == -41) {
+ netload_error(0x3015, "TFTP error occurred after "
+ "missing %d responses",
+ tftp_err.no_packets);
+ return -114;
+ } else if (rc == -42) {
+ netload_error(0x3016, "TFTP error missing block %d, "
+ "expected block was %d",
+ tftp_err.blocks_missed,
+ tftp_err.blocks_received);
+ return -115;
+ }
+
+ return rc;
+}
+
int netload(char *buffer, int len, char *ret_buffer, int huge_load,
int block_size, char *args_fs, int alen)
{
int rc;
filename_ip_t fn_ip;
int fd_device;
- tftp_err_t tftp_err;
obp_tftp_args_t obp_tftp_args;
char null_ip[4] = { 0x00, 0x00, 0x00, 0x00 };
char null_ip6[16] = { 0x00, 0x00, 0x00, 0x00,
@@ -633,94 +721,15 @@ int netload(char *buffer, int len, char *ret_buffer, int huge_load,
printf("%s\n", ip6_str);
}
- // accept at most 20 bad packets
- // wait at most for 40 packets
- rc = tftp(&fn_ip, (unsigned char *) buffer,
- len, obp_tftp_args.tftp_retries,
- &tftp_err, huge_load, block_size, ip_version);
+ /* 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);
- if(obp_tftp_args.ip_init == IP_INIT_DHCP)
+ if (obp_tftp_args.ip_init == IP_INIT_DHCP)
dhcp_send_release(fn_ip.fd);
close(fn_ip.fd);
- if (rc > 0) {
- printf(" TFTP: Received %s (%d KBytes)\n", fn_ip.filename,
- rc / 1024);
- } else if (rc == -1) {
- netload_error(0x3003, "unknown TFTP error");
- return -103;
- } else if (rc == -2) {
- netload_error(0x3004, "TFTP buffer of %d bytes "
- "is too small for %s",
- len, fn_ip.filename);
- return -104;
- } else if (rc == -3) {
- netload_error(0x3009, "file not found: %s",
- fn_ip.filename);
- return -108;
- } else if (rc == -4) {
- netload_error(0x3010, "TFTP access violation");
- return -109;
- } else if (rc == -5) {
- netload_error(0x3011, "illegal TFTP operation");
- return -110;
- } else if (rc == -6) {
- netload_error(0x3012, "unknown TFTP transfer ID");
- return -111;
- } else if (rc == -7) {
- netload_error(0x3013, "no such TFTP user");
- return -112;
- } else if (rc == -8) {
- netload_error(0x3017, "TFTP blocksize negotiation failed");
- return -116;
- } else if (rc == -9) {
- netload_error(0x3018, "file exceeds maximum TFTP transfer size");
- return -117;
- } else if (rc <= -10 && rc >= -15) {
- char *icmp_err_str;
- switch (rc) {
- case -ICMP_NET_UNREACHABLE - 10:
- icmp_err_str = "net unreachable";
- break;
- case -ICMP_HOST_UNREACHABLE - 10:
- icmp_err_str = "host unreachable";
- break;
- case -ICMP_PROTOCOL_UNREACHABLE - 10:
- icmp_err_str = "protocol unreachable";
- break;
- case -ICMP_PORT_UNREACHABLE - 10:
- icmp_err_str = "port unreachable";
- break;
- case -ICMP_FRAGMENTATION_NEEDED - 10:
- icmp_err_str = "fragmentation needed and DF set";
- break;
- case -ICMP_SOURCE_ROUTE_FAILED - 10:
- icmp_err_str = "source route failed";
- break;
- default:
- icmp_err_str = " UNKNOWN";
- break;
- }
- netload_error(0x3005, "ICMP ERROR \"%s\"", icmp_err_str);
- return -105;
- } else if (rc == -40) {
- netload_error(0x3014, "TFTP error occurred after "
- "%d bad packets received",
- tftp_err.bad_tftp_packets);
- return -113;
- } else if (rc == -41) {
- netload_error(0x3015, "TFTP error occurred after "
- "missing %d responses",
- tftp_err.no_packets);
- return -114;
- } else if (rc == -42) {
- netload_error(0x3016, "TFTP error missing block %d, "
- "expected block was %d",
- tftp_err.blocks_missed,
- tftp_err.blocks_received);
- return -115;
- }
return rc;
}
--
1.8.3.1
next prev parent reply other threads:[~2017-06-27 11:48 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-27 11:48 [Qemu-devel] [RFC PATCH 00/14] Implement network booting directly into the s390-ccw BIOS Thomas Huth
2017-06-27 11:48 ` [Qemu-devel] [RFC PATCH 01/14] pc-bios/s390-ccw: Add the libc from the SLOF firmware Thomas Huth
2017-06-27 15:32 ` David Hildenbrand
2017-06-27 22:14 ` Thomas Huth
2017-06-27 11:48 ` [Qemu-devel] [RFC PATCH 02/14] pc-bios/s390-ccw: Start using the libc from SLOF Thomas Huth
2017-06-27 11:48 ` [Qemu-devel] [RFC PATCH 03/14] pc-bios/s390-ccw: Add a write() function for stdio Thomas Huth
2017-06-27 11:48 ` [Qemu-devel] [RFC PATCH 04/14] pc-bios/s390-ccw: Add implementation of sbrk() Thomas Huth
2017-06-27 11:48 ` [Qemu-devel] [RFC PATCH 05/14] pc-bios/s390-ccw: Add the TFTP network loading stack from SLOF Thomas Huth
2017-06-27 11:48 ` [Qemu-devel] [RFC PATCH 06/14] libnet: Remove remainders of netsave code Thomas Huth
2017-06-27 11:48 ` [Qemu-devel] [RFC PATCH 07/14] libnet: Rework error message printing Thomas Huth
2017-06-27 11:48 ` Thomas Huth [this message]
2017-06-27 11:48 ` [Qemu-devel] [RFC PATCH 09/14] pc-bios/s390-ccw: Make the basic libnet code compilable Thomas Huth
2017-06-27 11:48 ` [Qemu-devel] [RFC PATCH 10/14] pc-bios/s390-ccw: Add timer code for the libnet Thomas Huth
2017-06-27 11:48 ` [Qemu-devel] [RFC PATCH 11/14] pc-bios/s390-ccw: Add virtio-net driver code Thomas Huth
2017-06-27 11:48 ` [Qemu-devel] [RFC PATCH 12/14] pc-bios/s390-ccw: Load file via an intermediate .INS file Thomas Huth
2017-06-27 11:48 ` [Qemu-devel] [RFC PATCH 13/14] pc-bios/s390-ccw: Allow loading to address 0 Thomas Huth
2017-06-27 11:48 ` [Qemu-devel] [RFC PATCH 14/14] pc-bios/s390-ccw: Wire up the netload code Thomas Huth
2017-06-27 15:41 ` [Qemu-devel] [RFC PATCH 00/14] Implement network booting directly into the s390-ccw BIOS David Hildenbrand
2017-06-27 15:50 ` Viktor Mihajlovski
2017-06-27 21:40 ` Thomas Huth
2017-06-28 7:28 ` Viktor Mihajlovski
2017-06-28 8:02 ` Thomas Huth
2017-06-28 10:56 ` Thomas Huth
2017-06-28 15:02 ` Viktor Mihajlovski
2017-06-29 7:58 ` Thomas Huth
2017-06-29 8:10 ` Viktor Mihajlovski
2017-06-27 16:50 ` Farhan Ali
2017-06-28 7:34 ` Thomas Huth
2017-06-27 21:15 ` Alexander Graf
2017-06-27 21:56 ` Thomas Huth
2017-06-28 8:06 ` Gerd Hoffmann
2017-06-28 7:43 ` Christian Borntraeger
2017-06-28 8:59 ` Thomas Huth
2017-06-29 8:17 ` Thomas Huth
2017-06-29 8:39 ` Christian Borntraeger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1498564100-10045-9-git-send-email-thuth@redhat.com \
--to=thuth@redhat.com \
--cc=agraf@suse.de \
--cc=alifm@linux.vnet.ibm.com \
--cc=borntraeger@de.ibm.com \
--cc=david@redhat.com \
--cc=farman@linux.vnet.ibm.com \
--cc=jfreiman@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).