mibuild/sim: able to send ethernet frame from sim to server.py

This commit is contained in:
Florent Kermarrec 2015-03-06 12:49:56 +01:00
parent 0029b87628
commit a64acdfa65
2 changed files with 38 additions and 3 deletions

View File

@ -11,7 +11,8 @@ messages= {
"EXIT": 0, "EXIT": 0,
"ACK": 1, "ACK": 1,
"ERROR": 2, "ERROR": 2,
"UART": 3 "UART": 3,
"ETHERNET": 4
} }
class PacketTooLarge(Exception): class PacketTooLarge(Exception):
@ -80,7 +81,11 @@ def read():
if packet[0] == messages["UART"]: if packet[0] == messages["UART"]:
c = bytes(chr(packet[1]).encode('utf-8')) c = bytes(chr(packet[1]).encode('utf-8'))
os.write(server.serial, c) os.write(server.serial, c)
elif packet[0] == messages["ETHERNET"]:
print("received ethernet")
for d in packet[1:]:
print("{:02X}".format(d), end="")
print("")
elif packet[0] == messages["ACK"]: elif packet[0] == messages["ACK"]:
server.ack = True server.ack = True

View File

@ -19,6 +19,9 @@
#include <netdb.h> #include <netdb.h>
#include <pthread.h> #include <pthread.h>
#define MAX(a,b) (((a)>(b))?(a):(b))
#define MIN(a,b) (((a)<(b))?(a):(b))
int trace = 0; int trace = 0;
vluint64_t main_time = 0; vluint64_t main_time = 0;
@ -38,7 +41,8 @@ enum {
MESSAGE_EXIT = 0, MESSAGE_EXIT = 0,
MESSAGE_ACK, MESSAGE_ACK,
MESSAGE_ERROR, MESSAGE_ERROR,
MESSAGE_UART MESSAGE_UART,
MESSAGE_ETH
}; };
struct sim { struct sim {
@ -58,6 +62,12 @@ struct sim {
char rx_serial_presented; char rx_serial_presented;
}; };
unsigned char eth_txbuffer[1532];
unsigned char eth_rxbuffer[1532];
int eth_txbuffer_len = 0;
int eth_rxbuffer_len = 0;
int eth_rxbuffer_pos = 0;
int sim_connect(struct sim *s, const char *sockaddr) int sim_connect(struct sim *s, const char *sockaddr)
{ {
struct sockaddr_un addr; struct sockaddr_un addr;
@ -143,6 +153,25 @@ int console_service(struct sim *s)
return 0; return 0;
} }
int eth_last_source_stb = 0;
int ethernet_service(struct sim *s) {
/* fpga --> ethernet tap */
ETH_SOURCE_ACK = 1;
if(ETH_SOURCE_STB == 1) {
eth_txbuffer[eth_txbuffer_len] = ETH_SOURCE_DATA;
eth_txbuffer_len++;
} else {
if (eth_last_source_stb) {
s->txbuffer[0] = MESSAGE_ETH;
memcpy(s->txbuffer+1, eth_txbuffer, eth_txbuffer_len);
sim_send(s, s->txbuffer, eth_txbuffer_len+1);
eth_txbuffer_len = 0;
}
}
eth_last_source_stb = ETH_SOURCE_STB;
}
void sim_tick(struct sim *s) void sim_tick(struct sim *s)
{ {
SYS_CLK = s->tick%2; SYS_CLK = s->tick%2;
@ -190,6 +219,7 @@ int main(int argc, char **argv, char **env)
if (SYS_CLK) { if (SYS_CLK) {
if (console_service(&s) != 0) if (console_service(&s) != 0)
s.run = false; s.run = false;
ethernet_service(&s);
} }
} }
s.end = clock(); s.end = clock();