| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- #include "RyanW5500Store.h"
- /**
- * @brief link up
- *
- * @param netdev
- * @return int
- */
- static int RyanW5500NetdevSetUp(struct netdev *netdev)
- {
- netdev_low_level_set_status(netdev, RT_TRUE);
- return RT_EOK;
- }
- /**
- * @brief link down
- *
- * @param netdev
- * @return int
- */
- static int RyanW5500NetdevSetDown(struct netdev *netdev)
- {
- netdev_low_level_set_status(netdev, RT_FALSE);
- return RT_EOK;
- }
- /**
- * @brief set addr info
- *
- * @param netdev
- * @param ip_addr
- * @param netmask
- * @param gw
- * @return int
- */
- static int RyanW5500NetdevSetAddrInfo(struct netdev *netdev, ip_addr_t *ip_addr, ip_addr_t *netmask, ip_addr_t *gw)
- {
- RT_ASSERT(netdev);
- RT_ASSERT(ip_addr || netmask || gw);
- if (ip_addr)
- memcpy(gWIZNETINFO.ip, &ip_addr->addr, sizeof(gWIZNETINFO.ip));
- if (netmask)
- memcpy(gWIZNETINFO.sn, &netmask->addr, sizeof(gWIZNETINFO.sn));
- if (gw)
- memcpy(gWIZNETINFO.gw, &gw->addr, sizeof(gWIZNETINFO.gw));
- RyanW5500Entry.netDevFlag |= netDevSetDevInfo;
- netdev_low_level_set_link_status(netdev, RT_FALSE);
- return RT_EOK;
- }
- /**
- * @brief set dns server
- *
- * @param netdev
- * @param dns_num
- * @param dns_server
- * @return int
- */
- static int RyanW5500NetdevSetDnsServer(struct netdev *netdev, uint8_t dns_num, ip_addr_t *dns_server)
- {
- RT_ASSERT(netdev);
- RT_ASSERT(dns_server);
- if (0 != dns_num)
- return -RT_ERROR;
- RyanW5500Entry.netDevFlag |= netDevSetDevInfo;
- memcpy(gWIZNETINFO.dns, &dns_server->addr, sizeof(gWIZNETINFO.dns));
- netdev_low_level_set_link_status(netdev, RT_FALSE);
- return RT_EOK;
- }
- /**
- * @brief set dhcp
- *
- * @param netdev
- * @param is_enabled
- * @return int
- */
- static int RyanW5500NetdevSetDhcp(struct netdev *netdev, rt_bool_t is_enabled)
- {
- if (is_enabled)
- {
- RyanW5500Entry.netDevFlag |= netDevDHCPEnable;
- RyanW5500Entry.netDevFlag &= ~netDevDHCPDisable;
- }
- else
- {
- RyanW5500Entry.netDevFlag |= netDevDHCPDisable;
- RyanW5500Entry.netDevFlag &= ~netDevDHCPEnable;
- }
- netdev_low_level_set_dhcp_status(netdev, is_enabled);
- return RT_EOK;
- }
- /**
- * @brief ping
- *
- * @param netdev
- * @param host
- * @param data_len
- * @param timeout
- * @param ping_resp
- * @return int
- */
- // int (*ping)(struct netdev *netdev, const char *host, size_t data_len, uint32_t timeout, struct netdev_ping_resp *ping_resp, rt_bool_t isbind);
- static int RyanW5500NetdevPing(struct netdev *netdev, const char *host, size_t data_len, uint32_t timeout, struct netdev_ping_resp *ping_resp
- #if RT_VER_NUM >= 0x50100
- ,
- rt_bool_t is_bind
- #endif
- )
- {
- RT_ASSERT(netdev);
- RT_ASSERT(host);
- RT_ASSERT(ping_resp);
- return RyanW5500Ping(netdev, host, data_len, timeout, ping_resp);
- }
- /**
- * @brief 用于网卡网络连接信息和端口使用情况
- *
- * @param netdev
- * @return int
- */
- static void RyanW5500NetdevNetstat(struct netdev *netdev)
- {
- return;
- }
- // netdev设备操作
- const struct netdev_ops wiz_netdev_ops =
- {
- .set_up = RyanW5500NetdevSetUp,
- .set_down = RyanW5500NetdevSetDown,
- .set_addr_info = RyanW5500NetdevSetAddrInfo,
- .set_dns_server = RyanW5500NetdevSetDnsServer,
- .set_dhcp = RyanW5500NetdevSetDhcp,
- #ifdef RT_USING_FINSH
- .ping = RyanW5500NetdevPing,
- .netstat = RyanW5500NetdevNetstat,
- #endif
- };
- #ifdef SAL_USING_POSIX
- static int wiz_poll(struct dfs_fd *file, struct rt_pollreq *req)
- {
- int mask = 0;
- RyanW5500Socket *sock;
- struct sal_socket *sal_sock;
- sal_sock = sal_get_socket((int)file->data);
- if (!sal_sock)
- {
- return -1;
- }
- sock = RyanW5500GetSock((int)sal_sock->user_data);
- if (sock != NULL)
- {
- rt_base_t level;
- rt_poll_add(&sock->wait_head, req);
- level = rt_hw_interrupt_disable();
- if (sock->rcvevent)
- mask |= POLLIN;
- if (sock->sendevent)
- mask |= POLLOUT;
- if (sock->errevent)
- mask |= POLLERR;
- rt_hw_interrupt_enable(level);
- }
- return mask;
- }
- #endif
- /**
- * @brief socket操作
- *
- */
- static struct sal_socket_ops RyanW5500SocketOps =
- {
- .socket = wiz_socket,
- .closesocket = wiz_closesocket,
- .bind = wiz_bind,
- .listen = wiz_listen,
- .connect = wiz_connect,
- .accept = wiz_accept,
- .sendto = wiz_sendto,
- .recvfrom = wiz_recvfrom,
- .getsockopt = wiz_getsockopt,
- .setsockopt = wiz_setsockopt,
- .shutdown = wiz_shutdown,
- .getpeername = NULL,
- .getsockname = NULL,
- .ioctlsocket = NULL,
- #ifdef SAL_USING_POSIX
- .poll = wiz_poll,
- #endif
- };
- /**
- * @brief sal 网络数据库名称解析
- *
- */
- static const struct sal_netdb_ops RyanW5500NetdbOps =
- {
- .gethostbyname = wiz_gethostbyname,
- .gethostbyname_r = wiz_gethostbyname_r,
- .getaddrinfo = wiz_getaddrinfo,
- .freeaddrinfo = wiz_freeaddrinfo,
- };
- /**
- * @brief RyanW5500支持的协议族
- *
- */
- static const struct sal_proto_family RyanW5500Family =
- {
- .family = AF_WIZ,
- .sec_family = AF_INET,
- .skt_ops = &RyanW5500SocketOps,
- .netdb_ops = &RyanW5500NetdbOps,
- };
- /**
- * @brief RyanW5500注册到netdev
- *
- * @param netdev_name
- * @return struct netdev*
- */
- struct netdev *RyanW5500NetdevRegister(char *netdev_name)
- {
- struct netdev *netdev = NULL;
- netdev = (struct netdev *)malloc(sizeof(struct netdev));
- if (NULL == netdev)
- return NULL;
- memset(netdev, 0, sizeof(struct netdev));
- netdev->flags = 0; // 网络接口设备状态标志
- netdev->mtu = 1460; // 最大传输单位 (以字节为单位)
- netdev->hwaddr_len = 6; // 硬件地址长度 mac地址
- netdev->ops = &wiz_netdev_ops; // 网卡操作回调函数
- netdev->sal_user_data = (void *)&RyanW5500Family; // sal协议族相关参数
- if (0 != netdev_register(netdev, netdev_name, NULL))
- {
- free(netdev);
- return NULL;
- }
- return netdev;
- }
|