BlinkenArea - GitList
Repositories
Blog
Wiki
mips_sys
Code
Commits
Branches
Tags
Search
Tree:
cc0f06d
Branches
Tags
master
mips_sys
fw
ethernet.c
implementation of ethernet and ARP (not completely working yet, hangs on received ARP request)
Stefan Schuermans
commited
cc0f06d
at 2012-03-17 01:03:19
ethernet.c
Blame
History
Raw
/* flpDistriR25S - flexipix distributor for pixels round 25mm with switch * version 1.0.0 date 2011-06-12 * created by Stefan Schuermans <stefan@schuermans.info> * Copyright (C) 2006-2011 flexipix GbR, Germany */ #include "arp.h" #include "config.h" #include "eth.h" #include "ethernet.h" // TODO #include "ip.h" #include "macros.h" #include "nethelp.h" /** * @brief process a received ethernet packet * @param[in] ptr pointer to data of packet * @param[in] sz size of packet */ /* extern */ void ethernet_recv(void *ptr, unsigned int sz) { struct ethernet_packet *eth_pack; // packet too short if (sz < sizeof(struct ethernet_packet)) return; eth_pack = (struct ethernet_packet *)ptr; // branch according to packet type switch (eth_pack->eth_hdr.type) { // ARP case htons(0x0806): arp_recv(ptr, sz); break; // IP case htons(0x0800): // TODO ip_recv(ptr, sz); break; } } /** * @brief send an ethernet packet * @param[in] ptr pointer to data of packet * @param[in] sz size of packet * * ptr must point to a ethernet_packet with eth_hdr.dest and eth_hdr.type * already initialized */ /* extern */ void ethernet_send(void *ptr, unsigned int sz) { struct ethernet_packet *eth_pack; // packet too short if (sz < sizeof(struct ethernet_packet)) return; eth_pack = (struct ethernet_packet *)ptr; // fill in source address mac_cpy(eth_pack->eth_hdr.src, config_mac.mac); // transmit packet eth_tx(ptr, sz); }