diff options
Diffstat (limited to 'net/ipv4/udp.c')
-rw-r--r-- | net/ipv4/udp.c | 83 |
1 files changed, 58 insertions, 25 deletions
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 00840474a449..3f93292b0ad8 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -1207,16 +1207,13 @@ static int udp_destroy_sock(struct sock *sk) | |||
1207 | /* | 1207 | /* |
1208 | * Socket option code for UDP | 1208 | * Socket option code for UDP |
1209 | */ | 1209 | */ |
1210 | static int udp_setsockopt(struct sock *sk, int level, int optname, | 1210 | static int do_udp_setsockopt(struct sock *sk, int level, int optname, |
1211 | char __user *optval, int optlen) | 1211 | char __user *optval, int optlen) |
1212 | { | 1212 | { |
1213 | struct udp_sock *up = udp_sk(sk); | 1213 | struct udp_sock *up = udp_sk(sk); |
1214 | int val; | 1214 | int val; |
1215 | int err = 0; | 1215 | int err = 0; |
1216 | 1216 | ||
1217 | if (level != SOL_UDP) | ||
1218 | return ip_setsockopt(sk, level, optname, optval, optlen); | ||
1219 | |||
1220 | if(optlen<sizeof(int)) | 1217 | if(optlen<sizeof(int)) |
1221 | return -EINVAL; | 1218 | return -EINVAL; |
1222 | 1219 | ||
@@ -1256,15 +1253,30 @@ static int udp_setsockopt(struct sock *sk, int level, int optname, | |||
1256 | return err; | 1253 | return err; |
1257 | } | 1254 | } |
1258 | 1255 | ||
1259 | static int udp_getsockopt(struct sock *sk, int level, int optname, | 1256 | static int udp_setsockopt(struct sock *sk, int level, int optname, |
1257 | char __user *optval, int optlen) | ||
1258 | { | ||
1259 | if (level != SOL_UDP) | ||
1260 | return ip_setsockopt(sk, level, optname, optval, optlen); | ||
1261 | return do_udp_setsockopt(sk, level, optname, optval, optlen); | ||
1262 | } | ||
1263 | |||
1264 | #ifdef CONFIG_COMPAT | ||
1265 | static int compat_udp_setsockopt(struct sock *sk, int level, int optname, | ||
1266 | char __user *optval, int optlen) | ||
1267 | { | ||
1268 | if (level != SOL_UDP) | ||
1269 | return compat_ip_setsockopt(sk, level, optname, optval, optlen); | ||
1270 | return do_udp_setsockopt(sk, level, optname, optval, optlen); | ||
1271 | } | ||
1272 | #endif | ||
1273 | |||
1274 | static int do_udp_getsockopt(struct sock *sk, int level, int optname, | ||
1260 | char __user *optval, int __user *optlen) | 1275 | char __user *optval, int __user *optlen) |
1261 | { | 1276 | { |
1262 | struct udp_sock *up = udp_sk(sk); | 1277 | struct udp_sock *up = udp_sk(sk); |
1263 | int val, len; | 1278 | int val, len; |
1264 | 1279 | ||
1265 | if (level != SOL_UDP) | ||
1266 | return ip_getsockopt(sk, level, optname, optval, optlen); | ||
1267 | |||
1268 | if(get_user(len,optlen)) | 1280 | if(get_user(len,optlen)) |
1269 | return -EFAULT; | 1281 | return -EFAULT; |
1270 | 1282 | ||
@@ -1293,6 +1305,23 @@ static int udp_getsockopt(struct sock *sk, int level, int optname, | |||
1293 | return 0; | 1305 | return 0; |
1294 | } | 1306 | } |
1295 | 1307 | ||
1308 | static int udp_getsockopt(struct sock *sk, int level, int optname, | ||
1309 | char __user *optval, int __user *optlen) | ||
1310 | { | ||
1311 | if (level != SOL_UDP) | ||
1312 | return ip_getsockopt(sk, level, optname, optval, optlen); | ||
1313 | return do_udp_getsockopt(sk, level, optname, optval, optlen); | ||
1314 | } | ||
1315 | |||
1316 | #ifdef CONFIG_COMPAT | ||
1317 | static int compat_udp_getsockopt(struct sock *sk, int level, int optname, | ||
1318 | char __user *optval, int __user *optlen) | ||
1319 | { | ||
1320 | if (level != SOL_UDP) | ||
1321 | return compat_ip_getsockopt(sk, level, optname, optval, optlen); | ||
1322 | return do_udp_getsockopt(sk, level, optname, optval, optlen); | ||
1323 | } | ||
1324 | #endif | ||
1296 | /** | 1325 | /** |
1297 | * udp_poll - wait for a UDP event. | 1326 | * udp_poll - wait for a UDP event. |
1298 | * @file - file struct | 1327 | * @file - file struct |
@@ -1341,23 +1370,27 @@ unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait) | |||
1341 | } | 1370 | } |
1342 | 1371 | ||
1343 | struct proto udp_prot = { | 1372 | struct proto udp_prot = { |
1344 | .name = "UDP", | 1373 | .name = "UDP", |
1345 | .owner = THIS_MODULE, | 1374 | .owner = THIS_MODULE, |
1346 | .close = udp_close, | 1375 | .close = udp_close, |
1347 | .connect = ip4_datagram_connect, | 1376 | .connect = ip4_datagram_connect, |
1348 | .disconnect = udp_disconnect, | 1377 | .disconnect = udp_disconnect, |
1349 | .ioctl = udp_ioctl, | 1378 | .ioctl = udp_ioctl, |
1350 | .destroy = udp_destroy_sock, | 1379 | .destroy = udp_destroy_sock, |
1351 | .setsockopt = udp_setsockopt, | 1380 | .setsockopt = udp_setsockopt, |
1352 | .getsockopt = udp_getsockopt, | 1381 | .getsockopt = udp_getsockopt, |
1353 | .sendmsg = udp_sendmsg, | 1382 | .sendmsg = udp_sendmsg, |
1354 | .recvmsg = udp_recvmsg, | 1383 | .recvmsg = udp_recvmsg, |
1355 | .sendpage = udp_sendpage, | 1384 | .sendpage = udp_sendpage, |
1356 | .backlog_rcv = udp_queue_rcv_skb, | 1385 | .backlog_rcv = udp_queue_rcv_skb, |
1357 | .hash = udp_v4_hash, | 1386 | .hash = udp_v4_hash, |
1358 | .unhash = udp_v4_unhash, | 1387 | .unhash = udp_v4_unhash, |
1359 | .get_port = udp_v4_get_port, | 1388 | .get_port = udp_v4_get_port, |
1360 | .obj_size = sizeof(struct udp_sock), | 1389 | .obj_size = sizeof(struct udp_sock), |
1390 | #ifdef CONFIG_COMPAT | ||
1391 | .compat_setsockopt = compat_udp_setsockopt, | ||
1392 | .compat_getsockopt = compat_udp_getsockopt, | ||
1393 | #endif | ||
1361 | }; | 1394 | }; |
1362 | 1395 | ||
1363 | /* ------------------------------------------------------------------------ */ | 1396 | /* ------------------------------------------------------------------------ */ |