All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.