Files
E502_ADC_BF_PC_companion/e502/e502api_eth_config.c

308 lines
10 KiB
C

#include "e502api_private.h"
#include "e502_eth_config.h"
#include <string.h>
#include <stdlib.h>
#if E502_ETHCONFIG_MAC_ADDR_SIZE != X502_MAC_ADDR_SIZE
#error "inconsistent E502_ETHCONFIG_MAC_ADDR_SIZE"
#endif
#if E502_ETHCONFIG_INSTANCE_NAME_SIZE != X502_INSTANCE_NAME_SIZE
#error "inconsistent E502_ETHCONFIG_INSTANCE_NAME_SIZE"
#endif
#if E502_ETHCONFIG_PASSWD_SIZE != X502_PASSWORD_SIZE
#error "inconsistent E502_ETHCONFIG_PASSWD_SIZE"
#endif
#define E502_ETH_CFG_SIGN 0xE502CFA5
#define E502_ETH_CHECK_CFG(cfg) ((cfg != NULL) ? (cfg)->sign == E502_ETH_CFG_SIGN ? X502_ERR_OK \
: X502_ERR_INVALID_CONFIG_HANDLE : X502_ERR_INVALID_CONFIG_HANDLE)
#define IP_ADDR_TO_UINT32(addr, dword) ((dword) = ((uint32_t)addr[0] << 24) | \
((uint32_t)addr[1] << 16) | \
((uint32_t)addr[2] << 8) | \
addr[3]);
#define IP_UINT32_TO_ADDR(dword, addr) do { \
addr[0] = (dword >> 24) & 0xFF; \
addr[1] = (dword >> 16) & 0xFF; \
addr[2] = (dword >> 8) & 0xFF; \
addr[3] = (dword) & 0xFF; \
} while(0)
typedef struct st_e502_eth_config_state {
uint32_t sign;
uint32_t flags;
uint8_t factory_mac[E502_ETHCONFIG_MAC_ADDR_SIZE];
t_e502_eth_set_config_params params;
} t_e502_eth_config_state;
X502_EXPORT(t_e502_eth_config_hnd) E502_EthConfigCreate(void) {
t_e502_eth_config_hnd cfg = calloc(1, sizeof(t_e502_eth_config_state));
if (cfg != NULL) {
cfg->sign = E502_ETH_CFG_SIGN;
}
return cfg;
}
X502_EXPORT(int32_t) E502_EthConfigCopy(t_e502_eth_config_hnd src_cfg, t_e502_eth_config_hnd dst_cfg) {
int32_t err = E502_ETH_CHECK_CFG(src_cfg);
if (err == X502_ERR_OK)
err = E502_ETH_CHECK_CFG(dst_cfg);
if (err == X502_ERR_OK) {
memcpy(dst_cfg, src_cfg, sizeof(t_e502_eth_config_state));
}
return err;
}
X502_EXPORT(int32_t) E502_EthConfigFree(t_e502_eth_config_hnd cfg) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK) {
memset(cfg, 0, sizeof(t_e502_eth_config_state));
free(cfg);
}
return err;
}
X502_EXPORT(int32_t) E502_EthConfigRead(t_x502_hnd hnd, t_e502_eth_config_hnd cfg) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK) {
err = X502_CHECK_HND_OPENED(hnd);
}
if (err == X502_ERR_OK) {
uint32_t recvd_size;
err = hnd->iface_hnd->gen_ioctl(hnd, E502_CM4_CMD_ETH_CFG_GET, 0,
NULL, 0, &cfg->params.cfg, sizeof(t_e502_eth_config), &recvd_size, 0);
if (err == X502_ERR_OK) {
cfg->flags = 0;
memcpy(cfg->factory_mac, hnd->info.factory_mac, sizeof(cfg->factory_mac));
}
}
return err;
}
X502_EXPORT(int32_t) E502_EthConfigWrite(t_x502_hnd hnd, t_e502_eth_config_hnd cfg, const char *passwd) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK) {
err = X502_CHECK_HND_OPENED(hnd);
}
if (err == X502_ERR_OK) {
if (passwd != NULL) {
strncpy(cfg->params.passwd, passwd, E502_ETHCONFIG_PASSWD_SIZE-1);
cfg->params.passwd[E502_ETHCONFIG_PASSWD_SIZE-1] = '\0';
} else {
cfg->params.passwd[0] = '\0';
}
err = hnd->iface_hnd->gen_ioctl(hnd, E502_CM4_CMD_ETH_CFG_SET, cfg->flags,
&cfg->params, sizeof(cfg->params),
NULL, 0, NULL, 0);
memset(cfg->params.passwd, 0, E502_ETHCONFIG_PASSWD_SIZE);
}
return err;
}
X502_EXPORT(int32_t) E502_EthConfigSetNewPassword(t_e502_eth_config_hnd cfg, const char *new_passwd) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK) {
cfg->flags |= E502_ETH_CONFIG_FLAGS_SET_NEW_PASSWD;
if (new_passwd != NULL) {
strncpy(cfg->params.new_passwd, new_passwd, E502_ETHCONFIG_PASSWD_SIZE);
cfg->params.new_passwd[E502_ETHCONFIG_PASSWD_SIZE-1] = '\0';
} else {
cfg->params.new_passwd[0] = '\0';
}
}
return err;
}
X502_EXPORT(int32_t) E502_EthConfigGetEnabled(t_e502_eth_config_hnd cfg, uint32_t *en) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
*en = cfg->params.cfg.flags & E502_ETH_FLAGS_IFACE_ENABLED;
return err;
}
X502_EXPORT(int32_t) E502_EthConfigSetEnabled(t_e502_eth_config_hnd cfg, uint32_t en) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK) {
if (en) {
cfg->params.cfg.flags |= E502_ETH_FLAGS_IFACE_ENABLED;
} else {
cfg->params.cfg.flags &= ~E502_ETH_FLAGS_IFACE_ENABLED;
}
}
return err;
}
X502_EXPORT(int32_t) E502_EthConfigGetAutoIPState(t_e502_eth_config_hnd cfg, uint32_t *state) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
*state = cfg->params.cfg.flags & E502_ETH_FLAGS_AUTO_IP_STATE_MASK;
return err;
}
X502_EXPORT(int32_t) E502_EthConfigGetAutoIPEnabled(t_e502_eth_config_hnd cfg, uint32_t *en) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
*en = cfg->params.cfg.flags & E502_ETH_FLAGS_AUTO_IP;
return err;
}
X502_EXPORT(int32_t) E502_EthConfigSetAutoIPEnabled(t_e502_eth_config_hnd cfg, uint32_t en) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK) {
if (en) {
cfg->params.cfg.flags |= E502_ETH_FLAGS_AUTO_IP;
} else {
cfg->params.cfg.flags &= ~E502_ETH_FLAGS_AUTO_IP;
}
}
return err;
}
X502_EXPORT(int32_t) E502_EthConfigGetUserMACEnabled(t_e502_eth_config_hnd cfg, uint32_t *en) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
*en = cfg->params.cfg.flags & E502_ETH_FLAGS_USER_MAC;
return err;
}
X502_EXPORT(int32_t) E502_EthConfigSetUserMACEnabled(t_e502_eth_config_hnd cfg, uint32_t en) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK) {
if (en) {
cfg->params.cfg.flags |= E502_ETH_FLAGS_USER_MAC;
} else {
cfg->params.cfg.flags &= ~E502_ETH_FLAGS_USER_MAC;
}
}
return err;
}
X502_EXPORT(int32_t) E502_EthConfigGetIPv4Addr(t_e502_eth_config_hnd cfg, uint32_t *addr) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
IP_ADDR_TO_UINT32(cfg->params.cfg.ipv4.addr, *addr);
return err;
}
X502_EXPORT(int32_t) E502_EthConfigSetIPv4Addr(t_e502_eth_config_hnd cfg, uint32_t addr) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
IP_UINT32_TO_ADDR(addr, cfg->params.cfg.ipv4.addr);
return err;
}
X502_EXPORT(int32_t) E502_EthConfigGetIPv4Mask(t_e502_eth_config_hnd cfg, uint32_t *mask) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
IP_ADDR_TO_UINT32(cfg->params.cfg.ipv4.mask, *mask);
return err;
}
X502_EXPORT(int32_t) E502_EthConfigSetIPv4Mask(t_e502_eth_config_hnd cfg, uint32_t mask) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
IP_UINT32_TO_ADDR(mask, cfg->params.cfg.ipv4.mask);
return err;
}
X502_EXPORT(int32_t) E502_EthConfigGetIPv4Gate(t_e502_eth_config_hnd cfg, uint32_t *gate) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
IP_ADDR_TO_UINT32(cfg->params.cfg.ipv4.gate, *gate);
return err;
}
X502_EXPORT(int32_t) E502_EthConfigSetIPv4Gate(t_e502_eth_config_hnd cfg, uint32_t gate) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
IP_UINT32_TO_ADDR(gate, cfg->params.cfg.ipv4.gate);
return err;
}
X502_EXPORT(int32_t) E502_EthConfigGetUserMac(t_e502_eth_config_hnd cfg, uint8_t *mac) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
memcpy(mac, cfg->params.cfg.mac, E502_ETHCONFIG_MAC_ADDR_SIZE);
return err;
}
X502_EXPORT(int32_t) E502_EthConfigSetUserMac(t_e502_eth_config_hnd cfg, const uint8_t *mac) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
memcpy(cfg->params.cfg.mac, mac, E502_ETHCONFIG_MAC_ADDR_SIZE);
return err;
}
X502_EXPORT(int32_t) E502_EthConfigGetFactoryMac(t_e502_eth_config_hnd cfg, uint8_t *mac) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
memcpy(mac, cfg->factory_mac, E502_ETHCONFIG_MAC_ADDR_SIZE);
return err;
}
X502_EXPORT(int32_t) E502_EthConfigGetInstanceName(t_e502_eth_config_hnd cfg, char *name) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK) {
strncpy(name, cfg->params.cfg.inst_name, E502_ETHCONFIG_INSTANCE_NAME_SIZE);
name[E502_ETHCONFIG_INSTANCE_NAME_SIZE-1] = '\0';
}
return err;
}
X502_EXPORT(int32_t) E502_EthConfigSetInstanceName(t_e502_eth_config_hnd cfg, const char *name) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK) {
if (name != NULL) {
strncpy(cfg->params.cfg.inst_name, name, E502_ETHCONFIG_INSTANCE_NAME_SIZE);
cfg->params.cfg.inst_name[E502_ETHCONFIG_INSTANCE_NAME_SIZE-1] = '\0';
} else {
cfg->params.cfg.inst_name[0] = '\0';
}
}
return err;
}
X502_EXPORT(int32_t) E502_EthConfigSetTcpCmdPort(t_e502_eth_config_hnd cfg, uint16_t port) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK) {
cfg->params.cfg.tcp_cmd_port = port;
}
return err;
}
X502_EXPORT(int32_t) E502_EthConfigSetTcpDataPort(t_e502_eth_config_hnd cfg, uint16_t port) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK) {
cfg->params.cfg.tcp_data_port = port;
}
return err;
}
X502_EXPORT(int32_t) E502_EthConfigGetTcpCmdPort(t_e502_eth_config_hnd cfg, uint16_t *port) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
*port = cfg->params.cfg.tcp_cmd_port;
return err;
}
X502_EXPORT(int32_t) E502_EthConfigGetTcpDataPort(t_e502_eth_config_hnd cfg, uint16_t *port) {
int32_t err = E502_ETH_CHECK_CFG(cfg);
if (err == X502_ERR_OK)
*port = cfg->params.cfg.tcp_data_port;
return err;
}