diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-03-23 23:44:19 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-03-23 23:44:19 -0500 |
commit | 1ebbe2b20091d306453a5cf480a87e6cd28ae76f (patch) | |
tree | f5cd7a0fa69b8b1938cb5a0faed2e7b0628072a5 /net/ipv4/raw.c | |
parent | ac58c9059da8886b5e8cde012a80266b18ca146e (diff) | |
parent | 674a396c6d2ba0341ebdd7c1c9950f32f018e2dd (diff) |
Merge branch 'linus'
Diffstat (limited to 'net/ipv4/raw.c')
-rw-r--r-- | net/ipv4/raw.c | 80 |
1 files changed, 57 insertions, 23 deletions
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index f29a12da5109..fc2562415555 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
@@ -660,12 +660,9 @@ static int raw_geticmpfilter(struct sock *sk, char __user *optval, int __user *o | |||
660 | out: return ret; | 660 | out: return ret; |
661 | } | 661 | } |
662 | 662 | ||
663 | static int raw_setsockopt(struct sock *sk, int level, int optname, | 663 | static int do_raw_setsockopt(struct sock *sk, int level, int optname, |
664 | char __user *optval, int optlen) | 664 | char __user *optval, int optlen) |
665 | { | 665 | { |
666 | if (level != SOL_RAW) | ||
667 | return ip_setsockopt(sk, level, optname, optval, optlen); | ||
668 | |||
669 | if (optname == ICMP_FILTER) { | 666 | if (optname == ICMP_FILTER) { |
670 | if (inet_sk(sk)->num != IPPROTO_ICMP) | 667 | if (inet_sk(sk)->num != IPPROTO_ICMP) |
671 | return -EOPNOTSUPP; | 668 | return -EOPNOTSUPP; |
@@ -675,12 +672,27 @@ static int raw_setsockopt(struct sock *sk, int level, int optname, | |||
675 | return -ENOPROTOOPT; | 672 | return -ENOPROTOOPT; |
676 | } | 673 | } |
677 | 674 | ||
678 | static int raw_getsockopt(struct sock *sk, int level, int optname, | 675 | static int raw_setsockopt(struct sock *sk, int level, int optname, |
679 | char __user *optval, int __user *optlen) | 676 | char __user *optval, int optlen) |
680 | { | 677 | { |
681 | if (level != SOL_RAW) | 678 | if (level != SOL_RAW) |
682 | return ip_getsockopt(sk, level, optname, optval, optlen); | 679 | return ip_setsockopt(sk, level, optname, optval, optlen); |
680 | return do_raw_setsockopt(sk, level, optname, optval, optlen); | ||
681 | } | ||
683 | 682 | ||
683 | #ifdef CONFIG_COMPAT | ||
684 | static int compat_raw_setsockopt(struct sock *sk, int level, int optname, | ||
685 | char __user *optval, int optlen) | ||
686 | { | ||
687 | if (level != SOL_RAW) | ||
688 | return compat_ip_setsockopt(sk, level, optname, optval, optlen); | ||
689 | return do_raw_setsockopt(sk, level, optname, optval, optlen); | ||
690 | } | ||
691 | #endif | ||
692 | |||
693 | static int do_raw_getsockopt(struct sock *sk, int level, int optname, | ||
694 | char __user *optval, int __user *optlen) | ||
695 | { | ||
684 | if (optname == ICMP_FILTER) { | 696 | if (optname == ICMP_FILTER) { |
685 | if (inet_sk(sk)->num != IPPROTO_ICMP) | 697 | if (inet_sk(sk)->num != IPPROTO_ICMP) |
686 | return -EOPNOTSUPP; | 698 | return -EOPNOTSUPP; |
@@ -690,6 +702,24 @@ static int raw_getsockopt(struct sock *sk, int level, int optname, | |||
690 | return -ENOPROTOOPT; | 702 | return -ENOPROTOOPT; |
691 | } | 703 | } |
692 | 704 | ||
705 | static int raw_getsockopt(struct sock *sk, int level, int optname, | ||
706 | char __user *optval, int __user *optlen) | ||
707 | { | ||
708 | if (level != SOL_RAW) | ||
709 | return ip_getsockopt(sk, level, optname, optval, optlen); | ||
710 | return do_raw_getsockopt(sk, level, optname, optval, optlen); | ||
711 | } | ||
712 | |||
713 | #ifdef CONFIG_COMPAT | ||
714 | static int compat_raw_getsockopt(struct sock *sk, int level, int optname, | ||
715 | char __user *optval, int __user *optlen) | ||
716 | { | ||
717 | if (level != SOL_RAW) | ||
718 | return compat_ip_getsockopt(sk, level, optname, optval, optlen); | ||
719 | return do_raw_getsockopt(sk, level, optname, optval, optlen); | ||
720 | } | ||
721 | #endif | ||
722 | |||
693 | static int raw_ioctl(struct sock *sk, int cmd, unsigned long arg) | 723 | static int raw_ioctl(struct sock *sk, int cmd, unsigned long arg) |
694 | { | 724 | { |
695 | switch (cmd) { | 725 | switch (cmd) { |
@@ -719,22 +749,26 @@ static int raw_ioctl(struct sock *sk, int cmd, unsigned long arg) | |||
719 | } | 749 | } |
720 | 750 | ||
721 | struct proto raw_prot = { | 751 | struct proto raw_prot = { |
722 | .name = "RAW", | 752 | .name = "RAW", |
723 | .owner = THIS_MODULE, | 753 | .owner = THIS_MODULE, |
724 | .close = raw_close, | 754 | .close = raw_close, |
725 | .connect = ip4_datagram_connect, | 755 | .connect = ip4_datagram_connect, |
726 | .disconnect = udp_disconnect, | 756 | .disconnect = udp_disconnect, |
727 | .ioctl = raw_ioctl, | 757 | .ioctl = raw_ioctl, |
728 | .init = raw_init, | 758 | .init = raw_init, |
729 | .setsockopt = raw_setsockopt, | 759 | .setsockopt = raw_setsockopt, |
730 | .getsockopt = raw_getsockopt, | 760 | .getsockopt = raw_getsockopt, |
731 | .sendmsg = raw_sendmsg, | 761 | .sendmsg = raw_sendmsg, |
732 | .recvmsg = raw_recvmsg, | 762 | .recvmsg = raw_recvmsg, |
733 | .bind = raw_bind, | 763 | .bind = raw_bind, |
734 | .backlog_rcv = raw_rcv_skb, | 764 | .backlog_rcv = raw_rcv_skb, |
735 | .hash = raw_v4_hash, | 765 | .hash = raw_v4_hash, |
736 | .unhash = raw_v4_unhash, | 766 | .unhash = raw_v4_unhash, |
737 | .obj_size = sizeof(struct raw_sock), | 767 | .obj_size = sizeof(struct raw_sock), |
768 | #ifdef CONFIG_COMPAT | ||
769 | .compat_setsockopt = compat_raw_setsockopt, | ||
770 | .compat_getsockopt = compat_raw_getsockopt, | ||
771 | #endif | ||
738 | }; | 772 | }; |
739 | 773 | ||
740 | #ifdef CONFIG_PROC_FS | 774 | #ifdef CONFIG_PROC_FS |