diff options
Diffstat (limited to 'net/ipv4/af_inet.c')
-rw-r--r-- | net/ipv4/af_inet.c | 74 |
1 files changed, 36 insertions, 38 deletions
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 57737b8d1711..7d12c6a9b19b 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -174,12 +174,12 @@ static int inet_autobind(struct sock *sk) | |||
174 | /* We may need to bind the socket. */ | 174 | /* We may need to bind the socket. */ |
175 | lock_sock(sk); | 175 | lock_sock(sk); |
176 | inet = inet_sk(sk); | 176 | inet = inet_sk(sk); |
177 | if (!inet->num) { | 177 | if (!inet->inet_num) { |
178 | if (sk->sk_prot->get_port(sk, 0)) { | 178 | if (sk->sk_prot->get_port(sk, 0)) { |
179 | release_sock(sk); | 179 | release_sock(sk); |
180 | return -EAGAIN; | 180 | return -EAGAIN; |
181 | } | 181 | } |
182 | inet->sport = htons(inet->num); | 182 | inet->inet_sport = htons(inet->inet_num); |
183 | } | 183 | } |
184 | release_sock(sk); | 184 | release_sock(sk); |
185 | return 0; | 185 | return 0; |
@@ -262,7 +262,8 @@ static inline int inet_netns_ok(struct net *net, int protocol) | |||
262 | * Create an inet socket. | 262 | * Create an inet socket. |
263 | */ | 263 | */ |
264 | 264 | ||
265 | static int inet_create(struct net *net, struct socket *sock, int protocol) | 265 | static int inet_create(struct net *net, struct socket *sock, int protocol, |
266 | int kern) | ||
266 | { | 267 | { |
267 | struct sock *sk; | 268 | struct sock *sk; |
268 | struct inet_protosw *answer; | 269 | struct inet_protosw *answer; |
@@ -325,7 +326,7 @@ lookup_protocol: | |||
325 | } | 326 | } |
326 | 327 | ||
327 | err = -EPERM; | 328 | err = -EPERM; |
328 | if (answer->capability > 0 && !capable(answer->capability)) | 329 | if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW)) |
329 | goto out_rcu_unlock; | 330 | goto out_rcu_unlock; |
330 | 331 | ||
331 | err = -EAFNOSUPPORT; | 332 | err = -EAFNOSUPPORT; |
@@ -354,7 +355,7 @@ lookup_protocol: | |||
354 | inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0; | 355 | inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0; |
355 | 356 | ||
356 | if (SOCK_RAW == sock->type) { | 357 | if (SOCK_RAW == sock->type) { |
357 | inet->num = protocol; | 358 | inet->inet_num = protocol; |
358 | if (IPPROTO_RAW == protocol) | 359 | if (IPPROTO_RAW == protocol) |
359 | inet->hdrincl = 1; | 360 | inet->hdrincl = 1; |
360 | } | 361 | } |
@@ -364,7 +365,7 @@ lookup_protocol: | |||
364 | else | 365 | else |
365 | inet->pmtudisc = IP_PMTUDISC_WANT; | 366 | inet->pmtudisc = IP_PMTUDISC_WANT; |
366 | 367 | ||
367 | inet->id = 0; | 368 | inet->inet_id = 0; |
368 | 369 | ||
369 | sock_init_data(sock, sk); | 370 | sock_init_data(sock, sk); |
370 | 371 | ||
@@ -381,13 +382,13 @@ lookup_protocol: | |||
381 | 382 | ||
382 | sk_refcnt_debug_inc(sk); | 383 | sk_refcnt_debug_inc(sk); |
383 | 384 | ||
384 | if (inet->num) { | 385 | if (inet->inet_num) { |
385 | /* It assumes that any protocol which allows | 386 | /* It assumes that any protocol which allows |
386 | * the user to assign a number at socket | 387 | * the user to assign a number at socket |
387 | * creation time automatically | 388 | * creation time automatically |
388 | * shares. | 389 | * shares. |
389 | */ | 390 | */ |
390 | inet->sport = htons(inet->num); | 391 | inet->inet_sport = htons(inet->inet_num); |
391 | /* Add to protocol hash chains. */ | 392 | /* Add to protocol hash chains. */ |
392 | sk->sk_prot->hash(sk); | 393 | sk->sk_prot->hash(sk); |
393 | } | 394 | } |
@@ -494,27 +495,27 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
494 | 495 | ||
495 | /* Check these errors (active socket, double bind). */ | 496 | /* Check these errors (active socket, double bind). */ |
496 | err = -EINVAL; | 497 | err = -EINVAL; |
497 | if (sk->sk_state != TCP_CLOSE || inet->num) | 498 | if (sk->sk_state != TCP_CLOSE || inet->inet_num) |
498 | goto out_release_sock; | 499 | goto out_release_sock; |
499 | 500 | ||
500 | inet->rcv_saddr = inet->saddr = addr->sin_addr.s_addr; | 501 | inet->inet_rcv_saddr = inet->inet_saddr = addr->sin_addr.s_addr; |
501 | if (chk_addr_ret == RTN_MULTICAST || chk_addr_ret == RTN_BROADCAST) | 502 | if (chk_addr_ret == RTN_MULTICAST || chk_addr_ret == RTN_BROADCAST) |
502 | inet->saddr = 0; /* Use device */ | 503 | inet->inet_saddr = 0; /* Use device */ |
503 | 504 | ||
504 | /* Make sure we are allowed to bind here. */ | 505 | /* Make sure we are allowed to bind here. */ |
505 | if (sk->sk_prot->get_port(sk, snum)) { | 506 | if (sk->sk_prot->get_port(sk, snum)) { |
506 | inet->saddr = inet->rcv_saddr = 0; | 507 | inet->inet_saddr = inet->inet_rcv_saddr = 0; |
507 | err = -EADDRINUSE; | 508 | err = -EADDRINUSE; |
508 | goto out_release_sock; | 509 | goto out_release_sock; |
509 | } | 510 | } |
510 | 511 | ||
511 | if (inet->rcv_saddr) | 512 | if (inet->inet_rcv_saddr) |
512 | sk->sk_userlocks |= SOCK_BINDADDR_LOCK; | 513 | sk->sk_userlocks |= SOCK_BINDADDR_LOCK; |
513 | if (snum) | 514 | if (snum) |
514 | sk->sk_userlocks |= SOCK_BINDPORT_LOCK; | 515 | sk->sk_userlocks |= SOCK_BINDPORT_LOCK; |
515 | inet->sport = htons(inet->num); | 516 | inet->inet_sport = htons(inet->inet_num); |
516 | inet->daddr = 0; | 517 | inet->inet_daddr = 0; |
517 | inet->dport = 0; | 518 | inet->inet_dport = 0; |
518 | sk_dst_reset(sk); | 519 | sk_dst_reset(sk); |
519 | err = 0; | 520 | err = 0; |
520 | out_release_sock: | 521 | out_release_sock: |
@@ -532,7 +533,7 @@ int inet_dgram_connect(struct socket *sock, struct sockaddr * uaddr, | |||
532 | if (uaddr->sa_family == AF_UNSPEC) | 533 | if (uaddr->sa_family == AF_UNSPEC) |
533 | return sk->sk_prot->disconnect(sk, flags); | 534 | return sk->sk_prot->disconnect(sk, flags); |
534 | 535 | ||
535 | if (!inet_sk(sk)->num && inet_autobind(sk)) | 536 | if (!inet_sk(sk)->inet_num && inet_autobind(sk)) |
536 | return -EAGAIN; | 537 | return -EAGAIN; |
537 | return sk->sk_prot->connect(sk, (struct sockaddr *)uaddr, addr_len); | 538 | return sk->sk_prot->connect(sk, (struct sockaddr *)uaddr, addr_len); |
538 | } | 539 | } |
@@ -685,21 +686,21 @@ int inet_getname(struct socket *sock, struct sockaddr *uaddr, | |||
685 | { | 686 | { |
686 | struct sock *sk = sock->sk; | 687 | struct sock *sk = sock->sk; |
687 | struct inet_sock *inet = inet_sk(sk); | 688 | struct inet_sock *inet = inet_sk(sk); |
688 | struct sockaddr_in *sin = (struct sockaddr_in *)uaddr; | 689 | DECLARE_SOCKADDR(struct sockaddr_in *, sin, uaddr); |
689 | 690 | ||
690 | sin->sin_family = AF_INET; | 691 | sin->sin_family = AF_INET; |
691 | if (peer) { | 692 | if (peer) { |
692 | if (!inet->dport || | 693 | if (!inet->inet_dport || |
693 | (((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_SYN_SENT)) && | 694 | (((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_SYN_SENT)) && |
694 | peer == 1)) | 695 | peer == 1)) |
695 | return -ENOTCONN; | 696 | return -ENOTCONN; |
696 | sin->sin_port = inet->dport; | 697 | sin->sin_port = inet->inet_dport; |
697 | sin->sin_addr.s_addr = inet->daddr; | 698 | sin->sin_addr.s_addr = inet->inet_daddr; |
698 | } else { | 699 | } else { |
699 | __be32 addr = inet->rcv_saddr; | 700 | __be32 addr = inet->inet_rcv_saddr; |
700 | if (!addr) | 701 | if (!addr) |
701 | addr = inet->saddr; | 702 | addr = inet->inet_saddr; |
702 | sin->sin_port = inet->sport; | 703 | sin->sin_port = inet->inet_sport; |
703 | sin->sin_addr.s_addr = addr; | 704 | sin->sin_addr.s_addr = addr; |
704 | } | 705 | } |
705 | memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); | 706 | memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); |
@@ -714,7 +715,7 @@ int inet_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, | |||
714 | struct sock *sk = sock->sk; | 715 | struct sock *sk = sock->sk; |
715 | 716 | ||
716 | /* We may need to bind the socket. */ | 717 | /* We may need to bind the socket. */ |
717 | if (!inet_sk(sk)->num && inet_autobind(sk)) | 718 | if (!inet_sk(sk)->inet_num && inet_autobind(sk)) |
718 | return -EAGAIN; | 719 | return -EAGAIN; |
719 | 720 | ||
720 | return sk->sk_prot->sendmsg(iocb, sk, msg, size); | 721 | return sk->sk_prot->sendmsg(iocb, sk, msg, size); |
@@ -728,7 +729,7 @@ static ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset, | |||
728 | struct sock *sk = sock->sk; | 729 | struct sock *sk = sock->sk; |
729 | 730 | ||
730 | /* We may need to bind the socket. */ | 731 | /* We may need to bind the socket. */ |
731 | if (!inet_sk(sk)->num && inet_autobind(sk)) | 732 | if (!inet_sk(sk)->inet_num && inet_autobind(sk)) |
732 | return -EAGAIN; | 733 | return -EAGAIN; |
733 | 734 | ||
734 | if (sk->sk_prot->sendpage) | 735 | if (sk->sk_prot->sendpage) |
@@ -931,7 +932,7 @@ static const struct proto_ops inet_sockraw_ops = { | |||
931 | #endif | 932 | #endif |
932 | }; | 933 | }; |
933 | 934 | ||
934 | static struct net_proto_family inet_family_ops = { | 935 | static const struct net_proto_family inet_family_ops = { |
935 | .family = PF_INET, | 936 | .family = PF_INET, |
936 | .create = inet_create, | 937 | .create = inet_create, |
937 | .owner = THIS_MODULE, | 938 | .owner = THIS_MODULE, |
@@ -947,7 +948,6 @@ static struct inet_protosw inetsw_array[] = | |||
947 | .protocol = IPPROTO_TCP, | 948 | .protocol = IPPROTO_TCP, |
948 | .prot = &tcp_prot, | 949 | .prot = &tcp_prot, |
949 | .ops = &inet_stream_ops, | 950 | .ops = &inet_stream_ops, |
950 | .capability = -1, | ||
951 | .no_check = 0, | 951 | .no_check = 0, |
952 | .flags = INET_PROTOSW_PERMANENT | | 952 | .flags = INET_PROTOSW_PERMANENT | |
953 | INET_PROTOSW_ICSK, | 953 | INET_PROTOSW_ICSK, |
@@ -958,7 +958,6 @@ static struct inet_protosw inetsw_array[] = | |||
958 | .protocol = IPPROTO_UDP, | 958 | .protocol = IPPROTO_UDP, |
959 | .prot = &udp_prot, | 959 | .prot = &udp_prot, |
960 | .ops = &inet_dgram_ops, | 960 | .ops = &inet_dgram_ops, |
961 | .capability = -1, | ||
962 | .no_check = UDP_CSUM_DEFAULT, | 961 | .no_check = UDP_CSUM_DEFAULT, |
963 | .flags = INET_PROTOSW_PERMANENT, | 962 | .flags = INET_PROTOSW_PERMANENT, |
964 | }, | 963 | }, |
@@ -969,7 +968,6 @@ static struct inet_protosw inetsw_array[] = | |||
969 | .protocol = IPPROTO_IP, /* wild card */ | 968 | .protocol = IPPROTO_IP, /* wild card */ |
970 | .prot = &raw_prot, | 969 | .prot = &raw_prot, |
971 | .ops = &inet_sockraw_ops, | 970 | .ops = &inet_sockraw_ops, |
972 | .capability = CAP_NET_RAW, | ||
973 | .no_check = UDP_CSUM_DEFAULT, | 971 | .no_check = UDP_CSUM_DEFAULT, |
974 | .flags = INET_PROTOSW_REUSE, | 972 | .flags = INET_PROTOSW_REUSE, |
975 | } | 973 | } |
@@ -1059,9 +1057,9 @@ static int inet_sk_reselect_saddr(struct sock *sk) | |||
1059 | struct inet_sock *inet = inet_sk(sk); | 1057 | struct inet_sock *inet = inet_sk(sk); |
1060 | int err; | 1058 | int err; |
1061 | struct rtable *rt; | 1059 | struct rtable *rt; |
1062 | __be32 old_saddr = inet->saddr; | 1060 | __be32 old_saddr = inet->inet_saddr; |
1063 | __be32 new_saddr; | 1061 | __be32 new_saddr; |
1064 | __be32 daddr = inet->daddr; | 1062 | __be32 daddr = inet->inet_daddr; |
1065 | 1063 | ||
1066 | if (inet->opt && inet->opt->srr) | 1064 | if (inet->opt && inet->opt->srr) |
1067 | daddr = inet->opt->faddr; | 1065 | daddr = inet->opt->faddr; |
@@ -1071,7 +1069,7 @@ static int inet_sk_reselect_saddr(struct sock *sk) | |||
1071 | RT_CONN_FLAGS(sk), | 1069 | RT_CONN_FLAGS(sk), |
1072 | sk->sk_bound_dev_if, | 1070 | sk->sk_bound_dev_if, |
1073 | sk->sk_protocol, | 1071 | sk->sk_protocol, |
1074 | inet->sport, inet->dport, sk, 0); | 1072 | inet->inet_sport, inet->inet_dport, sk, 0); |
1075 | if (err) | 1073 | if (err) |
1076 | return err; | 1074 | return err; |
1077 | 1075 | ||
@@ -1087,7 +1085,7 @@ static int inet_sk_reselect_saddr(struct sock *sk) | |||
1087 | __func__, &old_saddr, &new_saddr); | 1085 | __func__, &old_saddr, &new_saddr); |
1088 | } | 1086 | } |
1089 | 1087 | ||
1090 | inet->saddr = inet->rcv_saddr = new_saddr; | 1088 | inet->inet_saddr = inet->inet_rcv_saddr = new_saddr; |
1091 | 1089 | ||
1092 | /* | 1090 | /* |
1093 | * XXX The only one ugly spot where we need to | 1091 | * XXX The only one ugly spot where we need to |
@@ -1113,7 +1111,7 @@ int inet_sk_rebuild_header(struct sock *sk) | |||
1113 | return 0; | 1111 | return 0; |
1114 | 1112 | ||
1115 | /* Reroute. */ | 1113 | /* Reroute. */ |
1116 | daddr = inet->daddr; | 1114 | daddr = inet->inet_daddr; |
1117 | if (inet->opt && inet->opt->srr) | 1115 | if (inet->opt && inet->opt->srr) |
1118 | daddr = inet->opt->faddr; | 1116 | daddr = inet->opt->faddr; |
1119 | { | 1117 | { |
@@ -1123,7 +1121,7 @@ int inet_sk_rebuild_header(struct sock *sk) | |||
1123 | .nl_u = { | 1121 | .nl_u = { |
1124 | .ip4_u = { | 1122 | .ip4_u = { |
1125 | .daddr = daddr, | 1123 | .daddr = daddr, |
1126 | .saddr = inet->saddr, | 1124 | .saddr = inet->inet_saddr, |
1127 | .tos = RT_CONN_FLAGS(sk), | 1125 | .tos = RT_CONN_FLAGS(sk), |
1128 | }, | 1126 | }, |
1129 | }, | 1127 | }, |
@@ -1131,8 +1129,8 @@ int inet_sk_rebuild_header(struct sock *sk) | |||
1131 | .flags = inet_sk_flowi_flags(sk), | 1129 | .flags = inet_sk_flowi_flags(sk), |
1132 | .uli_u = { | 1130 | .uli_u = { |
1133 | .ports = { | 1131 | .ports = { |
1134 | .sport = inet->sport, | 1132 | .sport = inet->inet_sport, |
1135 | .dport = inet->dport, | 1133 | .dport = inet->inet_dport, |
1136 | }, | 1134 | }, |
1137 | }, | 1135 | }, |
1138 | }; | 1136 | }; |