EtherLib/global_state.c
Wiesner András 51696f7341 - MemoryPool allocation-deallocation bug fixed
- generic Queue implemented
- PacketRegistry allocation bug fixed
- TCP implementation initials
- ALIGN to type macros added
2023-01-17 08:19:29 +01:00

80 lines
2.5 KiB
C

#include <stddef.h>
#include "global_state.h"
#include "dynmem.h"
#include "prefab/prefab.h"
#include "packet_sieve.h"
#include "prefab/packet_parsers/arp_packet.h"
#include "prefab/packet_parsers/icmp_packet.h"
#include "etherlib/prefab/packet_parsers/igmp_packet.h"
#include "etherlib/prefab/packet_parsers/tcp_segment.h"
EthState gEthState;
static void register_packet_parsers() {
PcktClassDesc cdesc;
// Ethernet frame parser
cdesc.class = 0;
cdesc.containerClass = 0;
cdesc.procFun = parse_ethernet;
cdesc.hdrInsFn = insert_ethernet_header;
cdesc.propertySize = sizeof(EthernetProps);
packreg_add_class(E.pcktReg, &cdesc);
// IPv4 packet parser
cdesc.class = ETH_IPv4_PACKET_CLASS;
cdesc.containerClass = 0;
cdesc.procFun = parse_ipv4;
cdesc.hdrInsFn = insert_ipv4_header;
cdesc.propertySize = sizeof(IPv4Props);
packreg_add_class(E.pcktReg, &cdesc);
// UDP packet parser
cdesc.class = ETH_UDP_PACKET_CLASS;
cdesc.containerClass = ETH_IPv4_PACKET_CLASS;
cdesc.procFun = parse_udp;
cdesc.hdrInsFn = insert_udp_header;
cdesc.propertySize = sizeof(UdpProps);
packreg_add_class(E.pcktReg, &cdesc);
// ARP packet parser
cdesc.class = ETH_ARP_PACKET_CLASS;
cdesc.containerClass = 0;
cdesc.procFun = parse_arp;
cdesc.hdrInsFn = insert_arp_header;
cdesc.propertySize = sizeof(ArpProps);
packreg_add_class(E.pcktReg, &cdesc);
// ICMP packet parser
cdesc.class = ETH_ICMP_PACKET_CLASS;
cdesc.containerClass = ETH_IPv4_PACKET_CLASS;
cdesc.procFun = parse_icmp;
cdesc.hdrInsFn = insert_icmp_header;
cdesc.propertySize = sizeof(IcmpProps);
packreg_add_class(E.pcktReg, &cdesc);
// IGMP packet parser
cdesc.class = ETH_IGMP_PACKET_CLASS;
cdesc.containerClass = ETH_IPv4_PACKET_CLASS;
cdesc.procFun = parse_igmp;
cdesc.hdrInsFn = insert_igmp_header;
cdesc.propertySize = sizeof(IgmpProps);
packreg_add_class(E.pcktReg, &cdesc);
// TCP packet parser
cdesc.class = ETH_TCP_PACKET_CLASS;
cdesc.containerClass = ETH_IPv4_PACKET_CLASS;
cdesc.procFun = parse_tcp;
cdesc.hdrInsFn = insert_tcp_header;
cdesc.propertySize = sizeof(TcpProps);
packreg_add_class(E.pcktReg, &cdesc);
}
void ethlib_init() {
dynmem_init(); // initialize dynamic memory subsystem
E.tmr = timer_new(ETHLIB_TMR_SCHED_TABLE_SIZE); // create timer
E.pcktReg = packreg_new(); // create new packet registry
register_packet_parsers(); // register packet parsers
//E.ethIntf = ethintf_new(); // create new Ethernet interface
}