📄 mss.c
字号:
/* * OpenVPN -- An application to securely tunnel IP networks * over a single TCP/UDP port, with support for SSL/TLS-based * session authentication and key exchange, * packet encryption, packet authentication, and * packet compression. * * Copyright (C) 2002-2004 James Yonan <jim@yonan.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING included with this * distribution); if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#ifdef WIN32#include "config-win32.h"#else#include "config.h"#endif#include "syshead.h"#include "error.h"#include "mss.h"#include "memdbg.h"/* * Lower MSS on TCP SYN packets to fix MTU * problems which arise from protocol * encapsulation. */voidmss_fixup (struct buffer *buf, int maxmss){ const struct openvpn_iphdr *pip; int hlen; if (BLEN (buf) < (int) sizeof (struct openvpn_iphdr)) return; pip = (struct openvpn_iphdr *) BPTR (buf); hlen = OPENVPN_IPH_GET_LEN (pip->version_len); if (pip->protocol == OPENVPN_IPPROTO_TCP && ntohs_as (&pip->tot_len) == BLEN (buf) && (ntohs_as (&pip->frag_off) & OPENVPN_IP_OFFMASK) == 0 && hlen <= BLEN (buf) && BLEN (buf) - hlen >= (int) sizeof (struct openvpn_tcphdr)) { struct buffer newbuf = *buf; if (buf_advance (&newbuf, hlen)) { struct openvpn_tcphdr *tc = (struct openvpn_tcphdr *) BPTR (&newbuf); if (tc->flags & OPENVPN_TCPH_SYN_MASK) mss_fixup_dowork (&newbuf, (uint16_t) maxmss); } }}voidmss_fixup_dowork (struct buffer *buf, uint16_t maxmss){ int hlen, olen, optlen; uint8_t *opt; uint16_t *mss; int accumulate; struct openvpn_tcphdr *tc; ASSERT (BLEN (buf) >= (int) sizeof (struct openvpn_tcphdr)); tc = (struct openvpn_tcphdr *) BPTR (buf); hlen = OPENVPN_TCPH_GET_DOFF (tc->doff_res); /* Invalid header length or header without options. */ if (hlen <= (int) sizeof (struct openvpn_tcphdr) || hlen > BLEN (buf)) return; for (olen = hlen - sizeof (struct openvpn_tcphdr), opt = (uint8_t *)(tc + 1); olen > 0; olen -= optlen, opt += optlen) { if (*opt == OPENVPN_TCPOPT_EOL) break; else if (*opt == OPENVPN_TCPOPT_NOP) optlen = 1; else { optlen = *(opt + 1); if (optlen <= 0 || optlen > olen) break; if (*opt == OPENVPN_TCPOPT_MAXSEG) { if (optlen != OPENVPN_TCPOLEN_MAXSEG) continue; mss = (uint16_t *)(opt + 2); if (ntohs_as (mss) > maxmss) { msg (D_MSS, "MSS: %d -> %d", (int) ntohs_as (mss), (int) maxmss); accumulate = get_u16_as (mss); htons_as (mss, maxmss); accumulate -= get_u16_as (mss); ADJUST_CHECKSUM (accumulate, tc->check); } } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -