Module Name: src
Committed By: martin
Date: Wed Apr 11 14:15:45 UTC 2018
Advertising
Modified Files:
src/sys/net [netbsd-8]: if_l2tp.c
Log Message:
Pull up following revision(s) (requested by knakahara in ticket #730):
sys/net/if_l2tp.c: revision 1.22
sys/net/if_l2tp.c: revision 1.23
Improve comment. Pointed out by maxv@n.o, thanks.
Fix previous my mistake and odd unaligned case. Pointed out by maxv@n.o, thanks.
It must be rare case to be required this copy routine...
To generate a diff of this commit:
cvs rdiff -u -r1.11.2.6 -r1.11.2.7 src/sys/net/if_l2tp.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/net/if_l2tp.c
diff -u src/sys/net/if_l2tp.c:1.11.2.6 src/sys/net/if_l2tp.c:1.11.2.7
--- src/sys/net/if_l2tp.c:1.11.2.6 Mon Apr 9 13:40:20 2018
+++ src/sys/net/if_l2tp.c Wed Apr 11 14:15:45 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_l2tp.c,v 1.11.2.6 2018/04/09 13:40:20 bouyer Exp $ */
+/* $NetBSD: if_l2tp.c,v 1.11.2.7 2018/04/11 14:15:45 martin Exp $ */
/*
* Copyright (c) 2017 Internet Initiative Japan Inc.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_l2tp.c,v 1.11.2.6 2018/04/09 13:40:20 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_l2tp.c,v 1.11.2.7 2018/04/11 14:15:45 martin Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -477,11 +477,16 @@ l2tp_input(struct mbuf *m, struct ifnet
return;
}
+ /*
+ * If the head of the payload is not aligned, align it.
+ */
addr = mtod(m, vaddr_t);
- if ((addr & 0x03) == 0) {
+ if ((addr & 0x03) != 0x2) {
/* copy and align head of payload */
struct mbuf *m_head;
int copy_length;
+ u_int pad = roundup(sizeof(struct ether_header), 4)
+ - sizeof(struct ether_header);
#define L2TP_COPY_LENGTH 60
@@ -504,7 +509,19 @@ l2tp_input(struct mbuf *m, struct ifnet
}
M_COPY_PKTHDR(m_head, m);
- MH_ALIGN(m_head, L2TP_COPY_LENGTH);
+ /*
+ * m_head should be:
+ * L2TP_COPY_LENGTH
+ * <- + roundup(pad, 4) - pad ->
+ * +-------+--------+-----+--------------+-------------+
+ * | m_hdr | pkthdr | ... | ether header | payload |
+ * +-------+--------+-----+--------------+-------------+
+ * ^ ^
+ * m_data 4 byte aligned
+ */
+ MH_ALIGN(m_head, L2TP_COPY_LENGTH + roundup(pad, 4));
+ m_head->m_data += pad;
+
memcpy(mtod(m_head, void *), mtod(m, void *), copy_length);
m_head->m_len = copy_length;
m->m_data += copy_length;