TCPPB.c

#include    <Devices.h>
 
#include    <MacTCPCommonTypes.h>>
#include    <AddressXlation.h>
#include    <GetMyIPAddr.h>
#include    <TCPPB.h>
#include    <UDPPB.h>
 
#include    <TCP.h>
 
/*
********************************************************** PBControl Interface Procedures
*/
 
#pragma segment TCPPB
 
OSErr   _TCPInit()
{
 
    auto    ParamBlockRec       pb;
    auto    OSErr               osErr;
        
    pb.ioParam.ioCompletion     = 0; 
    pb.ioParam.ioNamePtr        = "\p.ipp"; 
    pb.ioParam.ioPermssn        = fsCurPerm;
    
    osErr = PBOpen(&pb, false);
    if (noErr == osErr) {
        gIPPDriverRefNum        = pb.ioParam.ioRefNum;
    }
        
    return osErr;
}
 
OSErr   _TCPGetIP(pb, ip, netMask, ioCompletion, async)
            struct IPParamBlock     *pb;
            ip_addr                 *ip;
            long                    *netMask;
            ProcPtr                 ioCompletion;
            Boolean                 async;
{
 
    auto    OSErr                   osErr;
    
    pb->ioCompletion                = ioCompletion;
    pb->ioCRefNum                   = gIPPDriverRefNum;
    pb->csCode                      = ipctlGetAddr;
        
    osErr = PBControl((ParmBlkPtr) pb, async);
    if (!async && (noErr == osErr)) {
        *ip                         = pb->ourAddress;
        *netMask                    = pb->ourNetMask;
    }
        
    return osErr;
}
 
 
OSErr   _TCPCreate(pb, stream, rcvBufPtr, rcvBufLen, aNotifyProc, userDataPtr, ioCompletion, async)
            TCPiopb                 *pb;
            StreamPtr               *stream;
            Ptr                     rcvBufPtr;
            long                    rcvBufLen;
            TCPNotifyProc           aNotifyProc;
            Ptr                     userDataPtr;
            TCPIOCompletionProc     ioCompletion;
            Boolean                 async;
{
 
    auto    OSErr                   osErr;
    
    pb->ioCompletion                    = ioCompletion;
    pb->ioCRefNum                       = gIPPDriverRefNum;
    pb->csCode                          = TCPCreate;
    
    pb->csParam.create.rcvBuff          = rcvBufPtr;    
    pb->csParam.create.rcvBuffLen       = rcvBufLen;    
    pb->csParam.create.notifyProc       = aNotifyProc;
    pb->csParam.create.userDataPtr      = userDataPtr;
    
    osErr = PBControl((ParmBlkPtr) pb, async);
    if (!async && (noErr == osErr)) {
        *stream                         = pb->tcpStream;
    }
        
    return osErr;
}
 
 
OSErr _TCPPassiveOpen (pb, stream, remoteIP, remotePort, localIP, localPort, userData, ioCompletion, async)
            TCPiopb                 *pb;
            StreamPtr               stream;
            ip_addr                 *remoteIP; 
            tcp_port                *remotePort; 
            ip_addr                 *localIP; 
            tcp_port                *localPort;
            Ptr                     userData;
            TCPIOCompletionProc     ioCompletion;
            Boolean                 async;
{
 
    auto    OSErr                   osErr;
    auto    short                   index;
    
    pb->ioCompletion                        = ioCompletion;
    pb->ioCRefNum                           = gIPPDriverRefNum;
    pb->csCode                              = TCPPassiveOpen;
    pb->tcpStream                           = stream;
    
    pb->csParam.open.ulpTimeoutValue        = 0;    
    pb->csParam.open.ulpTimeoutAction       = 1;    
    pb->csParam.open.validityFlags          = 0xC0; 
    pb->csParam.open.commandTimeoutValue    = 30;   
    pb->csParam.open.remoteHost             = *remoteIP;    
    pb->csParam.open.remotePort             = *remotePort;  
    pb->csParam.open.localHost              = 0;    
    pb->csParam.open.localPort              = *localPort;   
    pb->csParam.open.tosFlags               = 0;    
    pb->csParam.open.precedence             = 0;    
    pb->csParam.open.dontFrag               = 0;    
    pb->csParam.open.timeToLive             = 0;
    pb->csParam.open.security               = 0;    
    pb->csParam.open.optionCnt              = 0;
    for (index = 0; index < sizeof(pb->csParam.open.options); ++index)  
        pb->csParam.open.options[index]     = 0;    
    pb->csParam.open.userDataPtr            = userData;
    
    osErr = PBControl((ParmBlkPtr) pb, async);
    if (!async && (noErr == osErr)) {
        *remoteIP                           = pb->csParam.open.remoteHost;  
        *remotePort                         = pb->csParam.open.remotePort;  
        *localIP                            = pb->csParam.open.localHost;   
        *localPort                          = pb->csParam.open.localPort;
    }
 
    return osErr;
}
 
 
OSErr _TCPActiveOpen (pb, stream, remoteIP, remotePort, localIP, localPort, userData, ioCompletion, async)
            TCPiopb                 *pb;
            StreamPtr               stream;
            ip_addr                 remoteIP; 
            tcp_port                remotePort; 
            ip_addr                 *localIP; 
            tcp_port                *localPort;
            Ptr                     userData;
            TCPIOCompletionProc     ioCompletion;
            Boolean                 async;
{
 
    auto    OSErr                   osErr;
    auto    short                   index;
    
    pb->ioCompletion                        = ioCompletion;
    pb->ioCRefNum                           = gIPPDriverRefNum;
    pb->csCode                              = TCPActiveOpen;
    pb->tcpStream                           = stream;
    
    pb->csParam.open.ulpTimeoutValue        = 30;
    pb->csParam.open.ulpTimeoutAction       = 1;
    pb->csParam.open.validityFlags          = 0xC0; 
/*  pb->csParam.open.commandTimeoutValue    = 30;  not available with this csCode */
    pb->csParam.open.remoteHost             = remoteIP; 
    pb->csParam.open.remotePort             = remotePort;   
    pb->csParam.open.localHost              = 0;    
    pb->csParam.open.localPort              = *localPort;   
    pb->csParam.open.tosFlags               = 0;    
    pb->csParam.open.precedence             = 0;    
    pb->csParam.open.dontFrag               = 0;    
    pb->csParam.open.timeToLive             = 0;
    pb->csParam.open.security               = 0;    
    pb->csParam.open.optionCnt              = 0;
    for (index = 0; index < sizeof(pb->csParam.open.options); ++index)  
        pb->csParam.open.options[index]     = 0;    
    pb->csParam.open.userDataPtr            = userData;
    
    osErr = PBControl((ParmBlkPtr) pb, async);
    if (!async && (noErr == osErr)) {
        *localIP                            = pb->csParam.open.localHost;   
        *localPort                          = pb->csParam.open.localPort;
    }
 
    return osErr;
}
 
 
OSErr _TCPSend (pb, stream, wdsPtr, userData, ioCompletion, async)
            TCPiopb                 *pb;
            StreamPtr               stream;
            wdsEntry                *wdsPtr;
            Ptr                     userData;
            TCPIOCompletionProc     ioCompletion;
            Boolean                 async;
{
 
    auto    OSErr                   osErr;
    
    pb->ioCompletion                    = ioCompletion;
    pb->ioCRefNum                       = gIPPDriverRefNum;
    pb->csCode                          = TCPSend;
    pb->tcpStream                       = stream;
    
    pb->csParam.send.ulpTimeoutValue    = 30;   
    pb->csParam.send.ulpTimeoutAction   = 1;    
    pb->csParam.send.validityFlags      = 0xC0; 
    pb->csParam.send.pushFlag           = 0;    
    pb->csParam.send.urgentFlag         = 0;    
    pb->csParam.send.wdsPtr             = (Ptr) wdsPtr; 
    pb->csParam.send.sendFree           = 0;    
    pb->csParam.send.sendLength         = 0;    
    pb->csParam.send.userDataPtr        = userData;
    
    osErr = PBControl((ParmBlkPtr) pb, async);
 
    return osErr;
}
 
 
OSErr _TCPNoCopyRcv (pb, stream, rdsPtr, rdsLength, userData, ioCompletion, async)
            TCPiopb                 *pb;
            StreamPtr               stream;
            rdsEntry                *rdsPtr;
            unsigned short          rdsLength;
            Ptr                     userData;
            TCPIOCompletionProc     ioCompletion;
            Boolean                 async;
{
 
    auto    OSErr                   osErr;
    
    pb->ioCompletion                            = ioCompletion;
    pb->ioCRefNum                               = gIPPDriverRefNum;
    pb->csCode                                  = TCPNoCopyRcv;
    pb->tcpStream                               = stream;
    
    pb->csParam.receive.commandTimeoutValue     = 30;   
    pb->csParam.receive.urgentFlag              = 0;    
    pb->csParam.receive.markFlag                = 0;    
    pb->csParam.receive.rdsPtr                  = (Ptr) rdsPtr; 
    pb->csParam.receive.rdsLength               = rdsLength;    
    pb->csParam.receive.userDataPtr             = userData;
    
    osErr = PBControl((ParmBlkPtr) pb, async);
 
    return osErr;
}
 
 
OSErr _TCPRcv (pb, stream, rcvBufPtr, rcvBufLen, userData, ioCompletion, async)
            TCPiopb                 *pb;
            StreamPtr               stream;
            Ptr                     rcvBufPtr;
            unsigned short          *rcvBufLen;
            Ptr                     userData;
            TCPIOCompletionProc     ioCompletion;
            Boolean                 async;
{
 
    auto    OSErr                   osErr;
    
    pb->ioCompletion                            = ioCompletion;
    pb->ioCRefNum                               = gIPPDriverRefNum;
    pb->csCode                                  = TCPRcv;
    pb->tcpStream                               = stream;
    
    pb->csParam.receive.commandTimeoutValue     = 30;   
    pb->csParam.receive.urgentFlag              = 0;    
    pb->csParam.receive.markFlag                = 0;    
    pb->csParam.receive.rcvBuff                 = rcvBufPtr;    
    pb->csParam.receive.rcvBuffLen              = *rcvBufLen;   
    pb->csParam.receive.userDataPtr             = userData;
    
    osErr = PBControl((ParmBlkPtr) pb, async);
    if (! async)
        *rcvBufLen = pb->csParam.receive.rcvBuffLen;
 
    return osErr;
}
 
 
OSErr _TCPBfrReturn (pb, stream, rdsPtr, userData, ioCompletion, async)
            TCPiopb                 *pb;
            StreamPtr               stream;
            Ptr                     rdsPtr;
            Ptr                     userData;
            TCPIOCompletionProc     ioCompletion;
            Boolean                 async;
{
 
    auto    OSErr                   osErr;
    
    pb->ioCompletion                    = ioCompletion;
    pb->ioCRefNum                       = gIPPDriverRefNum;
    pb->csCode                          = TCPRcvBfrReturn;
    pb->tcpStream                       = stream;
    
    pb->csParam.receive.rdsPtr          = rdsPtr;   
    pb->csParam.receive.userDataPtr     = userData;
    
    osErr = PBControl((ParmBlkPtr) pb, async);
 
    return osErr;
}
 
 
OSErr _TCPClose (pb, stream, userData, ioCompletion, async)
            TCPiopb                 *pb;
            StreamPtr               stream;
            Ptr                     userData;
            TCPIOCompletionProc     ioCompletion;
            Boolean                 async;
{
 
    auto    OSErr                   osErr;
    
    pb->ioCompletion                    = ioCompletion;
    pb->ioCRefNum                       = gIPPDriverRefNum;
    pb->csCode                          = TCPClose;
    pb->tcpStream                       = stream;
    
    pb->csParam.close.ulpTimeoutValue   = 30;   
    pb->csParam.close.ulpTimeoutAction  = 1;    
    pb->csParam.close.validityFlags     = 0xC0; 
    pb->csParam.close.userDataPtr       = userData;
    
    osErr = PBControl((ParmBlkPtr) pb, async);
 
    return osErr;
}
 
 
OSErr _TCPAbort (pb, stream, userData, ioCompletion, async)
            TCPiopb                 *pb;
            StreamPtr               stream;
            Ptr                     userData;
            TCPIOCompletionProc     ioCompletion;
            Boolean                 async;
{
 
    auto    OSErr                   osErr;
    
    pb->ioCompletion                    = ioCompletion;
    pb->ioCRefNum                       = gIPPDriverRefNum;
    pb->csCode                          = TCPAbort;
    pb->tcpStream                       = stream;
    
    pb->csParam.abort.userDataPtr       = userData;
    
    osErr = PBControl((ParmBlkPtr) pb, async);
 
    return osErr;
}
 
 
OSErr _TCPStatus (pb, stream, status, userData, ioCompletion, async)
            TCPiopb                 *pb;
            StreamPtr               stream;
            struct TCPStatusPB      *status;
            Ptr                     userData;
            TCPIOCompletionProc     ioCompletion;
            Boolean                 async;
{
 
    auto    OSErr                   osErr;
    
    pb->ioCompletion                    = ioCompletion;
    pb->ioCRefNum                       = gIPPDriverRefNum;
    pb->csCode                          = TCPStatus;
    pb->tcpStream                       = stream;
    
    pb->csParam.status.userDataPtr      = userData;
    
    osErr = PBControl((ParmBlkPtr) pb, async);
    if (!async && (noErr == osErr)) {
        *status                         = pb->csParam.status;   
    }
 
    return osErr;
}
 
 
OSErr _TCPRelease (pb, stream, rcvBufPtr, rcvBufLen, ioCompletion, async)
            TCPiopb                 *pb;
            StreamPtr               stream;
            Ptr                     *rcvBufPtr;
            long                    *rcvBufLen;
            TCPIOCompletionProc     ioCompletion;
            Boolean                 async;
{
 
    auto    OSErr                   osErr;
    
    pb->ioCompletion                    = ioCompletion;
    pb->ioCRefNum                       = gIPPDriverRefNum;
    pb->csCode                          = TCPRelease;
    pb->tcpStream                       = stream;
    
    osErr = PBControl((ParmBlkPtr) pb, async);
    if (!async && (noErr == osErr)) {
        *rcvBufPtr                      = pb->csParam.create.rcvBuff;   
        *rcvBufLen                      = pb->csParam.create.rcvBuffLen;    
    }
 
    return osErr;
}