Skip to content

File syn_dhcp.h

File List > net > syn_dhcp.h

Go to the documentation of this file

#ifndef SYN_DHCP_H
#define SYN_DHCP_H

#ifdef __cplusplus
extern "C" {
#endif

#include "syntropic/common/syn_defs.h"
#include "syntropic/net/syn_eth.h"
#include "syntropic/pt/syn_pt.h"

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

#define SYN_DHCP_CLIENT_PORT 68U 
#define SYN_DHCP_SERVER_PORT 67U 
#define SYN_DHCP_MAGIC_COOKIE 0x63825363UL 
#define SYN_DHCP_DISCOVER 1U 
#define SYN_DHCP_OFFER 2U    
#define SYN_DHCP_REQUEST 3U  
#define SYN_DHCP_DECLINE 4U  
#define SYN_DHCP_ACK 5U      
#define SYN_DHCP_NAK 6U      
#define SYN_DHCP_OPT_SUBNET_MASK 1U 
#define SYN_DHCP_OPT_ROUTER 3U      
#define SYN_DHCP_OPT_LEASE_TIME 51U 
#define SYN_DHCP_OPT_MSG_TYPE 53U   
#define SYN_DHCP_OPT_END 255U       
typedef enum {
    SYN_DHCP_STATE_INIT = 0,
    SYN_DHCP_STATE_DISCOVER,
    SYN_DHCP_STATE_OFFER,
    SYN_DHCP_STATE_REQUEST,
    SYN_DHCP_STATE_BOUND
} SYN_DHCP_State;

typedef struct {
    SYN_DHCP_State state;    
    uint32_t xid;            
    uint32_t offered_ip;     
    uint32_t subnet_mask;    
    uint32_t gateway;        
    uint32_t lease_time_sec; 
    uint32_t server_ip;      
    uint32_t discovers_sent; 
    uint32_t requests_sent;  
    uint32_t acks_received;  
} SYN_DHCP;

SYN_Status syn_dhcp_init(SYN_DHCP *dhcp, uint32_t xid);

SYN_Status syn_dhcp_build_discover(SYN_DHCP *dhcp, const uint8_t mac_addr[6], uint8_t *buf_out,
                                   size_t buf_size, size_t *len_out);

SYN_Status syn_dhcp_build_request(SYN_DHCP *dhcp, const uint8_t mac_addr[6], uint8_t *buf_out,
                                  size_t buf_size, size_t *len_out);

SYN_Status syn_dhcp_process_packet(SYN_DHCP *dhcp, SYN_ETH *eth, const uint8_t *dhcp_pkt,
                                   size_t len);

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

#define PT_DHCP_WAIT_BOUND(pt, dhcp) PT_WAIT_UNTIL(pt, (dhcp)->state == SYN_DHCP_STATE_BOUND)

#define PT_DHCP_BLOCK_BOUND(pt, task, dhcp) \
    PT_BLOCK_CONDITION(pt, task, (dhcp)->state == SYN_DHCP_STATE_BOUND)

#ifdef __cplusplus
}
#endif

#endif /* SYN_DHCP_H */