229 lines
5.8 KiB
C
229 lines
5.8 KiB
C
//#include <ntddk.h>
|
|
#include <ndis.h>
|
|
//#include <ndismini.h>
|
|
#include <ndiswan.h>
|
|
//#include <ntddndis.h>
|
|
#include <stdio.h>
|
|
#include <mytypes.h>
|
|
#include <mydefs.h>
|
|
#include <disp.h>
|
|
#include <adapter.h>
|
|
#include <util.h>
|
|
#include <idd.h>
|
|
#include <mtl.h>
|
|
#include <cm.h>
|
|
#include <res.h>
|
|
#include <trc.h>
|
|
#include <io.h>
|
|
|
|
|
|
//
|
|
// Wan OID's
|
|
//
|
|
static UINT SupportedWanOids[] =
|
|
{
|
|
OID_WAN_PERMANENT_ADDRESS,
|
|
OID_WAN_CURRENT_ADDRESS,
|
|
OID_WAN_QUALITY_OF_SERVICE,
|
|
OID_WAN_PROTOCOL_TYPE,
|
|
OID_WAN_MEDIUM_SUBTYPE,
|
|
OID_WAN_HEADER_FORMAT,
|
|
OID_WAN_GET_INFO,
|
|
OID_WAN_SET_LINK_INFO,
|
|
OID_WAN_GET_LINK_INFO,
|
|
OID_WAN_GET_COMP_INFO,
|
|
OID_WAN_SET_COMP_INFO,
|
|
};
|
|
|
|
#define MAX_SUPPORTED_WAN_OIDS 11
|
|
|
|
|
|
|
|
|
|
NDIS_STATUS
|
|
WanOidProc(
|
|
NDIS_HANDLE AdapterContext,
|
|
NDIS_OID Oid,
|
|
PVOID InfoBuffer,
|
|
ULONG InfoBufferLen,
|
|
PULONG BytesReadWritten,
|
|
PULONG BytesNeeded
|
|
)
|
|
{
|
|
NDIS_WAN_MEDIUM_SUBTYPE Medium = NdisWanMediumIsdn;
|
|
NDIS_WAN_HEADER_FORMAT HeaderFormat = NdisWanHeaderNative;
|
|
NDIS_WAN_QUALITY WanQuality = NdisWanReliable;
|
|
ADAPTER *Adapter = (ADAPTER*)AdapterContext;
|
|
PNDIS_WAN_INFO pWanInfo;
|
|
PNDIS_WAN_SET_LINK_INFO pLinkSetInfo;
|
|
PNDIS_WAN_GET_LINK_INFO pLinkGetInfo;
|
|
NDIS_PHYSICAL_ADDRESS HighestAcceptableMax = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);
|
|
MTL* mtl;
|
|
CM* cm;
|
|
ULONG n, NumIddPerAdapter;
|
|
|
|
switch (Oid)
|
|
{
|
|
case OID_WAN_PERMANENT_ADDRESS:
|
|
case OID_WAN_CURRENT_ADDRESS:
|
|
if (InfoBufferLen < 6)
|
|
{
|
|
*BytesNeeded = 6;
|
|
return(NDIS_STATUS_INVALID_LENGTH);
|
|
}
|
|
|
|
cm = (CM*)Adapter->CmTbl[0];
|
|
|
|
NdisMoveMemory(InfoBuffer,
|
|
(PVOID)cm->SrcAddr,
|
|
6);
|
|
|
|
*BytesNeeded = 0;
|
|
*BytesReadWritten = 6;
|
|
break;
|
|
|
|
case OID_WAN_QUALITY_OF_SERVICE:
|
|
NdisMoveMemory(InfoBuffer,
|
|
(PVOID)(&WanQuality),
|
|
sizeof(NDIS_WAN_QUALITY));
|
|
*BytesNeeded = 0;
|
|
*BytesReadWritten = sizeof(NDIS_WAN_QUALITY);
|
|
break;
|
|
|
|
case OID_WAN_PROTOCOL_TYPE:
|
|
break;
|
|
|
|
case OID_WAN_MEDIUM_SUBTYPE:
|
|
NdisMoveMemory(InfoBuffer,
|
|
(PVOID)(&Medium),
|
|
sizeof(NDIS_WAN_MEDIUM_SUBTYPE));
|
|
*BytesNeeded = 0;
|
|
*BytesReadWritten = sizeof(NDIS_WAN_MEDIUM_SUBTYPE);
|
|
break;
|
|
|
|
case OID_WAN_HEADER_FORMAT:
|
|
NdisMoveMemory(InfoBuffer,
|
|
(PVOID)(&HeaderFormat),
|
|
sizeof(NDIS_WAN_HEADER_FORMAT));
|
|
*BytesNeeded = 0;
|
|
*BytesReadWritten = sizeof(NDIS_WAN_HEADER_FORMAT);
|
|
break;
|
|
|
|
case OID_WAN_GET_INFO:
|
|
pWanInfo = (PNDIS_WAN_INFO)InfoBuffer;
|
|
|
|
NumIddPerAdapter = EnumIddPerAdapter(Adapter);
|
|
pWanInfo->Endpoints = 2 * NumIddPerAdapter;
|
|
pWanInfo->MemoryFlags = 0;
|
|
pWanInfo->HighestAcceptableAddress = HighestAcceptableMax;
|
|
pWanInfo->MaxTransmit = MAX_WANPACKET_XMITS;
|
|
pWanInfo->MaxFrameSize = MAX_WANPACKET_BUFFERSIZE;
|
|
pWanInfo->HeaderPadding = MAX_WANPACKET_HEADERPADDING;
|
|
pWanInfo->TailPadding = MAX_WANPACKET_TAILPADDING;
|
|
pWanInfo->FramingBits = RAS_FRAMING |
|
|
PPP_FRAMING |
|
|
PPP_COMPRESS_PROTOCOL_FIELD |
|
|
MEDIA_NRZ_ENCODING |
|
|
TAPI_PROVIDER;
|
|
pWanInfo->DesiredACCM = 0;
|
|
*BytesNeeded = 0;
|
|
*BytesReadWritten = sizeof(NDIS_WAN_INFO);
|
|
break;
|
|
|
|
case OID_WAN_SET_LINK_INFO:
|
|
//
|
|
// get pointer to link set info
|
|
//
|
|
pLinkSetInfo = (PNDIS_WAN_SET_LINK_INFO)InfoBuffer;
|
|
|
|
//
|
|
// get mtl (Link Context)
|
|
//
|
|
mtl = (MTL*)pLinkSetInfo->NdisLinkHandle;
|
|
|
|
if (!mtl->is_conn)
|
|
return (NDIS_STATUS_INVALID_DATA);
|
|
|
|
mtl->MaxSendFrameSize = pLinkSetInfo->MaxSendFrameSize;
|
|
mtl->MaxRecvFrameSize = pLinkSetInfo->MaxRecvFrameSize;
|
|
if (pLinkSetInfo->SendFramingBits)
|
|
mtl->SendFramingBits = pLinkSetInfo->SendFramingBits;
|
|
mtl->RecvFramingBits = pLinkSetInfo->RecvFramingBits;
|
|
mtl->SendCompressionBits = pLinkSetInfo->SendCompressionBits;
|
|
mtl->RecvCompressionBits = pLinkSetInfo->RecvCompressionBits;
|
|
D_LOG(D_ALWAYS, ("SetLinkInfo: mtl: 0x%p",mtl));
|
|
D_LOG(D_ALWAYS, ("SendFramingBits: 0x%x", mtl->SendFramingBits));
|
|
D_LOG(D_ALWAYS, ("RecvFramingBits: 0x%x", mtl->RecvFramingBits));
|
|
*BytesNeeded = 0;
|
|
*BytesReadWritten = sizeof(NDIS_WAN_SET_LINK_INFO);
|
|
|
|
//
|
|
// get cm (connection context)
|
|
//
|
|
cm = (CM*)mtl->cm;
|
|
|
|
//
|
|
// if this connection was originally a PPP connection
|
|
// and now framing has been backed off to RAS we need to
|
|
// do some uus negotiation
|
|
//
|
|
if ((cm->ConnectionType == CM_PPP) &&
|
|
(mtl->SendFramingBits & RAS_FRAMING))
|
|
{
|
|
//
|
|
// set flag that will block transmits on this mtl
|
|
//
|
|
cm->PPPToDKF = 1;
|
|
|
|
//
|
|
// for all channels (better only be one but???) do uus
|
|
//
|
|
for (n = 0; n < cm->dprof.chan_num; n++)
|
|
{
|
|
cm->dprof.chan_tbl[n].ustate = CM_US_UUS_SEND;
|
|
cm__tx_uus_pkt(cm->dprof.chan_tbl + n, CM_ASSOC_RQ, 0);
|
|
}
|
|
mtl->IddTxFrameType = IDD_FRAME_DKF;
|
|
}
|
|
|
|
break;
|
|
|
|
case OID_WAN_GET_LINK_INFO:
|
|
//
|
|
// get pointer to link set info
|
|
//
|
|
pLinkGetInfo = (PNDIS_WAN_GET_LINK_INFO)InfoBuffer;
|
|
|
|
//
|
|
// get mtl (Link Context)
|
|
//
|
|
mtl = (MTL*)pLinkGetInfo->NdisLinkHandle;
|
|
|
|
if (!mtl->is_conn)
|
|
return (NDIS_STATUS_INVALID_DATA);
|
|
|
|
pLinkGetInfo->MaxSendFrameSize = mtl->MaxSendFrameSize;
|
|
pLinkGetInfo->MaxRecvFrameSize = mtl->MaxRecvFrameSize;
|
|
pLinkGetInfo->HeaderPadding = mtl->PreamblePadding;
|
|
pLinkGetInfo->TailPadding = mtl->PostamblePadding;
|
|
pLinkGetInfo->SendFramingBits = mtl->SendFramingBits;
|
|
pLinkGetInfo->RecvFramingBits = mtl->RecvFramingBits;
|
|
pLinkGetInfo->SendCompressionBits = mtl->SendCompressionBits;
|
|
pLinkGetInfo->RecvCompressionBits = mtl->RecvCompressionBits;
|
|
D_LOG(D_ALWAYS, ("GetLinkInfo: mtl: 0x%p",mtl));
|
|
D_LOG(D_ALWAYS, ("SendFramingBits: 0x%x", mtl->SendFramingBits));
|
|
D_LOG(D_ALWAYS, ("RecvFramingBits: 0x%x", mtl->RecvFramingBits));
|
|
*BytesNeeded = 0;
|
|
*BytesReadWritten = sizeof(NDIS_WAN_GET_LINK_INFO);
|
|
break;
|
|
|
|
case OID_WAN_GET_COMP_INFO:
|
|
case OID_WAN_SET_COMP_INFO:
|
|
return(NDIS_STATUS_INVALID_OID);
|
|
|
|
}
|
|
|
|
return(NDIS_STATUS_SUCCESS);
|
|
}
|
|
|