Hi all ,
I am working on NDIS 6.2 LWF driver VPN application . In my application i am binding my filter to all Network adapter . This VPN is connecting fine with Ethernet , Wifi interfaces .
Now i want to support this on Mobile broadband USB adapter . After changing INF and filter attach function of Filter driver i can bind the Mobile broadband adapter .
I added " ppip " on INF section and added NdisWirelessWan on Filter attach section .
Now i am trying to create a socket for communicate with adapter Interface with the VPN server . This is working for Wifi , Ethernet . But the problem is for Mobile Broadband USB dongle .
I got error here :
result = tfConnect(my_Socket , (struct sockaddr*) &aAddress, sizeof(struct sockaddr_in6));
My socket connection code here ::
FILTER_RECORD filterRecord;
struct sockaddr_storage aAddress;
int result = TM_ENOERROR;
u32_t status = ERROR_SUCCESS;
/*socket creation */
my_Socket = tfSocket(PF_INET6, SOCK_STREAM, IPPROTO_TCP);
if (my_Socket == TM_SOCKET_ERROR) {
goto exitConnect;
}
MZeroMemory(&filterRecord, sizeof(FILTER_RECORD));
filterRecord.nType = PF_TYPE_SYSTEM;
filterRecord.nDirection = PF_DIRECTION_IN;
filterRecord.nAction = PF_ACTION_FILTER;
filterRecord.nEthProto = IPV6_IS_IPV4_MAPPED_ADDRESS(*pDstIp) ? ETH_PROTO_IPV4 : ETH_PROTO_IPV6;
filterRecord.nIpProto = IP_PROTO_TCP;
IPV6_SET_IPV6_ADDRESS(filterRecord.aSrcIp, *pDstIp);
IPV6_IPV6_PREFIX_LENGTH_TO_IPV6_NET_MASK(128, filterRecord.aSrcIpMask);
IPV6_SET_IPV6_ADDRESS(filterRecord.aDstIp, *pSrcIp);
IPV6_IPV6_PREFIX_LENGTH_TO_IPV6_NET_MASK(128, filterRecord.aDstIpMask);
filterRecord.nSrcPort = nDstPort;
filterRecord.nDstPort = nSrcPort;
m_nFilterId = Filter::Add(&filterRecord);
MZeroMemory(&aAddress, sizeof(struct sockaddr_storage));
aAddress.ss_family = PF_INET6;
IPV6_SET_IPV6_ADDRESS(*((PIPV6_ADDRESS) &aAddress.addr.ipv6.sin6_addr), *SrcIp);
aAddress.addr.ipv6.sin6_scope_id = ScopeId;
aAddress.ss_port = SrcPort;
/* binding */
result = tfBind(my_Socket , (struct sockaddr*) &aAddress, sizeof(struct sockaddr_in6));
if (result == TM_SOCKET_ERROR) {
goto exitConnect;
}
result = tfSetsockopt(my_Socket , SOL_SOCKET, SO_BINDTODEVICE, szName, ISystem::StrLen(szName));
if (result == TM_SOCKET_ERROR) {
goto exitConnect;
}
nTimeout = m_nTimeout / 1000;
result = tfSetsockopt(my_Socket , IP_PROTOTCP, TCP_MAXRT, (const char*) &nTimeout, sizeof(nTimeout));
if (result == TM_SOCKET_ERROR) {
goto exitConnect;
}
// configuring TCP_KEEPALIVE scheme
nValue = TCP_KEEPALIVE_COUNT;
result = tfSetsockopt(my_Socket , IP_PROTOTCP, TM_TCP_KEEPALIVE_CNT, (const char*) &nValue, sizeof(nValue));
if (result == TM_SOCKET_ERROR) {
goto exitConnect;
}
nValue = TCP_KEEPALIVE_INTERVAL;
result = tfSetsockopt(my_Socket , IP_PROTOTCP, TM_TCP_KEEPALIVE_INTV, (const char*) &nValue, sizeof(nValue));
if (result == TM_SOCKET_ERROR) {
goto exitConnect;
}
nValue = TCP_KEEPALIVE_TIMEOUT;
result = tfSetsockopt(my_Socket, IP_PROTOTCP, TCP_KEEPALIVE, (const char*) &nValue, sizeof(nValue));
if (result == TM_SOCKET_ERROR) {
goto exitConnect;
}
nValue = 1;
result = tfSetsockopt(my_Socket , SOL_SOCKET, SO_KEEPALIVE, (const char*) &nValue, sizeof(nValue));
if (result == TM_SOCKET_ERROR) {
goto exitConnect;
}
nValue = 524288;
result = tfSetsockopt(my_Socket , SOL_SOCKET, SO_RCVBUF, (const char*) &nValue, sizeof(nValue));
if (result == TM_SOCKET_ERROR) {
goto exitConnect;
}
nValue = 524288;
result = tfSetsockopt(my_Socket , SOL_SOCKET, SO_SNDBUF, (const char*) &nValue, sizeof(nValue));
if (result == TM_SOCKET_ERROR) {
goto exitConnect;
}
MZeroMemory(&lingerOpts, sizeof(lingerOpts));
result = tfSetsockopt(my_Socket , SOL_SOCKET, SO_LINGER, (const char*) &lingerOpts, sizeof(lingerOpts));
if (result == TM_SOCKET_ERROR) {
goto exitConnect;
}
nValue = 1;
result = tfSetsockopt(my_Socket , IP_PROTOTCP, TCP_NODELAY, (const char*) &nValue, sizeof(nValue));
if (result == TM_SOCKET_ERROR) {
goto exitConnect;
}
result = tfBlockingState(my_Socket , TM_BLOCKING_ON);
if (result == TM_SOCKET_ERROR) {
goto exitConnect;
}
MZeroMemory(&aAddress, sizeof(struct sockaddr_storage));
aAddress.ss_family = PF_INET6;
IPV6_SET_IPV6_ADDRESS(*((PIPV6_ADDRESS) &aAddress.addr.ipv6.sin6_addr), *pDstIp);
aAddress.addr.ipv6.sin6_scope_id = nScopeId;
aAddress.ss_port = nDstPort;
result = tfConnect(my_Socket , (struct sockaddr*) &aAddress, sizeof(struct sockaddr_in6));
if (result == TM_SOCKET_ERROR) {
— /* GETTING ERROR HERE */ ----
goto exitConnect;
}
exitConnect:
if ((status != ERROR_SUCCESS) && (!m_fClosed)) {
Disconnect();
}
I don’t know why ?
1 . Is this related to NDIS problem ?
-
Should i add PPP properties ?
-
Any RAW IP problem ?
-
any RAW socket problem ?
This adapter support both IPV4 and IPV6 . any idea ?