Module Name: src Committed By: maxv Date: Thu Jan 25 10:33:37 UTC 2018
Modified Files: src/sys/net: if_l2tp.c Log Message: style To generate a diff of this commit: cvs rdiff -u -r1.17 -r1.18 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.17 src/sys/net/if_l2tp.c:1.18 --- src/sys/net/if_l2tp.c:1.17 Tue Dec 19 03:32:35 2017 +++ src/sys/net/if_l2tp.c Thu Jan 25 10:33:37 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: if_l2tp.c,v 1.17 2017/12/19 03:32:35 ozaki-r Exp $ */ +/* $NetBSD: if_l2tp.c,v 1.18 2018/01/25 10:33:37 maxv 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.17 2017/12/19 03:32:35 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_l2tp.c,v 1.18 2018/01/25 10:33:37 maxv Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -496,18 +496,18 @@ l2tp_input(struct mbuf *m, struct ifnet M_COPY_PKTHDR(m_head, m); m_head->m_data += 2 /* align */ + L2TP_LINK_HDR_ROOM; - memcpy(m_head->m_data, m->m_data, copy_length); + memcpy(mtod(m_head, void *), mtod(m, void *), copy_length); m_head->m_len = copy_length; m->m_data += copy_length; m->m_len -= copy_length; /* construct chain */ if (m->m_len == 0) { - m_head->m_next = m_free(m); /* not m_freem */ + m_head->m_next = m_free(m); } else { /* - * copyed mtag in previous call M_COPY_PKTHDR - * but don't delete mtag in case cutt of M_PKTHDR flag + * Already copied mtag with M_COPY_PKTHDR. + * but don't delete mtag in case cut off M_PKTHDR flag */ m_tag_delete_chain(m, NULL); m->m_flags &= ~M_PKTHDR; @@ -1366,80 +1366,85 @@ static struct mbuf *l2tp_tcpmss6_clamp(s #endif struct mbuf * -l2tp_tcpmss_clamp(struct ifnet *ifp, struct mbuf *m) +l2tp_tcpmss_clamp(struct ifnet *ifp, struct mbuf *m) { + struct ether_header *eh; + struct ether_vlan_header evh; - if (l2tp_need_tcpmss_clamp(ifp)) { - struct ether_header *eh; - struct ether_vlan_header evh; - - /* save ether header */ - m_copydata(m, 0, sizeof(evh), (void *)&evh); - eh = (struct ether_header *)&evh; - - switch (ntohs(eh->ether_type)) { - case ETHERTYPE_VLAN: /* Ether + VLAN */ - if (m->m_pkthdr.len <= sizeof(struct ether_vlan_header)) - break; - m_adj(m, sizeof(struct ether_vlan_header)); - switch (ntohs(evh.evl_proto)) { -#ifdef INET - case ETHERTYPE_IP: /* Ether + VLAN + IPv4 */ - m = l2tp_tcpmss4_clamp(ifp, m); - if (m == NULL) - return NULL; - break; -#endif /* INET */ -#ifdef INET6 - case ETHERTYPE_IPV6: /* Ether + VLAN + IPv6 */ - m = l2tp_tcpmss6_clamp(ifp, m); - if (m == NULL) - return NULL; - break; -#endif /* INET6 */ - default: - break; - } - /* restore ether header */ - M_PREPEND(m, sizeof(struct ether_vlan_header), - M_DONTWAIT); - if (m == NULL) - return NULL; - *mtod(m, struct ether_vlan_header *) = evh; + if (!l2tp_need_tcpmss_clamp(ifp)) { + return m; + } + + /* save ether header */ + m_copydata(m, 0, sizeof(evh), (void *)&evh); + eh = (struct ether_header *)&evh; + + switch (ntohs(eh->ether_type)) { + case ETHERTYPE_VLAN: /* Ether + VLAN */ + if (m->m_pkthdr.len <= sizeof(struct ether_vlan_header)) break; + m_adj(m, sizeof(struct ether_vlan_header)); + switch (ntohs(evh.evl_proto)) { #ifdef INET - case ETHERTYPE_IP: /* Ether + IPv4 */ - if (m->m_pkthdr.len <= sizeof(struct ether_header)) - break; - m_adj(m, sizeof(struct ether_header)); + case ETHERTYPE_IP: /* Ether + VLAN + IPv4 */ m = l2tp_tcpmss4_clamp(ifp, m); if (m == NULL) return NULL; - /* restore ether header */ - M_PREPEND(m, sizeof(struct ether_header), M_DONTWAIT); - if (m == NULL) - return NULL; - *mtod(m, struct ether_header *) = *eh; break; #endif /* INET */ #ifdef INET6 - case ETHERTYPE_IPV6: /* Ether + IPv6 */ - if (m->m_pkthdr.len <= sizeof(struct ether_header)) - break; - m_adj(m, sizeof(struct ether_header)); + case ETHERTYPE_IPV6: /* Ether + VLAN + IPv6 */ m = l2tp_tcpmss6_clamp(ifp, m); if (m == NULL) return NULL; - /* restore ether header */ - M_PREPEND(m, sizeof(struct ether_header), M_DONTWAIT); - if (m == NULL) - return NULL; - *mtod(m, struct ether_header *) = *eh; break; #endif /* INET6 */ default: break; } + + /* restore ether header */ + M_PREPEND(m, sizeof(struct ether_vlan_header), + M_DONTWAIT); + if (m == NULL) + return NULL; + *mtod(m, struct ether_vlan_header *) = evh; + break; + +#ifdef INET + case ETHERTYPE_IP: /* Ether + IPv4 */ + if (m->m_pkthdr.len <= sizeof(struct ether_header)) + break; + m_adj(m, sizeof(struct ether_header)); + m = l2tp_tcpmss4_clamp(ifp, m); + if (m == NULL) + return NULL; + /* restore ether header */ + M_PREPEND(m, sizeof(struct ether_header), M_DONTWAIT); + if (m == NULL) + return NULL; + *mtod(m, struct ether_header *) = *eh; + break; +#endif /* INET */ + +#ifdef INET6 + case ETHERTYPE_IPV6: /* Ether + IPv6 */ + if (m->m_pkthdr.len <= sizeof(struct ether_header)) + break; + m_adj(m, sizeof(struct ether_header)); + m = l2tp_tcpmss6_clamp(ifp, m); + if (m == NULL) + return NULL; + /* restore ether header */ + M_PREPEND(m, sizeof(struct ether_header), M_DONTWAIT); + if (m == NULL) + return NULL; + *mtod(m, struct ether_header *) = *eh; + break; +#endif /* INET6 */ + + default: + break; } return m; @@ -1453,12 +1458,12 @@ l2tp_need_tcpmss_clamp(struct ifnet *ifp #ifdef INET if (ifp->if_tcpmss != 0) ret = 1; -#endif /* INET */ +#endif #ifdef INET6 if (ifp->if_tcpmss6 != 0) ret = 1; -#endif /* INET6 */ +#endif return ret; }