home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
msvp98b1.lzh
/
MSNPKT.C
< prev
next >
Wrap
Text File
|
1993-05-14
|
6KB
|
202 lines
/* File MSNPKT.C
* Packet Driver interface
*
* Copyright (C) 1985, 1992, Trustees of Columbia University in the
* City of New York. Permission is granted to any individual or institution
* to use this software as long as it is not sold for profit. This copyright
* notice must be retained. This software may not be included in commercial
* products without written permission of Columbia University.
*
* Written for MS-DOS Kermit by Joe R. Doupnik,
* Utah State University, jrd@cc.usu.edu, jrd@usu.Bitnet
*
* Last edit
* 25 May 1992
*/
#include "msntcp.h"
#include "msnlib.h"
#define BUFSIZE 3000 /* size of pkt receive buffer */
word pkt_ip_type = 0x0008; /* these are little endian values */
word pkt_arp_type = 0x0608;
word pkt_rarp_type = 0x3580;
word pkt_ip_handle = -1; /* -1 means invalid handle */
word pkt_arp_handle = -1;
word pkt_rarp_handle = -1;
int pdversion, pdtype, pdnum, pdfunct;
extern word pktdevclass;
extern int pdinit(), pdinfo(), pdaccess(), pdclose();
extern eth_address eth_addr;
byte pktbuf[BUFSIZE] = {0}; /* linked list packet receive buffer */
static byte * pktbuf_read = pktbuf;
byte pktwnum = 0; /* seq number for packets written to buffer */
byte pktrnum = 0; /* seq number for packets read from buffer */
byte * pktbuf_wrote = &pktbuf[BUFSIZE - 4];
int
pkt_eth_init()
{
pkt_buf_wipe(); /* clean out and init receiver buffer */
if (pdinit(pktbuf, eth_addr) == 0)
{
outs("\r\nCannot attach to an Ethernet Packet Driver");
outs(" or a Novell ODI driver.");
return( 0 );
}
pkt_buf_wipe();
/* lets find out about the driver */
if ((pdinfo(&pdversion, &pktdevclass, &pdtype, &pdnum, &pdfunct))
== 0)
{
outs("\r\nCannot obtain Packet Driver or ODI information");
return (0);
}
if (pdaccess(&pkt_ip_type,
(pktdevclass == PD_SLIP)? 0: sizeof(pkt_ip_handle), &pkt_ip_handle)
== 0)
{
outs("\r\n\7Cannot access IP type packets");
return (0);
}
if (pktdevclass == PD_SLIP) /* SLIP uses only IP */
return (1);
if (pdaccess(&pkt_arp_type, sizeof(pkt_arp_handle), &pkt_arp_handle)
== 0)
{
outs("\r\n\7Cannot access ARP type packets");
return (0);
}
return (1); /* say success */
}
int
pkt_rarp_init() /* access PD for RARP */
{
if (pkt_rarp_handle != -1)
return (1); /* have handle already */
if (pdaccess(&pkt_rarp_type, sizeof(pkt_rarp_handle), &pkt_rarp_handle)
== 0)
{
outs("\r\n\7Cannot access RARP type packets");
return (0);
}
return (1); /* say success */
}
int
pkt_release()
{
register int status = 1; /* assume success */
if (pkt_ip_handle != -1)
if (pdclose(pkt_ip_handle) == 0)
{
outs("\r\nERROR releasing Packet Driver for IP");
status = 0;
}
else pkt_ip_handle = -1; /* handle is out of service */
if ( pktdevclass == PD_SLIP ) return (0);
if (pkt_arp_handle != -1)
if (pdclose(pkt_arp_handle) == 0)
{
outs("\r\nERROR releasing Packet Driver for ARP");
status = 0;
}
else pkt_arp_handle = -1; /* handle is out of service */
if (pkt_rarp_handle != -1)
if (pdclose(pkt_rarp_handle) == 0)
{
outs("\r\nERROR releasing Packet Driver for RARP");
status = 0;
}
else pkt_rarp_handle = -1; /* handle is out of service */
return (status);
}
/* Deliver pointer to start of packet (destination address) or NULL.
* Simple linked list: byte flag, byte pkt seq number, int count,
* byte data[count] and so on.
* Status on the link flag byte is
* 0 = end of buffer (count has size to point to start of buffer)
* 1 = this slot is free (unused)
* 2 = this slot has an unread packet
* 4 = this slot is allocated for a packet, packet not yet loaded into it
* 8 = this slot has a packet which has been read once
* A two byte count value follows the flag byte, for number of bytes in
* this slot. Pktbuf_read remembers the pointer to the last-read slot.
*/
void * pkt_received()
{
register byte * p;
register int i;
p = pktbuf_read; /* start with last read */
for (i = 0; i < 2 * (BUFSIZE / (60 + 4)); i++) /* 2 * max pkts */
{
if (*p == 2 && *(p+1) == pktrnum) /* 2 == ready to be read */
{ /* if this is the next pkt */
pktbuf_read = p; /* where we have read */
*p = 8; /* mark as have read */
pktrnum++; /* next one to read */
return (p + 4); /* return ptr to pkt*/
}
/* if link is: end of buf free ready allocated have read */
if (*p == 0 || *p == 1 || *p == 2 || *p == 4 || *p == 8)
{
p += 4 + *(word *)(p+2); /* point at next link */
continue;
}
else /* bad link information */
{
pkt_buf_wipe(); /* emergency treatment */
break;
}
if (p == pktbuf_read) break; /* where we came in */
}
return (NULL);
}
void
pkt_buf_release(byte *p) /* return a buffer to the pool */
{
disable(); /* disallow interrupts here */
if (pktdevclass == PD_SLIP)
p -= 4; /* just link info */
else
p -= 4 + 6 + 6 + 2; /* link info and MAC header */
if (*p == 8) /* if packet has been read */
*p = 1; /* mark link as freed */
enable();
}
void
pkt_buf_wipe() /* clear all buffers */
{
disable();
pktbuf[0] = 1; /* flag first link as free */
pktbuf[1] = 0;
*(word *)&pktbuf[2] = BUFSIZE - 8; /* free space, size - two links */
pktbuf[BUFSIZE - 4] = 0; /* flag as end of buffer */
pktbuf[BUFSIZE - 3] = 0; /* pkt buffer seq number */
/* count below points to start of buffer */
*(word *)&pktbuf[BUFSIZE - 2] = - BUFSIZE;
pktbuf_read = pktbuf; /* where last read */
pktbuf_wrote = &pktbuf[BUFSIZE - 4]; /* where last wrote*/
pktwnum = pktrnum = 0; /* reset buffer sequence numbers */
enable();
}