From: Fam Zheng <famz@redhat.com>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, thuth@redhat.com,
Jan Kiszka <jan.kiszka@siemens.com>,
Jason Wang <jasowang@redhat.com>,
Markus Armbruster <armbru@redhat.com>,
Samuel Thibault <samuel.thibault@ens-lyon.org>,
brad@comstyle.com
Subject: Re: [Qemu-devel] [PATCH v3] slirp: Implement RFC2132 TFTP server name
Date: Mon, 27 Aug 2018 17:36:47 +0800 [thread overview]
Message-ID: <20180827093647.GE19413@lemon.usersys.redhat.com> (raw)
In-Reply-To: <20180827083645.12548-1-famz@redhat.com>
On Mon, 08/27 16:36, Fam Zheng wrote:
> This new usernet option can be used to add data for option 66 (tftp
> server name) in the BOOTP reply, which is useful in PXE based automatic
> OS install such as OpenBSD.
>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>
> v3: Add doc to qemu-options.hx. [Thomas]
>
> v2: - Adjust parameter order and field placement to be closer to other
> tftp options. [Samuel]
> - Drop 'optional'. [Eric]
> ---
> net/slirp.c | 5 ++++-
> qapi/net.json | 5 ++++-
> qemu-options.hx | 7 ++++++-
> slirp/bootp.c | 8 ++++++++
> slirp/bootp.h | 1 +
> slirp/libslirp.h | 4 +++-
> slirp/slirp.c | 5 ++++-
> slirp/slirp.h | 1 +
> 8 files changed, 31 insertions(+), 5 deletions(-)
>
> diff --git a/net/slirp.c b/net/slirp.c
> index 1e14318b4d..90ef09b40a 100644
> --- a/net/slirp.c
> +++ b/net/slirp.c
> @@ -158,6 +158,7 @@ static int net_slirp_init(NetClientState *peer, const char *model,
> const char *vnameserver, const char *vnameserver6,
> const char *smb_export, const char *vsmbserver,
> const char **dnssearch, const char *vdomainname,
> + const char *tftp_server_name,
> Error **errp)
> {
> /* default settings according to historic slirp */
> @@ -376,6 +377,7 @@ static int net_slirp_init(NetClientState *peer, const char *model,
>
> s->slirp = slirp_init(restricted, ipv4, net, mask, host,
> ipv6, ip6_prefix, vprefix6_len, ip6_host,
> + tftp_server_name,
Bug. tftp_server_name should go after vhostname.
Self-NACK
Fam
> vhostname, tftp_export, bootfile, dhcp,
> dns, ip6_dns, dnssearch, vdomainname, s);
> QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry);
> @@ -966,7 +968,8 @@ int net_init_slirp(const Netdev *netdev, const char *name,
> user->ipv6_host, user->hostname, user->tftp,
> user->bootfile, user->dhcpstart,
> user->dns, user->ipv6_dns, user->smb,
> - user->smbserver, dnssearch, user->domainname, errp);
> + user->smbserver, dnssearch, user->domainname,
> + user->tftp_server_name, errp);
>
> while (slirp_configs) {
> config = slirp_configs;
> diff --git a/qapi/net.json b/qapi/net.json
> index c86f351161..8f99fd911d 100644
> --- a/qapi/net.json
> +++ b/qapi/net.json
> @@ -174,6 +174,8 @@
> #
> # @guestfwd: forward guest TCP connections
> #
> +# @tftp-server-name: RFC2132 "TFTP server name" string (Since 3.1)
> +#
> # Since: 1.2
> ##
> { 'struct': 'NetdevUserOptions',
> @@ -198,7 +200,8 @@
> '*smb': 'str',
> '*smbserver': 'str',
> '*hostfwd': ['String'],
> - '*guestfwd': ['String'] } }
> + '*guestfwd': ['String'],
> + '*tftp-server-name': 'str' } }
>
> ##
> # @NetdevTapOptions:
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 5515dfaba5..6ddabd9b81 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -1885,7 +1885,7 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
> " [,ipv6[=on|off]][,ipv6-net=addr[/int]][,ipv6-host=addr]\n"
> " [,restrict=on|off][,hostname=host][,dhcpstart=addr]\n"
> " [,dns=addr][,ipv6-dns=addr][,dnssearch=domain][,domainname=domain]\n"
> - " [,tftp=dir][,bootfile=f][,hostfwd=rule][,guestfwd=rule]"
> + " [,tftp=dir][,tftp-server-name][,bootfile=f][,hostfwd=rule][,guestfwd=rule]"
> #ifndef _WIN32
> "[,smb=dir[,smbserver=addr]]\n"
> #endif
> @@ -2122,6 +2122,11 @@ 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).
>
> +@item tftp-server-name=@var{name}
> +In BOOTP reply, broadcast @var{name} as the "TFTP server name" (RFC2132 option
> +66). This can be used to advise the guest to load boot files or configurations
> +from a different server than the host address.
> +
> @item bootfile=@var{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
> diff --git a/slirp/bootp.c b/slirp/bootp.c
> index 9e7b53ba94..ed2cf3b96e 100644
> --- a/slirp/bootp.c
> +++ b/slirp/bootp.c
> @@ -306,6 +306,14 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp)
> q += val;
> }
>
> + if (slirp->tftp_server_name) {
> + val = strlen(slirp->tftp_server_name);
> + *q++ = RFC2132_TFTP_SERVER_NAME;
> + *q++ = val;
> + memcpy(q, slirp->tftp_server_name, val);
> + q += val;
> + }
> +
> if (slirp->vdnssearch) {
> size_t spaceleft = sizeof(rbp->bp_vend) - (q - rbp->bp_vend);
> val = slirp->vdnssearch_len;
> diff --git a/slirp/bootp.h b/slirp/bootp.h
> index 394525733e..4043489835 100644
> --- a/slirp/bootp.h
> +++ b/slirp/bootp.h
> @@ -70,6 +70,7 @@
> #define RFC2132_MAX_SIZE 57
> #define RFC2132_RENEWAL_TIME 58
> #define RFC2132_REBIND_TIME 59
> +#define RFC2132_TFTP_SERVER_NAME 66
>
> #define DHCPDISCOVER 1
> #define DHCPOFFER 2
> diff --git a/slirp/libslirp.h b/slirp/libslirp.h
> index 740408a96e..0e84ab9b52 100644
> --- a/slirp/libslirp.h
> +++ b/slirp/libslirp.h
> @@ -13,10 +13,12 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
> bool in6_enabled,
> struct in6_addr vprefix_addr6, uint8_t vprefix_len,
> struct in6_addr vhost6, const char *vhostname,
> + const char *tftp_server_name,
> const char *tftp_path, const char *bootfile,
> struct in_addr vdhcp_start, struct in_addr vnameserver,
> struct in6_addr vnameserver6, const char **vdnssearch,
> - const char *vdomainname, void *opaque);
> + const char *vdomainname,
> + void *opaque);
> void slirp_cleanup(Slirp *slirp);
>
> void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout);
> diff --git a/slirp/slirp.c b/slirp/slirp.c
> index 5c3bd6163f..4073b0174f 100644
> --- a/slirp/slirp.c
> +++ b/slirp/slirp.c
> @@ -283,10 +283,12 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
> bool in6_enabled,
> struct in6_addr vprefix_addr6, uint8_t vprefix_len,
> struct in6_addr vhost6, const char *vhostname,
> + const char *tftp_server_name,
> const char *tftp_path, const char *bootfile,
> struct in_addr vdhcp_start, struct in_addr vnameserver,
> struct in6_addr vnameserver6, const char **vdnssearch,
> - const char *vdomainname, void *opaque)
> + const char *vdomainname,
> + void *opaque)
> {
> Slirp *slirp = g_malloc0(sizeof(Slirp));
>
> @@ -321,6 +323,7 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
> slirp->vdhcp_startaddr = vdhcp_start;
> slirp->vnameserver_addr = vnameserver;
> slirp->vnameserver_addr6 = vnameserver6;
> + slirp->tftp_server_name = g_strdup(tftp_server_name);
>
> if (vdnssearch) {
> translate_dnssearch(slirp, vdnssearch);
> diff --git a/slirp/slirp.h b/slirp/slirp.h
> index 10b410898a..b80725a0d6 100644
> --- a/slirp/slirp.h
> +++ b/slirp/slirp.h
> @@ -212,6 +212,7 @@ struct Slirp {
> /* tftp states */
> char *tftp_prefix;
> struct tftp_session tftp_sessions[TFTP_SESSIONS_MAX];
> + char *tftp_server_name;
>
> ArpTable arp_table;
> NdpTable ndp_table;
> --
> 2.17.1
>
>
next prev parent reply other threads:[~2018-08-27 9:36 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-27 8:36 [Qemu-devel] [PATCH v3] slirp: Implement RFC2132 TFTP server name Fam Zheng
2018-08-27 9:36 ` Fam Zheng [this message]
2018-08-27 9:37 ` Thomas Huth
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=20180827093647.GE19413@lemon.usersys.redhat.com \
--to=famz@redhat.com \
--cc=armbru@redhat.com \
--cc=brad@comstyle.com \
--cc=jan.kiszka@siemens.com \
--cc=jasowang@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=samuel.thibault@ens-lyon.org \
--cc=thuth@redhat.com \
/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).