qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/3] Make BOOTP work with slirp
@ 2007-02-18  0:56 Anthony Liguori
  2007-02-18  1:01 ` [Qemu-devel] [PATCH 1/3] Add OACK support to slirp TFTP server Anthony Liguori
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Anthony Liguori @ 2007-02-18  0:56 UTC (permalink / raw)
  To: qemu-devel, Erwan Velu

The following patch series allows for BOOTP to be used with slirp.  The 
original patch was written by Erwan Velu.

With the full series, you can do:

qemu -hda /path/to/disk.img -boot n -tftp ~/tftpdir -bootp /pxelinux.0

And the guest will boot from ~/tftpdir/pxelinux.0.

Regards,

Anthony Liguori

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 1/3] Add OACK support to slirp TFTP server
  2007-02-18  0:56 [Qemu-devel] [PATCH 0/3] Make BOOTP work with slirp Anthony Liguori
@ 2007-02-18  1:01 ` Anthony Liguori
  2007-02-18  1:04 ` [Qemu-devel] [PATCH 2/3] Add -bootp option for slip Anthony Liguori
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Anthony Liguori @ 2007-02-18  1:01 UTC (permalink / raw)
  To: qemu-devel; +Cc: Erwan Velu

[-- Attachment #1: Type: text/plain, Size: 102 bytes --]

Specifically, this patch adds tsize handling which is needed for PXELinux.

Regards,

Anthony Liguori

[-- Attachment #2: slirp-tftp-oack.diff --]
[-- Type: text/x-patch, Size: 2781 bytes --]

diff -r 153828edbad3 slirp/tftp.c
--- a/slirp/tftp.c	Thu Feb 15 16:37:56 2007 -0600
+++ b/slirp/tftp.c	Thu Feb 15 21:37:26 2007 -0600
@@ -120,6 +120,45 @@ static int tftp_read_data(struct tftp_se
   return bytes_read;
 }
 
+static int tftp_send_oack(struct tftp_session *spt, 
+                          const char *key, uint32_t value,
+                          struct tftp_t *recv_tp)
+{
+    struct sockaddr_in saddr, daddr;
+    struct mbuf *m;
+    struct tftp_t *tp;
+    int n = 0;
+
+    m = m_get();
+
+    if (!m)
+	return -1;
+
+    memset(m->m_data, 0, m->m_size);
+
+    m->m_data += if_maxlinkhdr;
+    tp = (void *)m->m_data;
+    m->m_data += sizeof(struct udpiphdr);
+    
+    tp->tp_op = htons(TFTP_OACK);
+    n += sprintf(tp->x.tp_buf + n, "%s", key) + 1;
+    n += sprintf(tp->x.tp_buf + n, "%u", value) + 1;
+
+    saddr.sin_addr = recv_tp->ip.ip_dst;
+    saddr.sin_port = recv_tp->udp.uh_dport;
+    
+    daddr.sin_addr = spt->client_ip;
+    daddr.sin_port = spt->client_port;
+
+    m->m_len = sizeof(struct tftp_t) - 514 + n - 
+        sizeof(struct ip) - sizeof(struct udphdr);
+    udp_output2(NULL, m, &saddr, &daddr, IPTOS_LOWDELAY);
+
+    return 0;
+}
+
+
+
 static int tftp_send_error(struct tftp_session *spt, 
 			   u_int16_t errorcode, const char *msg,
 			   struct tftp_t *recv_tp)
@@ -273,6 +312,8 @@ static void tftp_handle_rrq(struct tftp_
       return;
   }
 
+  k += 6;/* skipping octet*/
+
   /* do sanity checks on the filename */
 
   if ((spt->filename[0] != '/')
@@ -297,6 +338,48 @@ static void tftp_handle_rrq(struct tftp_
       return;
   }
 
+  if (src[n - 1] != 0) {
+      tftp_send_error(spt, 2, "Access violation", tp);
+      return;
+  }
+
+  while (k < n) {
+      const char *key, *value;
+
+      key = src + k;
+      k += strlen(key) + 1;
+
+      if (k >= n) {
+	  tftp_send_error(spt, 2, "Access violation", tp);
+	  return;
+      }
+
+      value = src + k;
+      k += strlen(value) + 1;
+
+      if (strcmp(key, "tsize") == 0) {
+	  int tsize = atoi(value);
+	  struct stat stat_p;
+
+	  if (tsize == 0 && tftp_prefix) {
+	      char buffer[1024];
+	      int len;
+
+	      len = snprintf(buffer, sizeof(buffer), "%s/%s",
+			     tftp_prefix, spt->filename);
+
+	      if (stat(buffer, &stat_p) == 0)
+		  tsize = stat_p.st_size;
+	      else {
+		  tftp_send_error(spt, 1, "File not found", tp);
+		  return;
+	      }
+	  }
+
+	  tftp_send_oack(spt, "tsize", tsize, tp);
+      }
+  }
+
   tftp_send_data(spt, 1, tp);
 }
 
diff -r 153828edbad3 slirp/tftp.h
--- a/slirp/tftp.h	Thu Feb 15 16:37:56 2007 -0600
+++ b/slirp/tftp.h	Thu Feb 15 16:37:57 2007 -0600
@@ -9,6 +9,7 @@
 #define TFTP_DATA   3
 #define TFTP_ACK    4
 #define TFTP_ERROR  5
+#define TFTP_OACK   6
 
 #define TFTP_FILENAME_MAX 512
 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 2/3] Add -bootp option for slip
  2007-02-18  0:56 [Qemu-devel] [PATCH 0/3] Make BOOTP work with slirp Anthony Liguori
  2007-02-18  1:01 ` [Qemu-devel] [PATCH 1/3] Add OACK support to slirp TFTP server Anthony Liguori
@ 2007-02-18  1:04 ` Anthony Liguori
  2007-02-18  1:07 ` [Qemu-devel] [PATCH 3/3] Change -tftp option to take a root directory Anthony Liguori
  2007-02-18 11:29 ` [Qemu-devel] Re: [PATCH 0/3] Make BOOTP work with slirp Erwan Velu
  3 siblings, 0 replies; 5+ messages in thread
From: Anthony Liguori @ 2007-02-18  1:04 UTC (permalink / raw)
  To: qemu-devel; +Cc: Erwan Velu

[-- Attachment #1: Type: text/plain, Size: 147 bytes --]

The following patch adds a -bootp option.  This option takes a filename 
that will be advertised as the BOOTP filename.

Regards,

Anthony Liguori

[-- Attachment #2: slirp-bootp.diff --]
[-- Type: text/x-patch, Size: 2981 bytes --]

diff -r ea5eb79ade8d slirp/bootp.c
--- a/slirp/bootp.c	Thu Feb 15 16:49:28 2007 -0600
+++ b/slirp/bootp.c	Thu Feb 15 16:49:30 2007 -0600
@@ -38,6 +38,8 @@ typedef struct {
 
 BOOTPClient bootp_clients[NB_ADDR];
 
+const char *bootp_filename;
+
 static const uint8_t rfc1533_cookie[] = { RFC1533_COOKIE };
 
 #ifdef DEBUG
@@ -168,6 +170,10 @@ static void bootp_reply(struct bootp_t *
             goto new_addr;
         }
     }
+
+    if (bootp_filename)
+        snprintf(rbp->bp_file, sizeof(rbp->bp_file), "%s", bootp_filename);
+
     dprintf("offered addr=%08x\n", ntohl(daddr.sin_addr.s_addr));
 
     saddr.sin_addr.s_addr = htonl(ntohl(special_addr.s_addr) | CTL_ALIAS);
diff -r ea5eb79ade8d vl.c
--- a/vl.c	Thu Feb 15 16:49:28 2007 -0600
+++ b/vl.c	Thu Feb 15 16:57:07 2007 -0600
@@ -6488,6 +6488,7 @@ void help(void)
            "\n"
 #ifdef CONFIG_SLIRP
            "-tftp prefix    allow tftp access to files starting with prefix [-net user]\n"
+           "-bootp file     advertise file in BOOTP replies\n"
 #ifndef _WIN32
            "-smb dir        allow SMB access to files in 'dir' [-net user]\n"
 #endif
@@ -6576,6 +6577,7 @@ enum {
 
     QEMU_OPTION_net,
     QEMU_OPTION_tftp,
+    QEMU_OPTION_bootp,
     QEMU_OPTION_smb,
     QEMU_OPTION_redir,
 
@@ -6652,6 +6654,7 @@ const QEMUOption qemu_options[] = {
     { "net", HAS_ARG, QEMU_OPTION_net},
 #ifdef CONFIG_SLIRP
     { "tftp", HAS_ARG, QEMU_OPTION_tftp },
+    { "bootp", HAS_ARG, QEMU_OPTION_bootp },
 #ifndef _WIN32
     { "smb", HAS_ARG, QEMU_OPTION_smb },
 #endif
@@ -7185,6 +7188,9 @@ int main(int argc, char **argv)
             case QEMU_OPTION_tftp:
 		tftp_prefix = optarg;
                 break;
+            case QEMU_OPTION_bootp:
+                bootp_filename = optarg;
+                break;
 #ifndef _WIN32
             case QEMU_OPTION_smb:
 		net_slirp_smb(optarg);
diff -r ea5eb79ade8d vl.h
--- a/vl.h	Thu Feb 15 16:49:28 2007 -0600
+++ b/vl.h	Thu Feb 15 16:49:30 2007 -0600
@@ -163,6 +163,7 @@ extern int no_quit;
 extern int no_quit;
 extern int semihosting_enabled;
 extern int autostart;
+extern const char *bootp_filename;
 
 #define MAX_OPTION_ROMS 16
 extern const char *option_rom[MAX_OPTION_ROMS];
diff -r ea5eb79ade8d qemu-doc.texi
--- a/qemu-doc.texi	Thu Feb 15 16:49:28 2007 -0600
+++ b/qemu-doc.texi	Thu Feb 15 16:57:23 2007 -0600
@@ -445,6 +445,16 @@ guest must be configured in binary mode 
 guest must be configured in binary mode (use the command @code{bin} of
 the Unix TFTP client). The host IP address on the guest is as usual
 10.0.2.2.
+
+@item -bootp file
+When using the user mode network stack, broadcast @var{file} as the BOOTP
+filename.  In conjunction with @option{-tftp}, this can be used to network boot
+a guest from a local directory.
+
+Example (using pxelinux):
+@example
+qemu -hda linux.img -boot n -tftp /path/to/tftp/files -bootp /pxelinux.0
+@end example
 
 @item -smb dir
 When using the user mode network stack, activate a built-in SMB

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 3/3] Change -tftp option to take a root directory
  2007-02-18  0:56 [Qemu-devel] [PATCH 0/3] Make BOOTP work with slirp Anthony Liguori
  2007-02-18  1:01 ` [Qemu-devel] [PATCH 1/3] Add OACK support to slirp TFTP server Anthony Liguori
  2007-02-18  1:04 ` [Qemu-devel] [PATCH 2/3] Add -bootp option for slip Anthony Liguori
@ 2007-02-18  1:07 ` Anthony Liguori
  2007-02-18 11:29 ` [Qemu-devel] Re: [PATCH 0/3] Make BOOTP work with slirp Erwan Velu
  3 siblings, 0 replies; 5+ messages in thread
From: Anthony Liguori @ 2007-02-18  1:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: Erwan Velu

[-- Attachment #1: Type: text/plain, Size: 542 bytes --]

This patch changes the -tftp option to take a root directory instead of 
a prefix.  I know it's common for a TFTP server to take a prefix but 
it's easier typing wise to expose files as being part of a root.  For 
example, without this patch, to PXE boot:

qemu -hda disk.img -tftp /home/anthony/tftpboot -bootp 
/home/anthony/tftpboot/pxelinux.0

With the patch:

qemu -hda disk.img -tftp /home/anthony/tftpboot -bootp /pxelinux.0

Also helps deal with the fact that TFTP filenames are limited to 512 
characters.

Regards,

Anthony Liguori

[-- Attachment #2: tftp-root.diff --]
[-- Type: text/x-patch, Size: 2500 bytes --]

diff -r 91f98dfbdc3f qemu-doc.texi
--- a/qemu-doc.texi	Thu Feb 15 21:22:02 2007 -0600
+++ b/qemu-doc.texi	Thu Feb 15 21:22:03 2007 -0600
@@ -438,13 +438,12 @@ override the default configuration (@opt
 override the default configuration (@option{-net nic -net user}) which
 is activated if no @option{-net} options are provided.
 
-@item -tftp prefix
+@item -tftp dir
 When using the user mode network stack, activate a built-in TFTP
-server. All filenames beginning with @var{prefix} can be downloaded
-from the host to the guest using a TFTP client. The TFTP client on the
-guest must be configured in binary mode (use the command @code{bin} of
-the Unix TFTP client). The host IP address on the guest is as usual
-10.0.2.2.
+server. The files in @var{dir} will be exposed as the root of a TFTP server.
+The TFTP client on the guest must be configured in binary mode (use the command
+@code{bin} of the Unix TFTP client). The host IP address on the guest is as
+usual 10.0.2.2.
 
 @item -bootp file
 When using the user mode network stack, broadcast @var{file} as the BOOTP
diff -r 91f98dfbdc3f slirp/tftp.c
--- a/slirp/tftp.c	Thu Feb 15 21:22:02 2007 -0600
+++ b/slirp/tftp.c	Thu Feb 15 21:22:03 2007 -0600
@@ -102,8 +102,15 @@ static int tftp_read_data(struct tftp_se
 {
   int fd;
   int bytes_read = 0;
-
-  fd = open(spt->filename, O_RDONLY | O_BINARY);
+  char buffer[1024];
+  int n;
+
+  n = snprintf(buffer, sizeof(buffer), "%s/%s",
+	       tftp_prefix, spt->filename);
+  if (n >= sizeof(buffer))
+    return -1;
+
+  fd = open(buffer, O_RDONLY | O_BINARY);
 
   if (fd < 0) {
     return -1;
@@ -328,8 +335,7 @@ static void tftp_handle_rrq(struct tftp_
 
   /* only allow exported prefixes */
 
-  if (!tftp_prefix
-      || (strncmp(spt->filename, tftp_prefix, strlen(tftp_prefix)) != 0)) {
+  if (!tftp_prefix) {
       tftp_send_error(spt, 2, "Access violation", tp);
       return;
   }
diff -r 91f98dfbdc3f vl.c
--- a/vl.c	Thu Feb 15 21:22:02 2007 -0600
+++ b/vl.c	Thu Feb 15 21:22:03 2007 -0600
@@ -6487,7 +6487,7 @@ void help(void)
            "                is provided, the default is '-net nic -net user'\n"
            "\n"
 #ifdef CONFIG_SLIRP
-           "-tftp prefix    allow tftp access to files starting with prefix [-net user]\n"
+           "-tftp dir       allow tftp access to files in dir [-net user]\n"
            "-bootp file     advertise file in BOOTP replies\n"
 #ifndef _WIN32
            "-smb dir        allow SMB access to files in 'dir' [-net user]\n"

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] Re: [PATCH 0/3] Make BOOTP work with slirp
  2007-02-18  0:56 [Qemu-devel] [PATCH 0/3] Make BOOTP work with slirp Anthony Liguori
                   ` (2 preceding siblings ...)
  2007-02-18  1:07 ` [Qemu-devel] [PATCH 3/3] Change -tftp option to take a root directory Anthony Liguori
@ 2007-02-18 11:29 ` Erwan Velu
  3 siblings, 0 replies; 5+ messages in thread
From: Erwan Velu @ 2007-02-18 11:29 UTC (permalink / raw)
  To: Anthony Liguori; +Cc: qemu-devel

Anthony Liguori wrote:
> The following patch series allows for BOOTP to be used with slirp.  
> The original patch was written by Erwan Velu.
>
> With the full series, you can do:
>
> qemu -hda /path/to/disk.img -boot n -tftp ~/tftpdir -bootp /pxelinux.0
>
> And the guest will boot from ~/tftpdir/pxelinux.0.
>
> Regards,
>
> Anthony Liguori
One more time anthony, thanks for you work.
I really love to see this feature entering qemu.

Regards,
Erwan Velu

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2007-02-18 11:29 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-02-18  0:56 [Qemu-devel] [PATCH 0/3] Make BOOTP work with slirp Anthony Liguori
2007-02-18  1:01 ` [Qemu-devel] [PATCH 1/3] Add OACK support to slirp TFTP server Anthony Liguori
2007-02-18  1:04 ` [Qemu-devel] [PATCH 2/3] Add -bootp option for slip Anthony Liguori
2007-02-18  1:07 ` [Qemu-devel] [PATCH 3/3] Change -tftp option to take a root directory Anthony Liguori
2007-02-18 11:29 ` [Qemu-devel] Re: [PATCH 0/3] Make BOOTP work with slirp Erwan Velu

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).