Add missing patches
This commit is contained in:
parent
027a024fae
commit
5929173eaf
98
0002-Use-spec-compliant-timeouts.patch
Normal file
98
0002-Use-spec-compliant-timeouts.patch
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
From bc252caa54fcfb2e9fd0ddb01ebaa50192e85c38 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Alex Williamson <alex.williamson@redhat.com>
|
||||||
|
Date: Wed, 21 Oct 2015 11:18:40 +0200
|
||||||
|
Subject: Use spec compliant timeouts
|
||||||
|
|
||||||
|
Message-id: <20150428212403.31299.29391.stgit@gimli.home>
|
||||||
|
Patchwork-id: 64951
|
||||||
|
O-Subject: [RHEL7.2 ipxe PATCH 2/2] [dhcp][RHEL-only] Use spec compliant timeouts
|
||||||
|
Bugzilla: 1196352
|
||||||
|
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||||
|
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||||
|
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
||||||
|
|
||||||
|
Use local config to override iPXE's abbreviated DHCP timeouts using
|
||||||
|
the recommended values for spec compliance. This matches the state
|
||||||
|
of RHEL6 gPXE DHCP timeouts after bz968474 + bz1206042
|
||||||
|
|
||||||
|
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
|
||||||
|
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||||
|
(cherry picked from commit 7038f41c0131d263de5165b416500009acdbf550)
|
||||||
|
---
|
||||||
|
src/config/local/.gitignore | 1 -
|
||||||
|
src/config/local/dhcp.h | 62 +++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 62 insertions(+), 1 deletion(-)
|
||||||
|
delete mode 100644 src/config/local/.gitignore
|
||||||
|
create mode 100644 src/config/local/dhcp.h
|
||||||
|
|
||||||
|
diff --git a/src/config/local/dhcp.h b/src/config/local/dhcp.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..83df5b8
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/src/config/local/dhcp.h
|
||||||
|
@@ -0,0 +1,62 @@
|
||||||
|
+/*
|
||||||
|
+ * Downstream localization
|
||||||
|
+ *
|
||||||
|
+ * For RHEL, use spec compliant DHCP timeouts (bz1196352)
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * PXE spec defines timeouts of 4, 8, 16, 32 seconds
|
||||||
|
+ */
|
||||||
|
+#undef DHCP_DISC_START_TIMEOUT_SEC
|
||||||
|
+#define DHCP_DISC_START_TIMEOUT_SEC 4
|
||||||
|
+#undef DHCP_DISC_END_TIMEOUT_SEC
|
||||||
|
+#define DHCP_DISC_END_TIMEOUT_SEC 32
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Elapsed time used for early break waiting for ProxyDHCP, this therefore
|
||||||
|
+ * needs to be less than the cumulative time for the first 2 timeouts.
|
||||||
|
+ */
|
||||||
|
+#undef DHCP_DISC_PROXY_TIMEOUT_SEC
|
||||||
|
+#define DHCP_DISC_PROXY_TIMEOUT_SEC 11
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Approximate PXE spec requirement using minimum timeout (0.25s) for
|
||||||
|
+ * timeouts of 0.25, 0.5, 1, 2, 4
|
||||||
|
+ */
|
||||||
|
+#undef DHCP_REQ_START_TIMEOUT_SEC
|
||||||
|
+#define DHCP_REQ_START_TIMEOUT_SEC 0
|
||||||
|
+#undef DHCP_REQ_END_TIMEOUT_SEC
|
||||||
|
+#define DHCP_REQ_END_TIMEOUT_SEC 4
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Same as normal request phase, except non-fatal, so we extend the timer
|
||||||
|
+ * to 8 and set the early timeout to an elapsed time value that causes a
|
||||||
|
+ * break after the 4 second timeout. At least that's what we'd like to do,
|
||||||
|
+ * but our timer operates at 18Hz and has a minimum resolution of 7 cycles.
|
||||||
|
+ * Therefore the above quarter-second starting timeout looks more like
|
||||||
|
+ * 0.39s, 0.78s, 1.56s, 3.11s, 6.22s. If we had an ideal timer, we could
|
||||||
|
+ * set the timeout to 7s (0.25 + 0.5 + 1 + 2 + 4 = 7.75s) and exit without
|
||||||
|
+ * failure when the timer rolls over to 8s. With our timer, we get 0.39 +
|
||||||
|
+ * 0.78 + 1.56 + 3.11 = 5.84s. The next timeout would take us to 12.06s
|
||||||
|
+ * (+6.22). That seems like a long time to wait for an optional reply, so
|
||||||
|
+ * we reduce the early timeout to 5s to exit before the timer exceeds the
|
||||||
|
+ * max and causes a failure. This still adds one extra cycle vs the
|
||||||
|
+ * upstream defaults.
|
||||||
|
+ */
|
||||||
|
+#undef DHCP_PROXY_START_TIMEOUT_SEC
|
||||||
|
+#define DHCP_PROXY_START_TIMEOUT_SEC 0
|
||||||
|
+#undef DHCP_PROXY_END_TIMEOUT_SEC
|
||||||
|
+#define DHCP_PROXY_END_TIMEOUT_SEC 8
|
||||||
|
+#undef DHCP_REQ_PROXY_TIMEOUT_SEC
|
||||||
|
+#define DHCP_REQ_PROXY_TIMEOUT_SEC 5
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Same as above, retry each server using our approximation of standard
|
||||||
|
+ * timeouts and exit before timer induced failure.
|
||||||
|
+ */
|
||||||
|
+#undef PXEBS_START_TIMEOUT_SEC
|
||||||
|
+#define PXEBS_START_TIMEOUT_SEC 0
|
||||||
|
+#undef PXEBS_END_TIMEOUT_SEC
|
||||||
|
+#define PXEBS_END_TIMEOUT_SEC 8
|
||||||
|
+#undef PXEBS_MAX_TIMEOUT_SEC
|
||||||
|
+#define PXEBS_MAX_TIMEOUT_SEC 5
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
150
0003-Strip-802.1Q-VLAN-0-priority-tags.patch
Normal file
150
0003-Strip-802.1Q-VLAN-0-priority-tags.patch
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
From 1a921ececb22bbc41d1fda34576564e84d124a83 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ladi Prosek <lprosek@redhat.com>
|
||||||
|
Date: Mon, 11 Jul 2016 14:17:36 +0200
|
||||||
|
Subject: Strip 802.1Q VLAN 0 priority tags
|
||||||
|
|
||||||
|
RH-Author: Ladi Prosek <lprosek@redhat.com>
|
||||||
|
Message-id: <1468246656-15560-1-git-send-email-lprosek@redhat.com>
|
||||||
|
Patchwork-id: 71112
|
||||||
|
O-Subject: [RHEL7.3 ipxe PATCH] [netdevice] Strip 802.Q VLAN 0 priority tags
|
||||||
|
Bugzilla: 1316329
|
||||||
|
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
||||||
|
RH-Acked-by: Xiao Wang <jasowang@redhat.com>
|
||||||
|
|
||||||
|
iPXE was unable to receive priority tagged packets specified in
|
||||||
|
the 802.1Q standard and supported by all major networking stacks.
|
||||||
|
|
||||||
|
This commit adds a new function net_pull_tags which is called by
|
||||||
|
all consumers of incoming packets after stripping their link-layer
|
||||||
|
headers.
|
||||||
|
|
||||||
|
Upstream patch:
|
||||||
|
http://lists.ipxe.org/pipermail/ipxe-devel/2016-July/005099.html
|
||||||
|
|
||||||
|
There is a difference between the upstream patch and this patch in the
|
||||||
|
path prefix of "interface/pxe/pxe_undi.c" because we don't have upstream
|
||||||
|
commit f468f12b1eca.
|
||||||
|
|
||||||
|
Signed-off-by: Ladi Prosek <lprosek@redhat.com>
|
||||||
|
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||||
|
---
|
||||||
|
src/arch/x86/interface/pxe/pxe_undi.c | 6 +++++
|
||||||
|
src/include/ipxe/netdevice.h | 2 ++
|
||||||
|
src/interface/efi/efi_snp.c | 7 ++++++
|
||||||
|
src/net/netdevice.c | 44 +++++++++++++++++++++++++++++++++++
|
||||||
|
4 files changed, 59 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/arch/x86/interface/pxe/pxe_undi.c b/src/arch/x86/interface/pxe/pxe_undi.c
|
||||||
|
index 2eb6817..2ea1451 100644
|
||||||
|
--- a/src/arch/x86/interface/pxe/pxe_undi.c
|
||||||
|
+++ b/src/arch/x86/interface/pxe/pxe_undi.c
|
||||||
|
@@ -976,6 +976,12 @@ static PXENV_EXIT_t pxenv_undi_isr ( struct s_PXENV_UNDI_ISR *undi_isr ) {
|
||||||
|
}
|
||||||
|
ll_hlen = ( len - iob_len ( iobuf ) );
|
||||||
|
|
||||||
|
+ /* Strip link-layer-independent headers */
|
||||||
|
+ if ( ( rc = net_pull_tags ( iobuf, pxe_netdev, &net_proto ) ) != 0 ) {
|
||||||
|
+ /* Assume unknown net_proto */
|
||||||
|
+ net_proto = 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Determine network-layer protocol */
|
||||||
|
switch ( net_proto ) {
|
||||||
|
case htons ( ETH_P_IP ):
|
||||||
|
diff --git a/src/include/ipxe/netdevice.h b/src/include/ipxe/netdevice.h
|
||||||
|
index a1d207f..cea87f7 100644
|
||||||
|
--- a/src/include/ipxe/netdevice.h
|
||||||
|
+++ b/src/include/ipxe/netdevice.h
|
||||||
|
@@ -719,6 +719,8 @@ extern int net_tx ( struct io_buffer *iobuf, struct net_device *netdev,
|
||||||
|
extern int net_rx ( struct io_buffer *iobuf, struct net_device *netdev,
|
||||||
|
uint16_t net_proto, const void *ll_dest,
|
||||||
|
const void *ll_source, unsigned int flags );
|
||||||
|
+extern int net_pull_tags ( struct io_buffer *iobuf, struct net_device *netdev,
|
||||||
|
+ uint16_t *net_proto );
|
||||||
|
extern void net_poll ( void );
|
||||||
|
extern struct net_device_configurator *
|
||||||
|
find_netdev_configurator ( const char *name );
|
||||||
|
diff --git a/src/interface/efi/efi_snp.c b/src/interface/efi/efi_snp.c
|
||||||
|
index e6388bf..d1a1a44 100644
|
||||||
|
--- a/src/interface/efi/efi_snp.c
|
||||||
|
+++ b/src/interface/efi/efi_snp.c
|
||||||
|
@@ -745,6 +745,13 @@ efi_snp_receive ( EFI_SIMPLE_NETWORK_PROTOCOL *snp,
|
||||||
|
goto out_bad_ll_header;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* Strip link-layer-independent headers */
|
||||||
|
+ if ( ( rc = net_pull_tags ( iobuf, snpdev->netdev, &iob_net_proto ) ) ) {
|
||||||
|
+ DBGC ( snpdev, "SNPDEV %p could not parse tags: %s\n",
|
||||||
|
+ snpdev, strerror ( rc ) );
|
||||||
|
+ goto out_bad_ll_header;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Return link-layer header parameters to caller, if required */
|
||||||
|
if ( ll_header_len )
|
||||||
|
*ll_header_len = ll_protocol->ll_header_len;
|
||||||
|
diff --git a/src/net/netdevice.c b/src/net/netdevice.c
|
||||||
|
index 9df2119..c53d5e3 100644
|
||||||
|
--- a/src/net/netdevice.c
|
||||||
|
+++ b/src/net/netdevice.c
|
||||||
|
@@ -1028,6 +1028,44 @@ int net_rx ( struct io_buffer *iobuf, struct net_device *netdev,
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
+ * Strip extra link-layer-independent tags from a received packet
|
||||||
|
+ *
|
||||||
|
+ * @v iobuf I/O buffer
|
||||||
|
+ * @v netdev Network device
|
||||||
|
+ * @v net_proto Network-layer protocol, in network-byte order
|
||||||
|
+ * @ret rc Return status code
|
||||||
|
+ *
|
||||||
|
+ * This function should be called after stripping link-layer headers but
|
||||||
|
+ * before inspecting the network-layer protocol.
|
||||||
|
+ */
|
||||||
|
+int net_pull_tags ( struct io_buffer *iobuf, struct net_device *netdev,
|
||||||
|
+ uint16_t *net_proto ) {
|
||||||
|
+ struct vlan_header *vlanhdr;
|
||||||
|
+ uint16_t tag;
|
||||||
|
+
|
||||||
|
+ /* Strip 802.1Q VLAN 0 priority tags if present */
|
||||||
|
+ while ( *net_proto == htons ( ETH_P_8021Q ) ) {
|
||||||
|
+ if ( iob_len ( iobuf ) < sizeof ( *vlanhdr ) ) {
|
||||||
|
+ DBG ( "VLAN header too short at %zd bytes (min %zd bytes)\n",
|
||||||
|
+ iob_len ( iobuf ), sizeof ( *vlanhdr ) );
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+ vlanhdr = ( struct vlan_header * ) iobuf->data;
|
||||||
|
+ tag = VLAN_TAG ( ntohs ( vlanhdr->tci ) );
|
||||||
|
+
|
||||||
|
+ if ( tag == 0 && ! vlan_find ( netdev, tag ) ) {
|
||||||
|
+ /* VLAN 0, strip and continue */
|
||||||
|
+ *net_proto = vlanhdr->net_proto;
|
||||||
|
+ iob_pull ( iobuf, sizeof ( *vlanhdr ) );
|
||||||
|
+ } else {
|
||||||
|
+ /* Real VLAN tag, leave it alone */
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
* Poll the network stack
|
||||||
|
*
|
||||||
|
* This polls all interfaces for received packets, and processes
|
||||||
|
@@ -1078,6 +1116,12 @@ void net_poll ( void ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* Remove link-layer-independent headers */
|
||||||
|
+ if ( ( rc = net_pull_tags ( iobuf, netdev, &net_proto ) ) ) {
|
||||||
|
+ free_iob ( iobuf );
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Hand packet to network layer */
|
||||||
|
if ( ( rc = net_rx ( iob_disown ( iobuf ), netdev,
|
||||||
|
net_proto, ll_dest,
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
Loading…
Reference in New Issue
Block a user