<div dir="ltr"><div><font face="arial, sans-serif">Hey everyone,</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">I am trying to develop a linux kernel module. One of the task that it has is to send a UDP packet to the broadcast address of</font></div><div><font face="arial, sans-serif">a network interface. I have attached the dmesg logs below. For some reason it is able to bind to the address but it is not able</font></div><div><font face="arial, sans-serif">to send the packet. It shows EFAULT. Please advise.</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">Thank you in advance.</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">16 static struct socket *sd_listener_sock = NULL;<br>17 static struct sockaddr_in sd_listener_sin;<br>18 static struct socket *sd_brdcst_sock = NULL;<br>19 static struct sockaddr_in sd_brdcst_sin;<br></font></div><div><font face="monospace">...</font></div><div><font face="monospace">106 static int __init onekfs_sd_brdcst_init(void)<br>107 {<br>108         int sd_err = 0;<br>109         int enable_brodcast = 1;<br>110         sockptr_t enable_brdcst;<br>111<br>112         /* Get socket */<br>113<br>114         sd_err = sock_create_kern(&init_net, AF_INET, SOCK_DGRAM, 0, &sd_brdcst_sock);<br>115         if (sd_err < 0) {<br>116                 printk(KERN_ERR "onekfs: Failed to create broadcast socket: %d\n", sd_err);<br>117                 goto errout;<br>118         }<br>119<br>120         /* Enable broadcast */<br>121         enable_brdcst.is_kernel = 1;<br>122         enable_brdcst.kernel = &enable_brodcast;<br>123         sd_err = sock_setsockopt(sd_brdcst_sock, SOL_SOCKET,<br>124                                  SO_BROADCAST, enable_brdcst,<br>125                                  sizeof(enable_brdcst));<br>126         if (sd_err < 0) {<br>127                 printk(KERN_ERR "onekfs: Could not set up broadcast: %d\n", sd_err);<br>128                 goto errout_with_socket;<br>129         }<br>130<br>131         /* Bind to port */<br>132         memset(&sd_brdcst_sin, 0, sizeof(struct sockaddr_in));<br>133<br>134         sd_brdcst_sin.sin_family = AF_INET;<br>135         sd_brdcst_sin.sin_port = htons(ONEKFS_PORT + 1);<br>136         sd_brdcst_sin.sin_addr.s_addr = htonl(onekfs_brdcst_addr);<br>137         // sd_brdcst_sin.sin_addr.s_addr = onekfs_brdcst_addr;<br>138<br>139         sd_err = sd_brdcst_sock->ops->bind(sd_brdcst_sock,<br>140                                            (struct sockaddr *)&sd_brdcst_sin,<br>141                                            sizeof(struct sockaddr_in));<br>142         if (sd_err < 0) {<br>143                 printk(KERN_ERR "onekfs: Failed to bind broadcast socket: %d\n", sd_err);<br>144                 goto errout_with_socket;<br>145         }<br>146<br>147         /* We're live */<br>148         printk(KERN_INFO "onekfs: Broadcast of UDP packets at port %d\n",<br>149                ONEKFS_PORT + 1);<br>150<br>151         return 0;<br>152<br>153<br>154 errout_with_socket:<br>155         sock_release(sd_listener_sock);<br>156<br>157 errout:<br>158         return sd_err;<br>159 }<br></font></div><font face="monospace"><div><font face="monospace">...</font></div>183 </font><span style="font-family:monospace">int broadcast_msg(char *data, ssize_t data_len)</span><div><font face="monospace">184 {<br>185         /* Generate Msg */<br>186         struct msghdr* msg = kzalloc(sizeof (struct msghdr), GFP_KERNEL);<br>187         struct iovec* iov = kzalloc(sizeof (struct iovec), GFP_KERNEL);<br>188         int ret;<br>189<br>190         // memset(&msg, 0, sizeof(struct msghdr));<br>191         // memset(&iov, 0, sizeof(struct kvec));<br>192<br>193         char *pk_data = kzalloc(PROJECT_NAME_LEN + data_len, GFP_KERNEL);<br>194         if (!pk_data) {<br>195                 printk(KERN_WARNING "onekfs:"<br>196                        " Could not get memory for payload\n");<br>197                 return 1;<br>198         }<br>199<br>200         sprintf(pk_data, "onekfs%s", data);<br>201<br>202         iov->iov_base = pk_data;<br>203         iov->iov_len = PROJECT_NAME_LEN + data_len;<br>204         msg->msg_name = (void *)&sd_brdcst_sin;<br>205         msg->msg_namelen = sizeof(sd_brdcst_sin);<br>206         msg->msg_inq = PROJECT_NAME_LEN + data_len;<br>207         iov_iter_init(&msg->msg_iter, WRITE, iov, 1, iov->iov_len);<br>208         /* Broadcast */<br>209<br>210         printk(KERN_INFO "onekfs: Broadcast Socket type: %d\n", sd_brdcst_sock->type);<br>211         __be32 temp = (sd_brdcst_sin.sin_addr.s_addr);</font></div><div><font face="monospace">...<br>215         ret = sock_sendmsg(sd_brdcst_sock, msg);<br>217         <b style="background-color:rgb(255,153,0)">/* TODO: -14 (Bad Address error) */</b><br>218         if (ret < 0){<br>219                 printk(KERN_INFO "onekfs: UDP Packet Send failed: %d\n", ret);<br>220                 sock_release(sd_brdcst_sock);<br>221                 sock_release(sd_listener_sock);<br>222                 kfree(msg);<br>223                 kfree(iov);<br>224         }<br>225<br>226         kfree(pk_data);<br>227<br>228         return ret < 0;<br>229 }</font></div><div><font face="monospace"><br></font></div><div><font face="monospace"><b>Logs</b>:</font></div><div><font face="monospace"><br></font></div><div><b>[ 4952.707575] onekfs: Interface: enp0s3, Broadcast Address: x.x.x.x<br>[ 4952.707626] onekfs: Broadcast of UDP packets at port 39530<br>[ 4952.707639] onekfs: Broadcast Addr: x.x.x.x<br>[ 4952.707665] onekfs: UDP Packet Send failed: -14<br>[ 4952.707678] onekfs: Loaded</b><span style="font-family:monospace"><br></span></div></div>