#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static void mod_data_ready(struct sock *sk, int len) { printk("data_ready callback\n"); } static void mod_state_change(struct sock *sk) { printk("state_change callback\n"); } static void mod_write_space(struct sock *sk) { printk("write_space callback\n"); } static struct socket *sock; static inline int mod_rcv_msg() { unsigned char buf[4]; struct msghdr msg; mm_segment_t oldfs; int result; struct iovec iov; iov.iov_base = &buf[0]; iov.iov_len = 1; msg.msg_flags = MSG_DONTWAIT; msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_control = NULL; msg.msg_controllen = 0; oldfs = get_fs(); set_fs(get_ds()); result = sock_recvmsg(sock, &msg, 1, MSG_DONTWAIT); set_fs(oldfs); printk("Receiving message %c %d bytes long\n", buf[0], result); return result; } int init_module(void) { struct sockaddr_in sap; int err; int i; sap.sin_family = AF_INET; sap.sin_port = 13570; sap.sin_addr.s_addr = 16777343; if ((err = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock)) < 0) { printk("can't create socket (%d).\n", -err); return -1; } sock->sk->data_ready = mod_data_ready; sock->sk->state_change = mod_state_change; sock->sk->write_space = mod_write_space; err = sock->ops->connect(sock, (struct sockaddr *) &sap, sizeof(struct sockaddr_in), 0); if (err < 0) { sock_release(sock); printk("TCP connect failed (%d).\n", -err); return -1; } for (i=0;i<10;i++) mod_rcv_msg(); return 0; } void cleanup_module(void) { sock_release(sock); }