RyanW5500netDev.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. #include "RyanW5500Store.h"
  2. /**
  3. * @brief link up
  4. *
  5. * @param netdev
  6. * @return int
  7. */
  8. static int RyanW5500NetdevSetUp(struct netdev *netdev)
  9. {
  10. netdev_low_level_set_status(netdev, RT_TRUE);
  11. return RT_EOK;
  12. }
  13. /**
  14. * @brief link down
  15. *
  16. * @param netdev
  17. * @return int
  18. */
  19. static int RyanW5500NetdevSetDown(struct netdev *netdev)
  20. {
  21. netdev_low_level_set_status(netdev, RT_FALSE);
  22. return RT_EOK;
  23. }
  24. /**
  25. * @brief set addr info
  26. *
  27. * @param netdev
  28. * @param ip_addr
  29. * @param netmask
  30. * @param gw
  31. * @return int
  32. */
  33. static int RyanW5500NetdevSetAddrInfo(struct netdev *netdev, ip_addr_t *ip_addr, ip_addr_t *netmask, ip_addr_t *gw)
  34. {
  35. RT_ASSERT(netdev);
  36. RT_ASSERT(ip_addr || netmask || gw);
  37. if (ip_addr)
  38. memcpy(gWIZNETINFO.ip, &ip_addr->addr, sizeof(gWIZNETINFO.ip));
  39. if (netmask)
  40. memcpy(gWIZNETINFO.sn, &netmask->addr, sizeof(gWIZNETINFO.sn));
  41. if (gw)
  42. memcpy(gWIZNETINFO.gw, &gw->addr, sizeof(gWIZNETINFO.gw));
  43. RyanW5500Entry.netDevFlag |= netDevSetDevInfo;
  44. netdev_low_level_set_link_status(netdev, RT_FALSE);
  45. return RT_EOK;
  46. }
  47. /**
  48. * @brief set dns server
  49. *
  50. * @param netdev
  51. * @param dns_num
  52. * @param dns_server
  53. * @return int
  54. */
  55. static int RyanW5500NetdevSetDnsServer(struct netdev *netdev, uint8_t dns_num, ip_addr_t *dns_server)
  56. {
  57. RT_ASSERT(netdev);
  58. RT_ASSERT(dns_server);
  59. if (0 != dns_num)
  60. return -RT_ERROR;
  61. RyanW5500Entry.netDevFlag |= netDevSetDevInfo;
  62. memcpy(gWIZNETINFO.dns, &dns_server->addr, sizeof(gWIZNETINFO.dns));
  63. netdev_low_level_set_link_status(netdev, RT_FALSE);
  64. return RT_EOK;
  65. }
  66. /**
  67. * @brief set dhcp
  68. *
  69. * @param netdev
  70. * @param is_enabled
  71. * @return int
  72. */
  73. static int RyanW5500NetdevSetDhcp(struct netdev *netdev, rt_bool_t is_enabled)
  74. {
  75. if (is_enabled)
  76. {
  77. RyanW5500Entry.netDevFlag |= netDevDHCPEnable;
  78. RyanW5500Entry.netDevFlag &= ~netDevDHCPDisable;
  79. }
  80. else
  81. {
  82. RyanW5500Entry.netDevFlag |= netDevDHCPDisable;
  83. RyanW5500Entry.netDevFlag &= ~netDevDHCPEnable;
  84. }
  85. netdev_low_level_set_dhcp_status(netdev, is_enabled);
  86. return RT_EOK;
  87. }
  88. /**
  89. * @brief ping
  90. *
  91. * @param netdev
  92. * @param host
  93. * @param data_len
  94. * @param timeout
  95. * @param ping_resp
  96. * @return int
  97. */
  98. // 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);
  99. static int RyanW5500NetdevPing(struct netdev *netdev, const char *host, size_t data_len, uint32_t timeout, struct netdev_ping_resp *ping_resp
  100. #if RT_VER_NUM >= 0x50100
  101. ,
  102. rt_bool_t is_bind
  103. #endif
  104. )
  105. {
  106. RT_ASSERT(netdev);
  107. RT_ASSERT(host);
  108. RT_ASSERT(ping_resp);
  109. return RyanW5500Ping(netdev, host, data_len, timeout, ping_resp);
  110. }
  111. /**
  112. * @brief 用于网卡网络连接信息和端口使用情况
  113. *
  114. * @param netdev
  115. * @return int
  116. */
  117. static void RyanW5500NetdevNetstat(struct netdev *netdev)
  118. {
  119. return;
  120. }
  121. // netdev设备操作
  122. const struct netdev_ops wiz_netdev_ops =
  123. {
  124. .set_up = RyanW5500NetdevSetUp,
  125. .set_down = RyanW5500NetdevSetDown,
  126. .set_addr_info = RyanW5500NetdevSetAddrInfo,
  127. .set_dns_server = RyanW5500NetdevSetDnsServer,
  128. .set_dhcp = RyanW5500NetdevSetDhcp,
  129. #ifdef RT_USING_FINSH
  130. .ping = RyanW5500NetdevPing,
  131. .netstat = RyanW5500NetdevNetstat,
  132. #endif
  133. };
  134. #ifdef SAL_USING_POSIX
  135. static int wiz_poll(struct dfs_fd *file, struct rt_pollreq *req)
  136. {
  137. int mask = 0;
  138. RyanW5500Socket *sock;
  139. struct sal_socket *sal_sock;
  140. sal_sock = sal_get_socket((int)file->data);
  141. if (!sal_sock)
  142. {
  143. return -1;
  144. }
  145. sock = RyanW5500GetSock((int)sal_sock->user_data);
  146. if (sock != NULL)
  147. {
  148. rt_base_t level;
  149. rt_poll_add(&sock->wait_head, req);
  150. level = rt_hw_interrupt_disable();
  151. if (sock->rcvevent)
  152. mask |= POLLIN;
  153. if (sock->sendevent)
  154. mask |= POLLOUT;
  155. if (sock->errevent)
  156. mask |= POLLERR;
  157. rt_hw_interrupt_enable(level);
  158. }
  159. return mask;
  160. }
  161. #endif
  162. /**
  163. * @brief socket操作
  164. *
  165. */
  166. static struct sal_socket_ops RyanW5500SocketOps =
  167. {
  168. .socket = wiz_socket,
  169. .closesocket = wiz_closesocket,
  170. .bind = wiz_bind,
  171. .listen = wiz_listen,
  172. .connect = wiz_connect,
  173. .accept = wiz_accept,
  174. .sendto = wiz_sendto,
  175. .recvfrom = wiz_recvfrom,
  176. .getsockopt = wiz_getsockopt,
  177. .setsockopt = wiz_setsockopt,
  178. .shutdown = wiz_shutdown,
  179. .getpeername = NULL,
  180. .getsockname = NULL,
  181. .ioctlsocket = NULL,
  182. #ifdef SAL_USING_POSIX
  183. .poll = wiz_poll,
  184. #endif
  185. };
  186. /**
  187. * @brief sal 网络数据库名称解析
  188. *
  189. */
  190. static const struct sal_netdb_ops RyanW5500NetdbOps =
  191. {
  192. .gethostbyname = wiz_gethostbyname,
  193. .gethostbyname_r = wiz_gethostbyname_r,
  194. .getaddrinfo = wiz_getaddrinfo,
  195. .freeaddrinfo = wiz_freeaddrinfo,
  196. };
  197. /**
  198. * @brief RyanW5500支持的协议族
  199. *
  200. */
  201. static const struct sal_proto_family RyanW5500Family =
  202. {
  203. .family = AF_WIZ,
  204. .sec_family = AF_INET,
  205. .skt_ops = &RyanW5500SocketOps,
  206. .netdb_ops = &RyanW5500NetdbOps,
  207. };
  208. /**
  209. * @brief RyanW5500注册到netdev
  210. *
  211. * @param netdev_name
  212. * @return struct netdev*
  213. */
  214. struct netdev *RyanW5500NetdevRegister(char *netdev_name)
  215. {
  216. struct netdev *netdev = NULL;
  217. netdev = (struct netdev *)malloc(sizeof(struct netdev));
  218. if (NULL == netdev)
  219. return NULL;
  220. memset(netdev, 0, sizeof(struct netdev));
  221. netdev->flags = 0; // 网络接口设备状态标志
  222. netdev->mtu = 1460; // 最大传输单位 (以字节为单位)
  223. netdev->hwaddr_len = 6; // 硬件地址长度 mac地址
  224. netdev->ops = &wiz_netdev_ops; // 网卡操作回调函数
  225. netdev->sal_user_data = (void *)&RyanW5500Family; // sal协议族相关参数
  226. if (0 != netdev_register(netdev, netdev_name, NULL))
  227. {
  228. free(netdev);
  229. return NULL;
  230. }
  231. return netdev;
  232. }