Started adding support for IP packets.

This commit is contained in:
Gregory Alexander 2001-06-21 23:12:47 +00:00
parent efa62838bb
commit 7f03177ed0
2 changed files with 104 additions and 8 deletions

View File

@ -1,6 +1,91 @@
#include "eth_packetmaker.h"
#include "bochs.h"
Boolean sendable(const eth_packet& outpacket) {
//FINISH ME!
}
Bit32u eth_IPmaker::datalen(const eth_packet& outpacket) {
Bit32u out;
out=((outpacket.buf[16]<<8)+outpacket.buf[17])-(4*(0xF & outpacket.buf[14]));
return out;
}
const Bit8u * eth_IPmaker::datagram(const eth_packet& outpacket) {
const Bit8u * out;
out=outpacket.buf+14+(4*(0xF & outpacket.buf[14]));
return out;
}
Bit32u eth_IPmaker::build_packet_header(Bit32u source, Bit32u dest, Bit8u protocol, Bit32u datalen) {
Bit32u temp;
Bit32u i;
memcpy(pending.buf,internal_mac,6);
memcpy(pending.buf+6,external_mac,6);
memcpy(pending.buf+12,ethtype_ip,2);
pending.buf[14]=0x45;
pending.buf[15]=0;
temp=datalen+20;
pending.buf[16]=(temp>>8) & 0xFF;
pending.buf[17]=temp & 0xFF;
pending.buf[18]=0;
pending.buf[19]=0;
pending.buf[20]=0;
pending.buf[21]=0;
pending.buf[22]=30;
pending.buf[23]=protocol;
pending.buf[24]=0;
pending.buf[25]=0;
pending.buf[26]=(source>>24) & 0xFF;
pending.buf[27]=(source>>16) & 0xFF;
pending.buf[28]=(source>>8) & 0xFF;
pending.buf[29]=(source) & 0xFF;
pending.buf[30]=(dest>>24) & 0xFF;
pending.buf[31]=(dest>>16) & 0xFF;
pending.buf[32]=(dest>>8) & 0xFF;
pending.buf[33]=(dest) & 0xFF;
//Compute Checksum
temp=0;
for(i=14;i<34;i=i+2) {
Bit32u addee=pending.buf[i];
addee=(addee<<8) & pending.buf[i+1];
temp=temp+addee;
}
temp=(temp>>16)+(temp&0xFFFF);
temp=(temp>>16)+(temp&0xFFFF);
pending.buf[24]=~(Bit8u)((temp>>8) & 0xFF);
pending.buf[25]=~(Bit8u)(temp & 0xFF);
return(34);
}
Bit8u eth_IPmaker::protocol(const eth_packet& outpacket) {
Bit8u out;
out=0xFF & *(outpacket.buf+23);
}
Bit32u eth_IPmaker::source(const eth_packet& outpacket) {
Bit32u out;
out=0xFF & *(outpacket.buf+26);
out=(out<<8) | (0xFF & *(outpacket.buf+27));
out=(out<<8) | (0xFF & *(outpacket.buf+28));
out=(out<<8) | (0xFF & *(outpacket.buf+29));
return out;
}
Bit32u eth_IPmaker::destination(const eth_packet& outpacket) {
Bit32u out;
out=0xFF & *(outpacket.buf+30);
out=(out<<8) | (0xFF & *(outpacket.buf+31));
out=(out<<8) | (0xFF & *(outpacket.buf+32));
out=(out<<8) | (0xFF & *(outpacket.buf+33));
return out;
}
void eth_IPmaker::init(void) {
is_pending=0;
}
void
eth_ETHmaker::init(void) {
arper.init();

View File

@ -5,6 +5,7 @@
#include "../config.h"
#define PACKET_BUF_SIZE 2048
static const Bit8u internal_mac[]={0xB0, 0xC4, 0x20, 0x20, 0x00, 0x00, 0x00};
static const Bit8u external_mac[]={0xB0, 0xC4, 0x20, 0x20, 0x00, 0x00, 0x00};
static const Bit8u external_ip[]={ 192, 168, 0, 2, 0x00 };
static const Bit8u broadcast_mac[]={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};
@ -39,20 +40,29 @@ private:
};
/*
class eth_IPmaker : eth_packetmaker {
public:
void init(void);
virtual Boolean ishandler(const eth_packet& outpacket);
virtual Boolean sendpacket(const eth_packet& outpacket);
virtual Boolean getpacket(eth_packet& inpacket);
private:
virtual Boolean ishandler(const eth_packet& outpacket)=0;
virtual Boolean sendpacket(const eth_packet& outpacket)=0;
virtual Boolean getpacket(eth_packet& inpacket)=0;
protected:
Boolean sendable(const eth_packet& outpacket);
Bit32u source(const eth_packet& outpacket);
Bit32u destination(const eth_packet& outpacket);
Bit8u protocol(const eth_packet& outpacket);
const Bit8u * datagram(const eth_packet& outpacket);
Bit32u datalen(const eth_packet& outpacket);
//Build a header in pending, return header length in bytes.
Bit32u build_packet_header(Bit32u source, Bit32u dest, Bit8u protocol, Bit32u datalen);
eth_packet pending;
Boolean is_pending;
Bit32u Destination;
Bit32u Source;
//Bit8u Version; //=4 (4 bits)
//It better be!
@ -92,6 +102,7 @@ private:
//Bit32u Destination;//destination address
};
/*
class eth_TCPmaker : eth_packetmaker {
};