Skip to content

File syn_netcfg.c

File List > net > syn_netcfg.c

Go to the documentation of this file

#include "syntropic/net/syn_netcfg.h"

#include <string.h>

SYN_Status syn_netcfg_init(SYN_NETCFG *netcfg, SYN_NETCFG_Mode mode, const uint8_t mac[6])
{
    if (!netcfg || !mac) {
        return SYN_INVALID_PARAM; /* LCOV_EXCL_LINE: Defensive NULL check or invalid parameter
                                     fallback */
    }

    memset(netcfg, 0, sizeof(*netcfg));
    netcfg->mode = mode;
    netcfg->link_state = SYN_NETCFG_LINK_UP;

    syn_dhcp_init(&netcfg->dhcp, 0x12345678UL);
    syn_autoip_init(&netcfg->autoip, mac);

    if (mode == SYN_NETCFG_MODE_STATIC) {
        netcfg->is_bound = true;
    }

    return SYN_OK;
}

SYN_Status syn_netcfg_set_link_callback(SYN_NETCFG *netcfg, SYN_NETCFG_LinkCb cb, void *user_data)
{
    if (!netcfg) {
        return SYN_INVALID_PARAM; /* LCOV_EXCL_LINE: Defensive NULL check or invalid parameter
                                     fallback */
    }
    netcfg->link_cb = cb;
    netcfg->user_data = user_data;
    return SYN_OK;
}

SYN_Status syn_netcfg_set_link_state(SYN_NETCFG *netcfg, SYN_ETH *eth, SYN_NETCFG_LinkState state)
{
    if (!netcfg || !eth) {
        return SYN_INVALID_PARAM; /* LCOV_EXCL_LINE: Defensive NULL check or invalid parameter
                                     fallback */
    }

    netcfg->link_state = state;

    if (state == SYN_NETCFG_LINK_DOWN) {
        netcfg->is_bound = false;
        netcfg->assigned_ip = 0;
        netcfg->assigned_netmask = 0;
        netcfg->assigned_gateway = 0;

        eth->ip_addr = 0;
        eth->netmask = 0;
        eth->gateway = 0;

        netcfg->dhcp.state = SYN_DHCP_STATE_INIT;
        netcfg->autoip.state = SYN_AUTOIP_STATE_INIT;
    } else if (state == SYN_NETCFG_LINK_UP) {
        if (netcfg->mode == SYN_NETCFG_MODE_STATIC) {
            netcfg->assigned_ip = netcfg->static_ip;
            netcfg->assigned_netmask = netcfg->static_netmask;
            netcfg->assigned_gateway = netcfg->static_gateway;
            netcfg->is_bound = (netcfg->static_ip != 0);

            eth->ip_addr = netcfg->static_ip;
            eth->netmask = netcfg->static_netmask;
            eth->gateway = netcfg->static_gateway;
        } else {
            netcfg->is_bound = false;
            netcfg->dhcp.state = SYN_DHCP_STATE_INIT;
            netcfg->autoip.state = SYN_AUTOIP_STATE_INIT;
        }
    }

    if (netcfg->link_cb) {
        netcfg->link_cb(netcfg, state, netcfg->user_data);
    }

    return SYN_OK;
}

SYN_Status syn_netcfg_set_static(SYN_NETCFG *netcfg, SYN_ETH *eth, uint32_t ip, uint32_t netmask,
                                 uint32_t gateway)
{
    if (!netcfg || !eth || ip == 0) {
        return SYN_INVALID_PARAM; /* LCOV_EXCL_LINE: Defensive NULL check or invalid parameter
                                     fallback */
    }

    netcfg->mode = SYN_NETCFG_MODE_STATIC;
    netcfg->static_ip = ip;
    netcfg->static_netmask = netmask;
    netcfg->static_gateway = gateway;
    netcfg->assigned_ip = ip;
    netcfg->assigned_netmask = netmask;
    netcfg->assigned_gateway = gateway;
    netcfg->is_bound = (netcfg->link_state == SYN_NETCFG_LINK_UP);

    if (netcfg->is_bound) {
        eth->ip_addr = ip;
        eth->netmask = netmask;
        eth->gateway = gateway;
    }

    return SYN_OK;
}

SYN_Status syn_netcfg_trigger_autoip_fallback(SYN_NETCFG *netcfg, SYN_ETH *eth,
                                              const uint8_t mac[6])
{
    if (!netcfg || !eth || !mac) {
        return SYN_INVALID_PARAM; /* LCOV_EXCL_LINE: Defensive NULL check or invalid parameter
                                     fallback */
    }

    syn_autoip_init(&netcfg->autoip, mac);
    netcfg->autoip.state = SYN_AUTOIP_STATE_BOUND;

    netcfg->assigned_ip = netcfg->autoip.ip_addr;
    netcfg->assigned_netmask = SYN_AUTOIP_NETMASK;
    netcfg->assigned_gateway = 0;
    netcfg->is_bound = (netcfg->link_state == SYN_NETCFG_LINK_UP);

    if (netcfg->is_bound) {
        eth->ip_addr = netcfg->assigned_ip;
        eth->netmask = netcfg->assigned_netmask;
        eth->gateway = 0;
    }

    return SYN_OK;
}