[UDP]: Allow users to configure UDP-Lite.
authorYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Fri, 29 Feb 2008 16:06:47 +0000 (01:06 +0900)
committerYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tue, 4 Mar 2008 06:18:22 +0000 (15:18 +0900)
Let's give users an option for disabling UDP-Lite (~4K).

old:
|    text    data     bss     dec     hex filename
|  286498   12432    6072  305002   4a76a net/ipv4/built-in.o
|  193830    8192    3204  205226   321aa net/ipv6/ipv6.o

new (without UDP-Lite):
|    text    data     bss     dec     hex filename
|  284086   12136    5432  301654   49a56 net/ipv4/built-in.o
|  191835    7832    3076  202743   317f7 net/ipv6/ipv6.o

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
14 files changed:
include/linux/udp.h
include/net/ipv6.h
include/net/transp_v6.h
include/net/udplite.h
net/ipv4/Kconfig
net/ipv4/Makefile
net/ipv4/af_inet.c
net/ipv4/proc.c
net/ipv4/udp.c
net/ipv6/Makefile
net/ipv6/af_inet6.c
net/ipv6/ipv6_sockglue.c
net/ipv6/proc.c
net/ipv6/udp.c

index 8ec703f..4144664 100644 (file)
@@ -70,8 +70,10 @@ struct udp_sock {
 #define UDPLITE_BIT      0x1           /* set by udplite proto init function */
 #define UDPLITE_SEND_CC  0x2           /* set via udplite setsockopt         */
 #define UDPLITE_RECV_CC  0x4           /* set via udplite setsocktopt        */
+#ifdef CONFIG_IP_UDPLITE
        __u8             pcflag;        /* marks socket as UDP-Lite if > 0    */
        __u8             unused[3];
+#endif
        /*
         * For encapsulation sockets.
         */
@@ -82,7 +84,16 @@ static inline struct udp_sock *udp_sk(const struct sock *sk)
 {
        return (struct udp_sock *)sk;
 }
+
+#ifdef CONFIG_IP_UDPLITE
 #define IS_UDPLITE(__sk) (udp_sk(__sk)->pcflag)
+#define IS_PROTO_UDPLITE(__proto) ((__proto) == IPPROTO_UDPLITE)
+#define IS_SOL_UDPFAMILY(level) ((level) == SOL_UDP || (level) == SOL_UDPLITE)
+#else
+#define IS_UDPLITE(__sk) 0
+#define IS_PROTO_UDPLITE(__proto) 0
+#define IS_SOL_UDPFAMILY(level) ((level) == SOL_UDP)
+#endif
 
 #endif
 
index 8b05c65..96b1763 100644 (file)
@@ -603,8 +603,13 @@ extern int  tcp6_proc_init(void);
 extern void tcp6_proc_exit(void);
 extern int  udp6_proc_init(void);
 extern void udp6_proc_exit(void);
+#ifdef CONFIG_IP_UDPLITE
 extern int  udplite6_proc_init(void);
 extern void udplite6_proc_exit(void);
+#else
+static inline int udplite6_proc_init(void) { return 0; }
+static inline void udplite6_proc_exit(void) { }
+#endif
 extern int  ipv6_misc_proc_init(void);
 extern void ipv6_misc_proc_exit(void);
 extern int snmp6_register_dev(struct inet6_dev *idev);
index 27394e0..902e6c6 100644 (file)
@@ -27,8 +27,13 @@ extern int                           rawv6_init(void);
 extern void                            rawv6_exit(void);
 extern int                             udpv6_init(void);
 extern void                            udpv6_exit(void);
+#ifdef CONFIG_IP_UDPLITE
 extern int                             udplitev6_init(void);
 extern void                            udplitev6_exit(void);
+#else
+static inline int udplitev6_init(void) { return 0; }
+static inline void udplitev6_exit(void) { }
+#endif
 extern int                             tcpv6_init(void);
 extern void                            tcpv6_exit(void);
 
index b76b2e3..01ddb2c 100644 (file)
@@ -25,7 +25,9 @@ static __inline__ int udplite_getfrag(void *from, char *to, int  offset,
 /* Designate sk as UDP-Lite socket */
 static inline int udplite_sk_init(struct sock *sk)
 {
+#ifdef CONFIG_IP_UDPLITE
        udp_sk(sk)->pcflag = UDPLITE_BIT;
+#endif
        return 0;
 }
 
@@ -69,7 +71,7 @@ static inline int udplite_checksum_init(struct sk_buff *skb, struct udphdr *uh)
 static inline int udplite_sender_cscov(struct udp_sock *up, struct udphdr *uh)
 {
        int cscov = up->len;
-
+#ifdef CONFIG_IP_UDPLITE
        /*
         * Sender has set `partial coverage' option on UDP-Lite socket
         */
@@ -93,13 +95,15 @@ static inline int udplite_sender_cscov(struct udp_sock *up, struct udphdr *uh)
         *       illegal, we fall back to the defaults here.
         */
        }
+#endif
        return cscov;
 }
 
 static inline __wsum udplite_csum_outgoing(struct sock *sk, struct sk_buff *skb)
 {
-       int cscov = udplite_sender_cscov(udp_sk(sk), udp_hdr(skb));
        __wsum csum = 0;
+#ifdef CONFIG_IP_UDPLITE
+       int cscov = udplite_sender_cscov(udp_sk(sk), udp_hdr(skb));
 
        skb->ip_summed = CHECKSUM_NONE;     /* no HW support for checksumming */
 
@@ -112,6 +116,7 @@ static inline __wsum udplite_csum_outgoing(struct sock *sk, struct sk_buff *skb)
                if ((cscov -= len) <= 0)
                        break;
        }
+#endif
        return csum;
 }
 
index 19880b0..efe3832 100644 (file)
@@ -632,5 +632,15 @@ config TCP_MD5SIG
 
          If unsure, say N.
 
+config IP_UDPLITE
+       bool "IP: UDP-Lite Protocol (RFC 3828)"
+       default n
+       ---help---
+         UDP-Lite (RFC 3828) is a UDP-like protocol with variable-length
+         checksum.  Read <file:Documentation/networking/udplite.txt> for
+         details.
+
+         If unsure, say N.
+
 source "net/ipv4/ipvs/Kconfig"
 
index ad40ef3..e88cebd 100644 (file)
@@ -8,7 +8,7 @@ obj-y     := route.o inetpeer.o protocol.o \
             inet_timewait_sock.o inet_connection_sock.o \
             tcp.o tcp_input.o tcp_output.o tcp_timer.o tcp_ipv4.o \
             tcp_minisocks.o tcp_cong.o \
-            datagram.o raw.o udp.o udplite.o \
+            datagram.o raw.o udp.o \
             arp.o icmp.o devinet.o af_inet.o  igmp.o \
             fib_frontend.o fib_semantics.o \
             inet_fragment.o
@@ -49,6 +49,7 @@ obj-$(CONFIG_TCP_CONG_SCALABLE) += tcp_scalable.o
 obj-$(CONFIG_TCP_CONG_LP) += tcp_lp.o
 obj-$(CONFIG_TCP_CONG_YEAH) += tcp_yeah.o
 obj-$(CONFIG_TCP_CONG_ILLINOIS) += tcp_illinois.o
+obj-$(CONFIG_IP_UDPLITE) += udplite.o
 obj-$(CONFIG_NETLABEL) += cipso_ipv4.o
 
 obj-$(CONFIG_XFRM) += xfrm4_policy.o xfrm4_state.o xfrm4_input.o \
index 4f539bd..67260c0 100644 (file)
@@ -1317,15 +1317,18 @@ static int __init init_ipv4_mibs(void)
        if (snmp_mib_init((void **)udp_statistics,
                          sizeof(struct udp_mib)) < 0)
                goto err_udp_mib;
+#ifdef CONFIG_IP_UDPLITE
        if (snmp_mib_init((void **)udplite_statistics,
                          sizeof(struct udp_mib)) < 0)
                goto err_udplite_mib;
-
+#endif
        tcp_mib_init();
 
        return 0;
 
+#ifdef CONFIG_IP_UDPLITE
 err_udplite_mib:
+#endif
        snmp_mib_free((void **)udp_statistics);
 err_udp_mib:
        snmp_mib_free((void **)tcp_statistics);
@@ -1423,8 +1426,10 @@ static int __init inet_init(void)
        /* Setup UDP memory threshold */
        udp_init();
 
+#ifdef CONFIG_IP_UDPLITE
        /* Add UDP-Lite (RFC 3828) */
        udplite4_register();
+#endif
 
        /*
         *      Set the ICMP layer up
index d63474c..d75ddb7 100644 (file)
@@ -59,7 +59,9 @@ static int sockstat_seq_show(struct seq_file *seq, void *v)
                   atomic_read(&tcp_memory_allocated));
        seq_printf(seq, "UDP: inuse %d mem %d\n", sock_prot_inuse_get(&udp_prot),
                   atomic_read(&udp_memory_allocated));
+#ifdef CONFIG_IP_UDPLITE
        seq_printf(seq, "UDPLITE: inuse %d\n", sock_prot_inuse_get(&udplite_prot));
+#endif
        seq_printf(seq, "RAW: inuse %d\n", sock_prot_inuse_get(&raw_prot));
        seq_printf(seq,  "FRAG: inuse %d memory %d\n",
                        ip_frag_nqueues(&init_net), ip_frag_mem(&init_net));
@@ -349,6 +351,7 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
                           snmp_fold_field((void **)udp_statistics,
                                           snmp4_udp_list[i].entry));
 
+#ifdef CONFIG_IP_UDPLITE
        /* the UDP and UDP-Lite MIBs are the same */
        seq_puts(seq, "\nUdpLite:");
        for (i = 0; snmp4_udp_list[i].name != NULL; i++)
@@ -359,7 +362,7 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
                seq_printf(seq, " %lu",
                           snmp_fold_field((void **)udplite_statistics,
                                           snmp4_udp_list[i].entry));
-
+#endif
        seq_putc(seq, '\n');
        return 0;
 }
index 7ea1b67..acc353a 100644 (file)
@@ -1127,7 +1127,7 @@ static inline int udp4_csum_init(struct sk_buff *skb, struct udphdr *uh,
        UDP_SKB_CB(skb)->partial_cov = 0;
        UDP_SKB_CB(skb)->cscov = skb->len;
 
-       if (proto == IPPROTO_UDPLITE) {
+       if (IS_PROTO_UDPLITE(proto)) {
                err = udplite_checksum_init(skb, uh);
                if (err)
                        return err;
@@ -1175,7 +1175,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[],
        if (ulen > skb->len)
                goto short_packet;
 
-       if (proto == IPPROTO_UDP) {
+       if (IS_PROTO_UDPLITE(proto)) {
                /* UDP validates ulen. */
                if (ulen < sizeof(*uh) || pskb_trim_rcsum(skb, ulen))
                        goto short_packet;
@@ -1217,7 +1217,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[],
        if (udp_lib_checksum_complete(skb))
                goto csum_error;
 
-       UDP_INC_STATS_BH(UDP_MIB_NOPORTS, proto == IPPROTO_UDPLITE);
+       UDP_INC_STATS_BH(UDP_MIB_NOPORTS, IS_PROTO_UDPLITE(proto));
        icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0);
 
        /*
@@ -1229,7 +1229,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[],
 
 short_packet:
        LIMIT_NETDEBUG(KERN_DEBUG "UDP%s: short packet: From %u.%u.%u.%u:%u %d/%d to %u.%u.%u.%u:%u\n",
-                      proto == IPPROTO_UDPLITE ? "-Lite" : "",
+                      IS_PROTO_UDPLITE(proto) ? "-Lite" : "",
                       NIPQUAD(saddr),
                       ntohs(uh->source),
                       ulen,
@@ -1244,14 +1244,14 @@ csum_error:
         * the network is concerned, anyway) as per 4.1.3.4 (MUST).
         */
        LIMIT_NETDEBUG(KERN_DEBUG "UDP%s: bad checksum. From %d.%d.%d.%d:%d to %d.%d.%d.%d:%d ulen %d\n",
-                      proto == IPPROTO_UDPLITE ? "-Lite" : "",
+                      IS_PROTO_UDPLITE(proto) ? "-Lite" : "",
                       NIPQUAD(saddr),
                       ntohs(uh->source),
                       NIPQUAD(daddr),
                       ntohs(uh->dest),
                       ulen);
 drop:
-       UDP_INC_STATS_BH(UDP_MIB_INERRORS, proto == IPPROTO_UDPLITE);
+       UDP_INC_STATS_BH(UDP_MIB_INERRORS, IS_PROTO_UDPLITE(proto));
        kfree_skb(skb);
        return 0;
 }
@@ -1279,7 +1279,9 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
        struct udp_sock *up = udp_sk(sk);
        int val;
        int err = 0;
+#ifdef CONFIG_IP_UDPLITE
        int is_udplite = IS_UDPLITE(sk);
+#endif
 
        if (optlen<sizeof(int))
                return -EINVAL;
@@ -1315,6 +1317,7 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
                }
                break;
 
+#ifdef CONFIG_IP_UDPLITE
        /*
         *      UDP-Lite's partial checksum coverage (RFC 3828).
         */
@@ -1340,6 +1343,7 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
                up->pcrlen = val;
                up->pcflag |= UDPLITE_RECV_CC;
                break;
+#endif
 
        default:
                err = -ENOPROTOOPT;
@@ -1352,7 +1356,7 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
 int udp_setsockopt(struct sock *sk, int level, int optname,
                   char __user *optval, int optlen)
 {
-       if (level == SOL_UDP  ||  level == SOL_UDPLITE)
+       if (IS_SOL_UDPFAMILY(level))
                return udp_lib_setsockopt(sk, level, optname, optval, optlen,
                                          udp_push_pending_frames);
        return ip_setsockopt(sk, level, optname, optval, optlen);
@@ -1362,7 +1366,7 @@ int udp_setsockopt(struct sock *sk, int level, int optname,
 int compat_udp_setsockopt(struct sock *sk, int level, int optname,
                          char __user *optval, int optlen)
 {
-       if (level == SOL_UDP  ||  level == SOL_UDPLITE)
+       if (IS_SOL_UDPFAMILY(level))
                return udp_lib_setsockopt(sk, level, optname, optval, optlen,
                                          udp_push_pending_frames);
        return compat_ip_setsockopt(sk, level, optname, optval, optlen);
@@ -1416,7 +1420,7 @@ int udp_lib_getsockopt(struct sock *sk, int level, int optname,
 int udp_getsockopt(struct sock *sk, int level, int optname,
                   char __user *optval, int __user *optlen)
 {
-       if (level == SOL_UDP  ||  level == SOL_UDPLITE)
+       if (IS_SOL_UDPFAMILY(level))
                return udp_lib_getsockopt(sk, level, optname, optval, optlen);
        return ip_getsockopt(sk, level, optname, optval, optlen);
 }
@@ -1425,7 +1429,7 @@ int udp_getsockopt(struct sock *sk, int level, int optname,
 int compat_udp_getsockopt(struct sock *sk, int level, int optname,
                                 char __user *optval, int __user *optlen)
 {
-       if (level == SOL_UDP  ||  level == SOL_UDPLITE)
+       if (IS_SOL_UDPFAMILY(level))
                return udp_lib_getsockopt(sk, level, optname, optval, optlen);
        return compat_ip_getsockopt(sk, level, optname, optval, optlen);
 }
index ae14617..8196947 100644 (file)
@@ -6,7 +6,7 @@ obj-$(CONFIG_IPV6) += ipv6.o
 
 ipv6-objs :=   af_inet6.o anycast.o ip6_output.o ip6_input.o addrconf.o \
                addrlabel.o \
-               route.o ip6_fib.o ipv6_sockglue.o ndisc.o udp.o udplite.o \
+               route.o ip6_fib.o ipv6_sockglue.o ndisc.o udp.o \
                raw.o protocol.o icmp.o mcast.o reassembly.o tcp_ipv6.o \
                exthdrs.o datagram.o ip6_flowlabel.o inet6_connection_sock.o
 
@@ -17,6 +17,7 @@ ipv6-$(CONFIG_NETFILTER) += netfilter.o
 ipv6-$(CONFIG_IPV6_MULTIPLE_TABLES) += fib6_rules.o
 ipv6-$(CONFIG_PROC_FS) += proc.o
 ipv6-$(CONFIG_SYN_COOKIES) += syncookies.o
+ipv6-$(CONFIG_IP_UDPLITE) += udplite.o
 
 ipv6-objs += $(ipv6-y)
 
index 9869f87..243c42a 100644 (file)
@@ -691,12 +691,16 @@ static int __init init_ipv6_mibs(void)
                goto err_icmpmsg_mib;
        if (snmp_mib_init((void **)udp_stats_in6, sizeof (struct udp_mib)) < 0)
                goto err_udp_mib;
+#ifdef CONFIG_IP_UDPLITE
        if (snmp_mib_init((void **)udplite_stats_in6,
                          sizeof (struct udp_mib)) < 0)
                goto err_udplite_mib;
+#endif
        return 0;
 
+#ifdef CONFIG_IP_UDPLITE
 err_udplite_mib:
+#endif
        snmp_mib_free((void **)udp_stats_in6);
 err_udp_mib:
        snmp_mib_free((void **)icmpv6msg_statistics);
@@ -715,7 +719,9 @@ static void cleanup_ipv6_mibs(void)
        snmp_mib_free((void **)icmpv6_statistics);
        snmp_mib_free((void **)icmpv6msg_statistics);
        snmp_mib_free((void **)udp_stats_in6);
+#ifdef CONFIG_IP_UDPLITE
        snmp_mib_free((void **)udplite_stats_in6);
+#endif
 }
 
 static int inet6_net_init(struct net *net)
@@ -760,9 +766,11 @@ static int __init inet6_init(void)
        if (err)
                goto out_unregister_tcp_proto;
 
+#ifdef CONFIG_IP_UDPLITE
        err = proto_register(&udplitev6_prot, 1);
        if (err)
                goto out_unregister_udp_proto;
+#endif
 
        err = proto_register(&rawv6_prot, 1);
        if (err)
@@ -933,8 +941,10 @@ out_sock_register_fail:
 out_unregister_raw_proto:
        proto_unregister(&rawv6_prot);
 out_unregister_udplite_proto:
+#ifdef CONFIG_IP_UDPLITE
        proto_unregister(&udplitev6_prot);
 out_unregister_udp_proto:
+#endif
        proto_unregister(&udpv6_prot);
 out_unregister_tcp_proto:
        proto_unregister(&tcpv6_prot);
@@ -950,7 +960,9 @@ static void __exit inet6_exit(void)
        rtnl_unregister_all(PF_INET6);
 
        udpv6_exit();
+#ifdef CONFIG_IP_UDPLITE
        udplitev6_exit();
+#endif
        tcpv6_exit();
 
        /* Cleanup code parts. */
@@ -982,7 +994,9 @@ static void __exit inet6_exit(void)
        unregister_pernet_subsys(&inet6_net_ops);
        cleanup_ipv6_mibs();
        proto_unregister(&rawv6_prot);
+#ifdef CONFIG_IP_UDPLITE
        proto_unregister(&udplitev6_prot);
+#endif
        proto_unregister(&udpv6_prot);
        proto_unregister(&tcpv6_prot);
 }
index bf2a686..0a18fec 100644 (file)
@@ -239,7 +239,9 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
                        struct sk_buff *pktopt;
 
                        if (sk->sk_protocol != IPPROTO_UDP &&
+#ifdef CONFIG_IP_UDPLITE
                            sk->sk_protocol != IPPROTO_UDPLITE &&
+#endif
                            sk->sk_protocol != IPPROTO_TCP)
                                break;
 
@@ -279,7 +281,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
                        } else {
                                struct proto *prot = &udp_prot;
 
-                               if (sk->sk_protocol == IPPROTO_UDPLITE)
+                               if (IS_PROTO_UDPLITE(sk->sk_protocol))
                                        prot = &udplite_prot;
                                local_bh_disable();
                                sock_prot_inuse_add(sk->sk_prot, -1);
@@ -844,7 +846,9 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
        switch (optname) {
        case IPV6_ADDRFORM:
                if (sk->sk_protocol != IPPROTO_UDP &&
+#ifdef CONFIG_IP_UDPLITE
                    sk->sk_protocol != IPPROTO_UDPLITE &&
+#endif
                    sk->sk_protocol != IPPROTO_TCP)
                        return -EINVAL;
                if (sk->sk_state != TCP_ESTABLISHED)
index 199ef37..5ba7ae8 100644 (file)
@@ -39,8 +39,10 @@ static int sockstat6_seq_show(struct seq_file *seq, void *v)
                       sock_prot_inuse_get(&tcpv6_prot));
        seq_printf(seq, "UDP6: inuse %d\n",
                       sock_prot_inuse_get(&udpv6_prot));
+#ifdef CONFIG_IP_UDPLITE
        seq_printf(seq, "UDPLITE6: inuse %d\n",
                        sock_prot_inuse_get(&udplitev6_prot));
+#endif
        seq_printf(seq, "RAW6: inuse %d\n",
                       sock_prot_inuse_get(&rawv6_prot));
        seq_printf(seq, "FRAG6: inuse %d memory %d\n",
@@ -111,6 +113,7 @@ static struct snmp_mib snmp6_udp6_list[] = {
        SNMP_MIB_SENTINEL
 };
 
+#ifdef CONFIG_IP_UDPLITE
 static struct snmp_mib snmp6_udplite6_list[] = {
        SNMP_MIB_ITEM("UdpLite6InDatagrams", UDP_MIB_INDATAGRAMS),
        SNMP_MIB_ITEM("UdpLite6NoPorts", UDP_MIB_NOPORTS),
@@ -118,6 +121,7 @@ static struct snmp_mib snmp6_udplite6_list[] = {
        SNMP_MIB_ITEM("UdpLite6OutDatagrams", UDP_MIB_OUTDATAGRAMS),
        SNMP_MIB_SENTINEL
 };
+#endif
 
 static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib)
 {
@@ -176,7 +180,9 @@ static int snmp6_seq_show(struct seq_file *seq, void *v)
                snmp6_seq_show_item(seq, (void **)icmpv6_statistics, snmp6_icmp6_list);
                snmp6_seq_show_icmpv6msg(seq, (void **)icmpv6msg_statistics);
                snmp6_seq_show_item(seq, (void **)udp_stats_in6, snmp6_udp6_list);
+#ifdef CONFIG_IP_UDPLITE
                snmp6_seq_show_item(seq, (void **)udplite_stats_in6, snmp6_udplite6_list);
+#endif
        }
        return 0;
 }
index 53739de..55feac7 100644 (file)
@@ -400,7 +400,7 @@ static inline int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh,
        UDP_SKB_CB(skb)->partial_cov = 0;
        UDP_SKB_CB(skb)->cscov = skb->len;
 
-       if (proto == IPPROTO_UDPLITE) {
+       if (IS_PROTO_UDPLITE(proto)) {
                err = udplite_checksum_init(skb, uh);
                if (err)
                        return err;
@@ -489,7 +489,7 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[],
 
                if (udp_lib_checksum_complete(skb))
                        goto discard;
-               UDP6_INC_STATS_BH(UDP_MIB_NOPORTS, proto == IPPROTO_UDPLITE);
+               UDP6_INC_STATS_BH(UDP_MIB_NOPORTS, IS_PROTO_UDPLITE(proto));
 
                icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_PORT_UNREACH, 0, dev);
 
@@ -510,11 +510,11 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[],
 
 short_packet:
        LIMIT_NETDEBUG(KERN_DEBUG "UDP%sv6: short packet: %d/%u\n",
-                      proto == IPPROTO_UDPLITE ? "-Lite" : "",
+                      IS_PROTO_UDPLITE(proto) ? "-Lite" : "",
                       ulen, skb->len);
 
 discard:
-       UDP6_INC_STATS_BH(UDP_MIB_INERRORS, proto == IPPROTO_UDPLITE);
+       UDP6_INC_STATS_BH(UDP_MIB_INERRORS, IS_PROTO_UDPLITE(proto));
        kfree_skb(skb);
        return 0;
 }
@@ -890,7 +890,7 @@ int udpv6_destroy_sock(struct sock *sk)
 int udpv6_setsockopt(struct sock *sk, int level, int optname,
                     char __user *optval, int optlen)
 {
-       if (level == SOL_UDP  ||  level == SOL_UDPLITE)
+       if (IS_SOL_UDPFAMILY(level))
                return udp_lib_setsockopt(sk, level, optname, optval, optlen,
                                          udp_v6_push_pending_frames);
        return ipv6_setsockopt(sk, level, optname, optval, optlen);
@@ -900,7 +900,7 @@ int udpv6_setsockopt(struct sock *sk, int level, int optname,
 int compat_udpv6_setsockopt(struct sock *sk, int level, int optname,
                            char __user *optval, int optlen)
 {
-       if (level == SOL_UDP  ||  level == SOL_UDPLITE)
+       if (IS_SOL_UDPFAMILY(level))
                return udp_lib_setsockopt(sk, level, optname, optval, optlen,
                                          udp_v6_push_pending_frames);
        return compat_ipv6_setsockopt(sk, level, optname, optval, optlen);
@@ -910,7 +910,7 @@ int compat_udpv6_setsockopt(struct sock *sk, int level, int optname,
 int udpv6_getsockopt(struct sock *sk, int level, int optname,
                     char __user *optval, int __user *optlen)
 {
-       if (level == SOL_UDP  ||  level == SOL_UDPLITE)
+       if (IS_SOL_UDPFAMILY(level))
                return udp_lib_getsockopt(sk, level, optname, optval, optlen);
        return ipv6_getsockopt(sk, level, optname, optval, optlen);
 }
@@ -919,7 +919,7 @@ int udpv6_getsockopt(struct sock *sk, int level, int optname,
 int compat_udpv6_getsockopt(struct sock *sk, int level, int optname,
                            char __user *optval, int __user *optlen)
 {
-       if (level == SOL_UDP  ||  level == SOL_UDPLITE)
+       if (IS_SOL_UDPFAMILY(level))
                return udp_lib_getsockopt(sk, level, optname, optval, optlen);
        return compat_ipv6_getsockopt(sk, level, optname, optval, optlen);
 }