1From be288b60278c78eccfd347aacf4d3dd8771215a9 Mon Sep 17 00:00:00 2001
2From: Marc Gonzalez <marc_gonzalez@sigmadesigns.com>
3Date: Tue, 12 Jan 2016 14:01:42 +0100
4Subject: [PATCH] Port one/one_udp.c to Linux 4.1
5
6Kernel commit c0371da6047a replaced msg_iov and msg_iovlen with msg_iter
7in struct msghdr since 3.19
8
9one/one_udp.c: In function 'ksocket_send_iov':
10one/one_udp.c:186:9: error: 'struct msghdr' has no member named 'msg_iov'
11one/one_udp.c:187:9: error: 'struct msghdr' has no member named 'msg_iovlen'
12
13one/one_udp.c: In function 'ksocket_receive':
14one/one_udp.c:221:9: error: 'struct msghdr' has no member named 'msg_iov'
15one/one_udp.c:222:9: error: 'struct msghdr' has no member named 'msg_iovlen'
16
17The iov_iter interface
18https://lwn.net/Articles/625077/
19
20Kernel commit d8725c86aeba dropped the len parameter in sock_sendmsg
21since 4.1
22
23one/one_udp.c: In function 'ksocket_send_iov':
24one/one_udp.c:192:13: error: too many arguments to function 'sock_sendmsg'
25
26Signed-off-by: Marc Gonzalez <marc_gonzalez@sigmadesigns.com>
27
28Kernel commit 2da62906b1e29 dropped the size parameter in sock_recvmsg
29since 4.7
30
31In function 'ksocket_receive'
32one/one_udp.c:235:13: error: too many arguments to function 'sock_recvmsg'
33
34Signed-off-by: Matthew Shyu <matthew.shyu@amlogic.com>
35---
36 one/one_udp.c | 34 +++++++++++++++++++---------------
37 1 file changed, 19 insertions(+), 15 deletions(-)
38
39diff --git a/one/one_udp.c b/one/one_udp.c
40index 26b9e6a..9b59529 100644
41--- a/one/one_udp.c
42+++ b/one/one_udp.c
43@@ -161,7 +161,7 @@ ksocket_send_iov( struct socket      *sock,
44                   const struct iovec *iov,
45                   size_t              iov_count )
46 {
47-     struct msghdr msg;
48+     struct msghdr msg = { addr, sizeof *addr };
49      mm_segment_t oldfs;
50      int size = 0;
51      size_t len = 0;
52@@ -178,18 +178,20 @@ ksocket_send_iov( struct socket      *sock,
53      for (i=0; i<iov_count; i++)
54           len += iov[i].iov_len;
55
56-     msg.msg_flags = 0;
57-     msg.msg_name = addr;
58-     msg.msg_namelen  = sizeof(struct sockaddr_in);
59-     msg.msg_control = NULL;
60-     msg.msg_controllen = 0;
61+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) // commit c0371da6047a
62      msg.msg_iov = (struct iovec*) iov;
63      msg.msg_iovlen = iov_count;
64-     msg.msg_control = NULL;
65+#else
66+     iov_iter_init(&msg.msg_iter, WRITE, iov, iov_count, len);
67+#endif
68
69      oldfs = get_fs();
70      set_fs(KERNEL_DS);
71-     size = sock_sendmsg(sock,&msg,len);
72+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0) // commit d8725c86aeba
73+     size = sock_sendmsg(sock, &msg, len);
74+#else
75+     size = sock_sendmsg(sock, &msg);
76+#endif
77      set_fs(oldfs);
78
79      return size;
80@@ -198,7 +200,7 @@ ksocket_send_iov( struct socket      *sock,
81 static int
82 ksocket_receive(struct socket* sock, struct sockaddr_in* addr, void *buf, int len)
83 {
84-     struct msghdr msg;
85+     struct msghdr msg = { addr, sizeof *addr };
86      struct iovec iov;
87      mm_segment_t oldfs;
88      int size = 0;
89@@ -213,18 +215,20 @@ ksocket_receive(struct socket* sock, struct sockaddr_in* addr, void *buf, int le
90      iov.iov_base = buf;
91      iov.iov_len = len;
92
93-     msg.msg_flags = 0;
94-     msg.msg_name = addr;
95-     msg.msg_namelen  = sizeof(struct sockaddr_in);
96-     msg.msg_control = NULL;
97-     msg.msg_controllen = 0;
98+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) // commit c0371da6047a
99      msg.msg_iov = &iov;
100      msg.msg_iovlen = 1;
101-     msg.msg_control = NULL;
102+#else
103+     iov_iter_init(&msg.msg_iter, READ, &iov, 1, len);
104+#endif
105
106      oldfs = get_fs();
107      set_fs(KERNEL_DS);
108+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0) // commit 2da62906b1e29
109      size = sock_recvmsg(sock,&msg,len,msg.msg_flags);
110+#else
111+     size = sock_recvmsg(sock, &msg,msg.msg_flags);
112+#endif
113      set_fs(oldfs);
114
115      return size;
116--
1172.11.0
118
119