Skip to content

File syn_eth.h

File List > net > syn_eth.h

Go to the documentation of this file

#ifndef SYN_ETH_H
#define SYN_ETH_H

#ifdef __cplusplus
extern "C" {
#endif

#include "syntropic/common/syn_defs.h"

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#define SYN_ETH_MAC_LEN 6U          
#define SYN_ETH_HEADER_LEN 14U      
#define SYN_ETH_MIN_FRAME_LEN 60U   
#define SYN_ETH_MAX_FRAME_LEN 1514U 
#ifndef SYN_ETH_ARP_CACHE_SIZE
#define SYN_ETH_ARP_CACHE_SIZE 8U 
#endif

#define SYN_ETHTYPE_IPV4 0x0800U     
#define SYN_ETHTYPE_ARP 0x0806U      
#define SYN_ETHTYPE_IPV6 0x86DDU     
#define SYN_ETHTYPE_ETHERCAT 0x88A4U 
#define SYN_ARP_OP_REQUEST 1U 
#define SYN_ARP_OP_REPLY 2U   
typedef struct {
    uint8_t dst_mac[SYN_ETH_MAC_LEN]; 
    uint8_t src_mac[SYN_ETH_MAC_LEN]; 
    uint16_t ethertype;               
} SYN_ETH_Header;

typedef struct {
    uint32_t ip;                  
    uint8_t mac[SYN_ETH_MAC_LEN]; 
    uint32_t last_seen_ms;        
    bool valid;                   
} SYN_ETH_ArpEntry;

typedef struct {
    uint8_t mac_addr[SYN_ETH_MAC_LEN];                  
    uint32_t ip_addr;                                   
    uint32_t netmask;                                   
    uint32_t gateway;                                   
    SYN_ETH_ArpEntry arp_cache[SYN_ETH_ARP_CACHE_SIZE]; 
    uint32_t frames_tx;                                 
    uint32_t frames_rx;                                 
    uint32_t arp_requests;                              
    uint32_t arp_replies;                               
} SYN_ETH;

SYN_Status syn_eth_generate_mac(const void *uid_bytes, size_t uid_len, uint8_t mac_out[6]);

SYN_Status syn_eth_init(SYN_ETH *eth, const uint8_t mac_addr[6], uint32_t ip_addr);

SYN_Status syn_eth_process_frame(SYN_ETH *eth, const uint8_t *frame, size_t len, uint8_t *tx_buf,
                                 size_t *tx_len);

SYN_Status syn_eth_build_frame(SYN_ETH *eth, const uint8_t dst_mac[6], uint16_t ethertype,
                               const uint8_t *payload, size_t payload_len, uint8_t *frame_out,
                               size_t *frame_len);

SYN_Status syn_eth_arp_lookup(SYN_ETH *eth, uint32_t ip, uint8_t mac_out[6]);

SYN_Status syn_eth_arp_update(SYN_ETH *eth, uint32_t ip, const uint8_t mac[6]);

/* ── Network Frame Serialization Helpers ───────────────────────────────── */

uint16_t syn_ip_checksum(const void *buf, size_t len);

size_t syn_eth_pack_header(uint8_t *buf, size_t buf_size, const uint8_t dst_mac[6],
                           const uint8_t src_mac[6], uint16_t ethertype);

size_t syn_ip_pack_header(uint8_t *buf, size_t buf_size, uint32_t src_ip, uint32_t dst_ip,
                          uint8_t proto, uint16_t payload_len, uint16_t id);

/* ── Protocol engine injection ──────────────────────────────────────────── */

struct SYN_ICMP *syn_eth_get_icmp_instance(void);

struct SYN_TCP *syn_eth_get_tcp_instance(void);

/* ── Protothread Coroutine Integration ──────────────────────────────────── */

#include "port/syn_port_eth.h"
#include "syntropic/pt/syn_pt.h"

#define PT_ETH_WAIT_FRAME(pt, rx_buf, max_len, rx_len) \
    PT_WAIT_UNTIL(pt, syn_port_eth_rx((rx_buf), (max_len), (rx_len)) == SYN_OK)

#define PT_ETH_WAIT_ARP(pt, eth, target_ip, mac_out) \
    PT_WAIT_UNTIL(pt, syn_eth_arp_lookup((eth), (target_ip), (mac_out)) == SYN_OK)

#ifdef __cplusplus
}
#endif

#endif /* SYN_ETH_H */