Why Socket is not Connecting only for USB adapter ?

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 ?

  1. Should i add PPP properties ?

  2. Any RAW IP problem ?

  3. any RAW socket problem ?

This adapter support both IPV4 and IPV6 . any idea ?