2020-09-30 17:17:25 +02:00

134 lines
3.2 KiB
C++

/*++
Copyright (c) 2000 Microsoft Corporation
net.cpp
Abstract:
Network stack integration code.
Revision History:
07-27-00 vadimg created
--*/
#include "precomp.h"
/***************************************************************************\
* PppDeleteProc
*
\***************************************************************************/
VOID PppDeleteProc(IfInfo *ifp)
{
while (!PktQIsEmpty(&ifp->sendq)) {
Packet* pkt = PktQRemoveHead(&ifp->sendq);
XnetCompletePacket(pkt, NETERR_CANCELLED);
}
SysFree(ifp);
}
/***************************************************************************\
* PppStartOutputProc
*
\***************************************************************************/
VOID PppStartOutputProc(IfInfo *ifp)
{
Packet *pkt;
PPP_PACKET *pSendPacket = GetSendPacket();
while (!PktQIsEmpty(&ifp->sendq)) {
pkt = IfDequeuePacket(ifp);
pSendPacket->Protocol[0] = 0x00;
pSendPacket->Protocol[1] = 0x21;
CopyMemory(pSendPacket->Data, pkt->data, pkt->datalen);
SendFrame(pkt->datalen + 2);
XnetCompletePacket(pkt, NO_ERROR);
}
}
/***************************************************************************\
* PppIoctlProc
*
* Arguments:
*
* ifp - Points to the interface structure
* ctlcode - Control code
* inbuf - Points to the input buffer
* inlen - Size of the input buffer
* outbuf - Points to the output buffer
* outlen - On entry, this contains the size of the output buffer
* On return, this is the actually number of output bytes
*
\***************************************************************************/
NTSTATUS
PppIoctlProc(
IfInfo* ifp,
INT ctlcode,
VOID* inbuf,
UINT inlen,
VOID* outbuf,
UINT* outlen
)
{
NTSTATUS status;
switch (ctlcode) {
case IFCTL_GET_DNSSERVERS:
if (!inbuf || !inlen || !outbuf || !outlen || *outlen < sizeof(IPADDR)) {
status = NETERR_PARAM;
} else {
//
// NOTE: we're using the inbuf to return the default domain name string.
// outbuf is used to return the default DNS server addresses.
//
*((CHAR*) inbuf) = 0;
*outlen = sizeof(IPADDR);
*((IPADDR*) outbuf) = gIp.IpAddrDns;
status = NETERR_OK;
}
break;
default:
status = NETERR_NOTIMPL;
break;
}
return status;
}
/***************************************************************************\
* InitNet
*
\***************************************************************************/
BOOL InitNet(VOID)
{
DbgPrint("PPP: setting IP and DNS\n");
gIp.ifp = (IfInfo*) SysAlloc0(sizeof(IfInfo), 'PPP0');
if (gIp.ifp == NULL) {
return FALSE;
}
gIp.ifp->refcount = 1;
gIp.ifp->ifname = "Dialup";
gIp.ifp->flags = IFFLAG_UP;
gIp.ifp->Delete = PppDeleteProc;
gIp.ifp->StartOutput = PppStartOutputProc;
gIp.ifp->Ioctl = PppIoctlProc;
IfSetIpAddr(gIp.ifp, gIp.IpAddrLocal, 0);
return TRUE;
}