Started adding support for IP packets.
This commit is contained in:
parent
efa62838bb
commit
7f03177ed0
@ -1,6 +1,91 @@
|
|||||||
#include "eth_packetmaker.h"
|
#include "eth_packetmaker.h"
|
||||||
#include "bochs.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
|
void
|
||||||
eth_ETHmaker::init(void) {
|
eth_ETHmaker::init(void) {
|
||||||
arper.init();
|
arper.init();
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "../config.h"
|
#include "../config.h"
|
||||||
|
|
||||||
#define PACKET_BUF_SIZE 2048
|
#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_mac[]={0xB0, 0xC4, 0x20, 0x20, 0x00, 0x00, 0x00};
|
||||||
static const Bit8u external_ip[]={ 192, 168, 0, 2, 0x00 };
|
static const Bit8u external_ip[]={ 192, 168, 0, 2, 0x00 };
|
||||||
static const Bit8u broadcast_mac[]={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};
|
static const Bit8u broadcast_mac[]={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};
|
||||||
@ -39,20 +40,29 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
class eth_IPmaker : eth_packetmaker {
|
class eth_IPmaker : eth_packetmaker {
|
||||||
public:
|
public:
|
||||||
void init(void);
|
void init(void);
|
||||||
virtual Boolean ishandler(const eth_packet& outpacket);
|
virtual Boolean ishandler(const eth_packet& outpacket)=0;
|
||||||
virtual Boolean sendpacket(const eth_packet& outpacket);
|
virtual Boolean sendpacket(const eth_packet& outpacket)=0;
|
||||||
virtual Boolean getpacket(eth_packet& inpacket);
|
virtual Boolean getpacket(eth_packet& inpacket)=0;
|
||||||
private:
|
|
||||||
|
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;
|
eth_packet pending;
|
||||||
Boolean is_pending;
|
Boolean is_pending;
|
||||||
|
|
||||||
Bit32u Destination;
|
|
||||||
Bit32u Source;
|
|
||||||
|
|
||||||
//Bit8u Version; //=4 (4 bits)
|
//Bit8u Version; //=4 (4 bits)
|
||||||
//It better be!
|
//It better be!
|
||||||
|
|
||||||
@ -92,6 +102,7 @@ private:
|
|||||||
//Bit32u Destination;//destination address
|
//Bit32u Destination;//destination address
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
class eth_TCPmaker : eth_packetmaker {
|
class eth_TCPmaker : eth_packetmaker {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user