netdev_api.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // SPDX-License-Identifier: Apache-2.0
  2. // Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "netdev_api.h"
  15. /**
  16. * @brief init network interface
  17. * @param None
  18. * @retval STM_OK/STM_FAIL
  19. */
  20. int network_init(void)
  21. {
  22. netdev_stub_init();
  23. return STM_OK;
  24. }
  25. /**
  26. * @brief open and return network interface handle
  27. * @param if_name - interfae to open
  28. * net_rx_callback - callback called on incoming data
  29. * @retval handle of network interface
  30. */
  31. struct network_handle * network_open(char *if_name, void (* net_rx_callback)(struct network_handle *))
  32. {
  33. struct netdev *ndev = NULL;
  34. struct network_handle *net_handle = NULL;
  35. if (!if_name)
  36. return NULL;
  37. ndev = netdev_stub_get(if_name);
  38. if (!ndev) {
  39. printf ("Invalid interface name\n");
  40. return NULL;
  41. }
  42. /* create network handle */
  43. net_handle = malloc(sizeof(struct network_handle));
  44. net_handle->ndev = ndev;
  45. net_handle->net_rx_callback = net_rx_callback;
  46. if (netdev_stub_open(ndev)) {
  47. printf ("Failed to setup netdev\n");
  48. free(net_handle);
  49. return NULL;
  50. }
  51. ndev->net_handle = net_handle;
  52. return net_handle;
  53. }
  54. /**
  55. * @brief read from network interface
  56. * @param handle - network interface handle
  57. * net_rx_callback - callback called on incoming data
  58. * timeout - wait for ticks
  59. * @retval buffer read
  60. */
  61. struct pbuf * network_read(struct network_handle *handle, rt_int32_t timeout)
  62. {
  63. struct pbuf *buffer = NULL;
  64. if (!handle || !handle->ndev)
  65. return NULL;
  66. buffer = malloc(sizeof(struct pbuf));
  67. if (!buffer)
  68. return NULL;
  69. if (rt_mq_recv(handle->ndev->rx_q, buffer, sizeof(struct pbuf), timeout) != sizeof(struct pbuf)) {
  70. printf ("Failed to read from network\n");
  71. free(buffer);
  72. return NULL;
  73. }
  74. return buffer;
  75. }
  76. /**
  77. * @brief write onnetwork interface
  78. * @param handle - network interface handle
  79. * buffer - buffer to transmit
  80. * @retval 0 on success
  81. */
  82. int network_write(struct network_handle *net_handle, struct pbuf *buffer)
  83. {
  84. struct netdev *ndev;
  85. int ret;
  86. if (!net_handle || !buffer)
  87. return STM_FAIL;
  88. ndev = net_handle->ndev;
  89. if (ndev && (ndev->state == NETDEV_STATE_UP)) {
  90. if (ndev->net_ops && ndev->net_ops->netdev_xmit) {
  91. ret = ndev->net_ops->netdev_xmit(ndev, buffer);
  92. }
  93. }
  94. return ret;
  95. }
  96. /**
  97. * @brief close network interface
  98. * @param handle - network interface handle
  99. * @retval 0 on success
  100. */
  101. int network_close(struct network_handle *net_handle)
  102. {
  103. netdev_stub_close(net_handle->ndev);
  104. free(net_handle);
  105. return STM_OK;
  106. }
  107. /**
  108. * @brief destroy network interface
  109. * @param None
  110. * @retval None
  111. */
  112. int network_deinit(void)
  113. {
  114. return STM_OK;
  115. }