RyanW5500netDev.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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. RyanW5500Entry.netDevFlag |= netDevDHCP;
  76. netdev_low_level_set_dhcp_status(netdev, is_enabled);
  77. netdev_low_level_set_link_status(netdev, RT_FALSE);
  78. return RT_EOK;
  79. }
  80. /**
  81. * @brief ping
  82. *
  83. * @param netdev
  84. * @param host
  85. * @param data_len
  86. * @param timeout
  87. * @param ping_resp
  88. * @return int
  89. */
  90. static int RyanW5500NetdevPing(struct netdev *netdev, const char *host, size_t data_len, uint32_t timeout, struct netdev_ping_resp *ping_resp)
  91. {
  92. RT_ASSERT(netdev);
  93. RT_ASSERT(host);
  94. RT_ASSERT(ping_resp);
  95. return RyanW5500Ping(netdev, host, data_len, timeout, ping_resp);
  96. }
  97. /**
  98. * @brief 用于网卡网络连接信息和端口使用情况
  99. *
  100. * @param netdev
  101. * @return int
  102. */
  103. static int RyanW5500NetdevNetstat(struct netdev *netdev)
  104. {
  105. return 0;
  106. }
  107. // netdev设备操作
  108. const struct netdev_ops wiz_netdev_ops =
  109. {
  110. .set_up = RyanW5500NetdevSetUp,
  111. .set_down = RyanW5500NetdevSetDown,
  112. .set_addr_info = RyanW5500NetdevSetAddrInfo,
  113. .set_dns_server = RyanW5500NetdevSetDnsServer,
  114. .set_dhcp = RyanW5500NetdevSetDhcp,
  115. #ifdef RT_USING_FINSH
  116. .ping = RyanW5500NetdevPing,
  117. .netstat = RyanW5500NetdevNetstat,
  118. #endif
  119. };
  120. /**
  121. * @brief socket操作
  122. *
  123. */
  124. static struct sal_socket_ops RyanW5500SocketOps =
  125. {
  126. .socket = wiz_socket,
  127. .closesocket = wiz_closesocket,
  128. .bind = wiz_bind,
  129. .listen = wiz_listen,
  130. .connect = wiz_connect,
  131. .accept = wiz_accept,
  132. .sendto = wiz_sendto,
  133. .recvfrom = wiz_recvfrom,
  134. .getsockopt = wiz_getsockopt,
  135. .setsockopt = wiz_setsockopt,
  136. .shutdown = wiz_shutdown,
  137. .getpeername = NULL,
  138. .getsockname = NULL,
  139. .ioctlsocket = NULL,
  140. // #ifdef SAL_USING_POSIX
  141. // wiz_poll,
  142. // #endif /* SAL_USING_POSIX */
  143. };
  144. /**
  145. * @brief sal 网络数据库名称解析
  146. *
  147. */
  148. static const struct sal_netdb_ops RyanW5500NetdbOps =
  149. {
  150. .gethostbyname = wiz_gethostbyname,
  151. .gethostbyname_r = wiz_gethostbyname_r,
  152. .getaddrinfo = wiz_getaddrinfo,
  153. .freeaddrinfo = wiz_freeaddrinfo,
  154. };
  155. /**
  156. * @brief RyanW5500支持的协议族
  157. *
  158. */
  159. static const struct sal_proto_family RyanW5500Family =
  160. {
  161. .family = AF_WIZ,
  162. .sec_family = AF_INET,
  163. .skt_ops = &RyanW5500SocketOps,
  164. .netdb_ops = &RyanW5500NetdbOps,
  165. };
  166. /**
  167. * @brief RyanW5500注册到netdev
  168. *
  169. * @param netdev_name
  170. * @return struct netdev*
  171. */
  172. struct netdev *RyanW5500NetdevRegister(const char *netdev_name)
  173. {
  174. struct netdev *netdev = NULL;
  175. netdev = (struct netdev *)malloc(sizeof(struct netdev));
  176. if (NULL == netdev)
  177. return NULL;
  178. memset(netdev, 0, sizeof(struct netdev));
  179. netdev->flags = 0; // 网络接口设备状态标志
  180. netdev->mtu = 1460; // 最大传输单位 (以字节为单位)
  181. netdev->hwaddr_len = 6; // 硬件地址长度 mac地址
  182. netdev->ops = &wiz_netdev_ops; // 网卡操作回调函数
  183. netdev->sal_user_data = (void *)&RyanW5500Family; // sal协议族相关参数
  184. if (0 != netdev_register(netdev, netdev_name, NULL))
  185. {
  186. free(netdev);
  187. return NULL;
  188. }
  189. return netdev;
  190. }