+static u_short packetAliasMSS;
+
+void PacketAliasClampMSS(u_short mss)
+{
+ packetAliasMSS = mss;
+}
+
+static void DoMSSClamp(struct tcphdr *tc)
+{
+ u_char *option = (u_char *) tc + sizeof(*tc);
+ u_char *optionEnd = option + ((tc->th_off << 2) - sizeof(*tc));
+
+ while (optionEnd > option)
+ {
+ switch (option[0])
+ {
+ case TCPOPT_EOL:
+ option = optionEnd;
+ break;
+
+ case TCPOPT_NOP:
+ ++option;
+ break;
+
+ case TCPOPT_MAXSEG:
+ if (option[1] == 4)
+ {
+ u_short *mssPtr = (u_short *) option + 1;
+ u_short mssVal = ntohs(*mssPtr);
+
+ if (packetAliasMSS < mssVal)
+ {
+ int accumulate = mssVal;
+ accumulate -= packetAliasMSS;
+ *mssPtr = htons(packetAliasMSS);
+ ADJUST_CHECKSUM(accumulate, tc->th_sum);
+ }
+
+ option = optionEnd;
+ }
+ break;
+
+ default:
+ option += option[1];
+ break;
+ }
+ }
+}
+