📄 core.c
字号:
ssize_t _rtdm_recvmsg(rtdm_user_info_t *user_info, int fd, struct msghdr *msg, int flags){ MAJOR_FUNCTION_WRAPPER(recvmsg, msg, flags);}ssize_t _rtdm_sendmsg(rtdm_user_info_t *user_info, int fd, const struct msghdr *msg, int flags){ MAJOR_FUNCTION_WRAPPER(sendmsg, msg, flags);}int __init rtdm_core_init(void){ int i; fildes_table = (struct rtdm_fildes *) kmalloc(fd_count * sizeof(struct rtdm_fildes), GFP_KERNEL); if (!fildes_table) return -ENOMEM; memset(fildes_table, 0, fd_count * sizeof(struct rtdm_fildes)); for (i = 0; i < fd_count-1; i++) fildes_table[i].next = &fildes_table[i+1]; free_fildes = &fildes_table[0]; return 0;}#ifdef DOXYGEN_CPP /* Only used for doxygen doc generation *//** * @brief Increment context reference counter * * @param[in] context Device context * * @note rtdm_context_get() automatically increments the lock counter. You * only need to call this function in special scenrios. * * Environments: * * This service can be called from: * * - Kernel module initialization/cleanup code * - Interrupt service routine * - Kernel-based task * - User-space task (RT, non-RT) * * Rescheduling: never. */void rtdm_context_lock(struct rtdm_dev_context *context);/** * @brief Decrement context reference counter * * @param[in] context Device context * * @note Every successful call to rtdm_context_get() must be matched by a * rtdm_context_unlock() invocation. * * Environments: * * This service can be called from: * * - Kernel module initialization/cleanup code * - Interrupt service routine * - Kernel-based task * - User-space task (RT, non-RT) * * Rescheduling: never. */void rtdm_context_unlock(struct rtdm_dev_context *context);/** * @brief Open a device * * Refer to rt_dev_open() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */int rtdm_open(const char *path, int oflag, ...);/** * @brief Create a socket * * Refer to rt_dev_socket() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */int rtdm_socket(int protocol_family, int socket_type, int protocol);/** * @brief Close a device or socket * * Refer to rt_dev_close() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */int rtdm_close(int fd);/** * @brief Issue an IOCTL * * Refer to rt_dev_ioctl() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */int rtdm_ioctl(int fd, int request, ...);/** * @brief Read from device * * Refer to rt_dev_read() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */ssize_t rtdm_read(int fd, void *buf, size_t nbyte);/** * @brief Write to device * * Refer to rt_dev_write() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */ssize_t rtdm_write(int fd, const void *buf, size_t nbyte);/** * @brief Receive message from socket * * Refer to rt_dev_recvmsg() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */ssize_t rtdm_recvmsg(int fd, struct msghdr *msg, int flags);/** * @brief Receive message from socket * * Refer to rt_dev_recvfrom() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */ssize_t rtdm_recvfrom(int fd, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);/** * @brief Receive message from socket * * Refer to rt_dev_recv() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */ssize_t rtdm_recv(int fd, void *buf, size_t len, int flags);/** * @brief Transmit message to socket * * Refer to rt_dev_sendmsg() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */ssize_t rtdm_sendmsg(int fd, const struct msghdr *msg, int flags);/** * @brief Transmit message to socket * * Refer to rt_dev_sendto() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */ssize_t rtdm_sendto(int fd, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);/** * @brief Transmit message to socket * * Refer to rt_dev_send() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */ssize_t rtdm_send(int fd, const void *buf, size_t len, int flags);/** * @brief Bind to local address * * Refer to rt_dev_bind() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */int rtdm_bind(int fd, const struct sockaddr *my_addr, socklen_t addrlen);/** * @brief Connect to remote address * * Refer to rt_dev_connect() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */int rtdm_connect(int fd, const struct sockaddr *serv_addr, socklen_t addrlen);/** * @brief Listen for incomming connection requests * * Refer to rt_dev_listen() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */int rtdm_listen(int fd, int backlog);/** * @brief Accept a connection requests * * Refer to rt_dev_accept() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */int rtdm_accept(int fd, struct sockaddr *addr, socklen_t *addrlen);/** * @brief Shut down parts of a connection * * Refer to rt_dev_shutdown() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */int rtdm_shutdown(int fd, int how);/** * @brief Get socket option * * Refer to rt_dev_getsockopt() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */int rtdm_getsockopt(int fd, int level, int optname, void *optval, socklen_t *optlen);/** * @brief Set socket option * * Refer to rt_dev_setsockopt() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */int rtdm_setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen);/** * @brief Get local socket address * * Refer to rt_dev_getsockname() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */int rtdm_getsockname(int fd, struct sockaddr *name, socklen_t *namelen);/** * @brief Get socket destination address * * Refer to rt_dev_getpeername() for parameters and return values * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. */int rtdm_getpeername(int fd, struct sockaddr *name, socklen_t *namelen);/** @} *//*! * @addtogroup userapi * @{ *//** * @brief Open a device * * @param[in] path Device name * @param[in] oflag Open flags * @param ... Further parameters will be ignored. * * @return Positive file descriptor value on success, otherwise a negative * error code. * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. * * @see @c open() in IEEE Std 1003.1, * http://www.opengroup.org/onlinepubs/009695399 */int rt_dev_open(const char *path, int oflag, ...);/** * @brief Create a socket * * @param[in] protocol_family Protocol family (@c PF_xxx) * @param[in] socket_type Socket type (@c SOCK_xxx) * @param[in] protocol Protocol ID, 0 for default * * @return Positive file descriptor value on success, otherwise a negative * error code. * * Environments: * * Depends on driver implementation, see @ref profiles "Device Profiles". * * Rescheduling: possible. * * @see @c socket() in IEEE Std 1003.1, * http://www.opengroup.org/onlinepubs/009695399 */int rt_dev_socket(int protocol_family, int socket_type, int protocol);/** * @brief Close a device or socket * * @param[in] fd File descriptor as returned by rt_dev_open() or rt_dev_socket() * * @return 0 on success, otherwise a negative error code. * * @note If the matching rt_dev_open() or rt_dev_socket() call took place in * non-real-time context, rt_dev_close() must be issued within non-real-time
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -