SINT32 rutWan_getInterfaceMTU(char *ifname)
{
struct ifreq ifr;
int sockfd, err;
if( (sockfd = socket(PF_INET, SOCK_DGRAM, 0)) <= 0 )
{
return -1;
}
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
err = ioctl(sockfd, SIOCGIFMTU, (void*)&ifr);
close(sockfd);
if (err == -1)
{
return -1;
}
return ifr.ifr_mtu;
}
// 如何设置TCP MSS
void SetTCPMSSRules(const char *ifName)
{
char cmd[BUFLEN_128];
int mtu = 0;
if( (mtu = rutWan_getInterfaceMTU(ifName)) == -1 ) // 可以为MTU值
{
cmsLog_error("cannot get MTU information");
return;
}
/* setup TCP MSS option manipulation */
snprintf(cmd, sizeof(cmd),
"iptables -I FORWARD -o %s -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss %d", ifName, (mtu-40));
rut_doSystemAction("rut", cmd);
snprintf(cmd, sizeof(cmd),
"iptables -I FORWARD -i %s -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss %d", ifName, (mtu-40));
rut_doSystemAction("rut", cmd);
}