#include "e502api_private.h" #include "e502_eth_config.h" #include #include #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; }