home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
archives
/
msk315src.zip
/
msnsed.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-05-28
|
4KB
|
157 lines
/* File MSNSED.C
* Ethernet Driver support routines
*
* Copyright (C) 1991, University of Waterloo.
* Copyright (C) 1982, 1997, Trustees of Columbia University in the
* City of New York. The MS-DOS Kermit software may not be, in whole
* or in part, licensed or sold for profit as a software product itself,
* nor may it be included in or distributed with commercial products
* or otherwise distributed by commercial concerns to their clients
* or customers without written permission of the Office of Kermit
* Development and Distribution, Columbia University. This copyright
* notice must not be removed, altered, or obscured.
*
* Original version created by Erick Engelke of the University of
* Waterloo, Waterloo, Ontario, Canada.
* Adapted and modified for MS-DOS Kermit by Joe R. Doupnik,
* Utah State University, jrd@cc.usu.edu, jrd@usu.Bitnet.
*
* Last edit
* 12 Jan 1995 v3.14
*
* The TCP code uses Ethernet constants for protocol numbers and 48 bits
* for address. Also, 0xffffffffffff is assumed to be a broadcast.
*
* If you need to write a new driver, implement it at this level and use
* the above mentioned constants as this program's constants, not device
* dependant constants.
*
* The packet driver code lies below this.
*
* eth_addr - Ethernet address of this host.
* eth_brdcast - Ethernet broadcast address.
*/
#include "msntcp.h"
#include "msnlib.h"
#define ETH_MIN 60 /* Minimum Ethernet packet size */
eth_address eth_addr = {0}; /* local ethernet address */
eth_address eth_brdcast ={0xff,0xff,0xff,0xff,0xff,0xff};
/* Ethernet broadcast address */
word pktdevclass = 1; /* Ethernet = 1, SLIP = 6 */
extern word MAC_len;
static void lan_busy(void); /* waits while lan adapter busy, or 4 secs */
/* Ethernet Interface */
struct ether {
byte dest[6];
byte src[6];
word type;
byte data[ETH_MSS + 60];
};
static struct ether outbuf = {{0},{0},0,{0}};
/* Write Ethernet MAC header and return pointer to data field. */
/* Uses single output frame buffer, named outbuf. */
byte *
eth_formatpacket(void *eth_dest, word eth_type)
{
memset(&outbuf, 0, 6+6+2+64); /* clear small frame */
switch (pktdevclass)
{
case PD_ETHER:
bcopy(eth_dest, outbuf.dest, 6);
bcopy(eth_addr, outbuf.src, 6);
outbuf.type = eth_type;
return(outbuf.data); /* outbuf is permanent */
case PD_SLIP:
return(outbuf.dest); /* really data because no header */
}
return (NULL); /* default */
}
/*
* eth_send does the actual transmission once we are complete with the
* buffer. Do any last minute patches here, like fix the size.
*/
int
eth_send(word len)
{
if (len & 1) len++; /* if odd make even */
if ((pktdevclass == PD_ETHER) && ((len += 14) < ETH_MIN))
len = ETH_MIN;
return (pkt_send((byte *) &outbuf, len)); /* send to link driver */
}
/*
* eth_free - free an input buffer once it is no longer needed
* If pointer to NULL, release all buffers
*/
void
eth_free(void *buf)
{
if (buf != NULL)
pkt_buf_release(buf); /* free this buffer ptr */
else
pkt_buf_wipe(); /* if none then clear all */
}
/*
* eth_arrived - if a new packet has arrived, read it and fill pointer
* with type of packet
*/
byte *
eth_arrived(word *type_ptr)
{
register int i;
register struct ether * temp;
if (type_ptr == NULL) return (NULL);
if ((temp = (struct ether *)pkt_received()) == NULL)
return (NULL); /* nothing there folks */
switch (pktdevclass)
{
case PD_ETHER:
*type_ptr = temp->type; /* value of TYPE */
if (MAC_len == 0) /* no MAC address to test */
return (temp->data);
for (i = 5; i >= 0; i--) /*source same as us?*/
if (temp->src[i] != eth_addr[i])
return(temp->data); /* ptr to data */
/* NDIS echo stupidity */
eth_free(temp->data); /* discard packet */
return (NULL);
case PD_SLIP:
*type_ptr = TYPE_IP;
return((byte *)temp); /* no MAC to skip */
default:
return (NULL);
}
}
/*
* eth_release - release the hardware
*/
void
eth_release(void)
{
pkt_release();
}
/*
* eth_hardware - return pointer to source hardware address of a frame
*/
void *
eth_hardware(byte *p)
{
if (p == NULL || pktdevclass == PD_SLIP) return (NULL);
return (p - 8);
}