#pragma once #include #include #include #include #include namespace w6300 { constexpr int SOCK_COUNT = 8; enum class socket_id : uint8_t {}; enum class port_num : uint16_t {}; enum class sock_error : int16_t { busy = 0, sock_num = -1, sock_opt = -2, sock_init = -3, sock_closed = -4, sock_mode = -5, sock_flag = -6, sock_status = -7, arg = -10, port_zero = -11, ip_invalid = -12, timeout = -13, data_len = -14, buffer = -15, fatal_packlen = -1001, }; enum class protocol : uint8_t { tcp = 0x01, udp = 0x02, ipraw = 0x03, macraw = 0x07, tcp6 = 0x09, udp6 = 0x0A, ipraw6 = 0x0B, tcp_dual = 0x0D, udp_dual = 0x0E, }; enum class sock_flag : uint8_t { none = 0, multi_enable = 1 << 7, ether_own = 1 << 7, broad_block = 1 << 6, tcp_fpsh = 1 << 6, tcp_nodelay = 1 << 5, igmp_ver2 = 1 << 5, solicit_block = 1 << 5, ether_multi4b = 1 << 5, uni_block = 1 << 4, ether_multi6b = 1 << 4, force_arp = 1 << 0, dha_manual = 1 << 1, io_nonblock = 1 << 3, }; constexpr sock_flag operator|(sock_flag a, sock_flag b) { return static_cast(static_cast(a) | static_cast(b)); } constexpr uint8_t operator&(sock_flag a, sock_flag b) { return static_cast(a) & static_cast(b); } enum class pack_info : uint8_t { none = 0x00, first = 1 << 1, remained = 1 << 2, completed = 1 << 3, ipv6_lla = (1 << 7) | (1 << 4), ipv6_multi = (1 << 7) | (1 << 5), ipv6_allnode = (1 << 7) | (1 << 6), ipv6 = 1 << 7, }; constexpr pack_info operator|(pack_info a, pack_info b) { return static_cast(static_cast(a) | static_cast(b)); } constexpr uint8_t operator&(pack_info a, pack_info b) { return static_cast(a) & static_cast(b); } enum class srcv6_prefer : uint8_t { auto_select = 0x00, lla = 0x02, gua = 0x03, }; enum class tcp_sock_info : uint8_t { mode = 1 << 2, op = 1 << 1, sip = 1 << 0, }; enum class sock_io_mode : uint8_t { block = 0, nonblock = 1, }; enum intr_kind : uint32_t { IK_PPPOE_TERMINATED = (1 << 0), IK_DEST_UNREACH = (1 << 1), IK_IP_CONFLICT = (1 << 2), IK_DEST_UNREACH6 = (1 << 4), IK_WOL = (1 << 7), IK_NET_ALL = 0x97, IK_SOCK_0 = (1 << 8), IK_SOCK_1 = (1 << 9), IK_SOCK_2 = (1 << 10), IK_SOCK_3 = (1 << 11), IK_SOCK_4 = (1 << 12), IK_SOCK_5 = (1 << 13), IK_SOCK_6 = (1 << 14), IK_SOCK_7 = (1 << 15), IK_SOCK_ALL = (0xFF << 8), IK_SOCKL_TOUT = (1 << 16), IK_SOCKL_ARP4 = (1 << 17), IK_SOCKL_PING4 = (1 << 18), IK_SOCKL_ARP6 = (1 << 19), IK_SOCKL_PING6 = (1 << 20), IK_SOCKL_NS = (1 << 21), IK_SOCKL_RS = (1 << 22), IK_SOCKL_RA = (1 << 23), IK_SOCKL_ALL = (0xFF << 16), IK_INT_ALL = 0x00FFFF97 }; struct phy_conf { uint8_t by; uint8_t mode; uint8_t speed; uint8_t duplex; }; enum ipconf_mode : uint8_t { NETINFO_NONE = 0x00, NETINFO_STATIC_V4 = 0x01, NETINFO_STATIC_V6 = 0x02, NETINFO_STATIC_ALL = 0x03, NETINFO_SLAAC_V6 = 0x04, NETINFO_DHCP_V4 = 0x10, NETINFO_DHCP_V6 = 0x20, NETINFO_DHCP_ALL = 0x30 }; enum dhcp_mode : uint8_t { NETINFO_STATIC = 1, NETINFO_DHCP }; struct net_info { std::array mac; std::array ip; std::array sn; std::array gw; std::array lla; std::array gua; std::array sn6; std::array gw6; std::array dns; std::array dns6; ipconf_mode ipmode; dhcp_mode dhcp; }; enum netmode_type : uint32_t { NM_IPB_V4 = (1 << 0), NM_IPB_V6 = (1 << 1), NM_WOL = (1 << 2), NM_PB6_MULTI = (1 << 4), NM_PB6_ALLNODE = (1 << 5), NM_MR_MASK = 0x37, NM_PPPoE = (1 << 8), NM_DHA_SELECT = (1 << 15), NM_MR2_MASK = (0x09 << 8), NM_PB4_ALL = (1 << 16), NM_TRSTB_V4 = (1 << 17), NM_PARP_V4 = (1 << 18), NM_UNRB_V4 = (1 << 19), NM_NET4_MASK = (0x0F << 16), NM_PB6_ALL = (1 << 24), NM_TRSTB_V6 = (1 << 25), NM_PARP_V6 = (1 << 26), NM_UNRB_V6 = (1 << 27), NM_NET6_MASK = (0x0F << 24), NM_MASK_ALL = 0x0F0F0937 }; struct net_timeout { uint8_t s_retry_cnt; uint16_t s_time_100us; uint8_t sl_retry_cnt; uint16_t sl_time_100us; }; struct ip_address { std::array ip; uint8_t len; }; struct prefix { uint8_t len; uint8_t flag; uint32_t valid_lifetime; uint32_t preferred_lifetime; std::array prefix; }; struct arp_request { ip_address destinfo; std::array dha; }; struct ping_request { uint16_t id; uint16_t seq; ip_address destinfo; }; void init_spi(); void init_critical_section(); void reset(); void init(); bool check(); void init_net(net_info info); void soft_reset(); int8_t init_buffers(uint8_t* txsize, uint8_t* rxsize); void clear_interrupt(intr_kind intr); intr_kind get_interrupt(); void set_interrupt_mask(intr_kind intr); intr_kind get_interrupt_mask(); int8_t get_phy_link(); int8_t get_phy_power_mode(); void reset_phy(); void set_phy_conf(phy_conf* conf); void get_phy_conf(phy_conf* conf); void get_phy_status(phy_conf* conf); void set_phy_power_mode(uint8_t pmode); void set_net_info(net_info* info); void get_net_info(net_info* info); void set_net_mode(netmode_type mode); netmode_type get_net_mode(); void set_timeout(net_timeout* timeout); void get_timeout(net_timeout* timeout); int8_t send_arp(arp_request* arp); int8_t send_ping(ping_request* ping); int8_t send_dad(uint8_t* ipv6); int8_t send_slaac(prefix* pfx); int8_t send_unsolicited(); int8_t get_prefix(prefix* pfx); std::expected open_socket(socket_id sn, protocol proto, port_num port, sock_flag flag); std::expected close(socket_id sn); std::expected listen(socket_id sn); std::expected disconnect(socket_id sn); std::expected send(socket_id sn, std::span buf); std::expected recv(socket_id sn, std::span buf); std::expected connect(socket_id sn, uint8_t* addr, port_num port, uint8_t addrlen); std::expected sendto(socket_id sn, std::span buf, uint8_t* addr, port_num port, uint8_t addrlen); std::expected recvfrom(socket_id sn, std::span buf, uint8_t* addr, port_num* port, uint8_t* addrlen); std::expected set_socket_io_mode(socket_id sn, sock_io_mode mode); sock_io_mode get_socket_io_mode(socket_id sn); uint16_t get_socket_max_tx(socket_id sn); uint16_t get_socket_max_rx(socket_id sn); std::expected clear_socket_interrupt(socket_id sn, uint8_t flags); uint8_t get_socket_interrupt(socket_id sn); std::expected set_socket_interrupt_mask(socket_id sn, uint8_t mask); uint8_t get_socket_interrupt_mask(socket_id sn); std::expected set_socket_prefer(socket_id sn, srcv6_prefer pref); srcv6_prefer get_socket_prefer(socket_id sn); void set_socket_ttl(socket_id sn, uint8_t ttl); uint8_t get_socket_ttl(socket_id sn); void set_socket_tos(socket_id sn, uint8_t tos); uint8_t get_socket_tos(socket_id sn); void set_socket_mss(socket_id sn, uint16_t mss); uint16_t get_socket_mss(socket_id sn); void set_socket_dest_ip(socket_id sn, const ip_address& addr); ip_address get_socket_dest_ip(socket_id sn); void set_socket_dest_port(socket_id sn, port_num port); port_num get_socket_dest_port(socket_id sn); std::expected send_keepalive(socket_id sn); void set_socket_keepalive_auto(socket_id sn, uint8_t interval); uint8_t get_socket_keepalive_auto(socket_id sn); uint16_t get_socket_send_buf(socket_id sn); uint16_t get_socket_recv_buf(socket_id sn); uint8_t get_socket_status(socket_id sn); uint8_t get_socket_ext_status(socket_id sn); uint8_t get_socket_mode(socket_id sn); uint16_t get_socket_remain_size(socket_id sn); pack_info get_socket_pack_info(socket_id sn); std::optional peek_socket_msg(socket_id sn, std::span submsg); } // namespace w6300