void __user *arg);
 
 extern int                     ipv6_chk_addr(struct net *net,
-                                             struct in6_addr *addr,
+                                             const struct in6_addr *addr,
                                              struct net_device *dev,
                                              int strict);
 
 #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
 extern int                     ipv6_chk_home_addr(struct net *net,
-                                                  struct in6_addr *addr);
+                                                  const struct in6_addr *addr);
 #endif
 
-extern int                     ipv6_chk_prefix(struct in6_addr *addr,
+extern int                     ipv6_chk_prefix(const struct in6_addr *addr,
                                                struct net_device *dev);
 
 extern struct inet6_ifaddr      *ipv6_get_ifaddr(struct net *net,
 extern int                     ipv6_rcv_saddr_equal(const struct sock *sk,
                                                    const struct sock *sk2);
 extern void                    addrconf_join_solict(struct net_device *dev,
-                                       struct in6_addr *addr);
+                                       const struct in6_addr *addr);
 extern void                    addrconf_leave_solict(struct inet6_dev *idev,
-                                       struct in6_addr *addr);
+                                       const struct in6_addr *addr);
 
 static inline unsigned long addrconf_timeout_fixup(u32 timeout,
                                                    unsigned unit)
 /*
  *     anycast prototypes (anycast.c)
  */
-extern int ipv6_sock_ac_join(struct sock *sk,int ifindex,struct in6_addr *addr);
-extern int ipv6_sock_ac_drop(struct sock *sk,int ifindex,struct in6_addr *addr);
+extern int ipv6_sock_ac_join(struct sock *sk,int ifindex, const struct in6_addr *addr);
+extern int ipv6_sock_ac_drop(struct sock *sk,int ifindex, const struct in6_addr *addr);
 extern void ipv6_sock_ac_close(struct sock *sk);
-extern int inet6_ac_check(struct sock *sk, struct in6_addr *addr, int ifindex);
+extern int inet6_ac_check(struct sock *sk, const struct in6_addr *addr, int ifindex);
 
-extern int ipv6_dev_ac_inc(struct net_device *dev, struct in6_addr *addr);
-extern int __ipv6_dev_ac_dec(struct inet6_dev *idev, struct in6_addr *addr);
+extern int ipv6_dev_ac_inc(struct net_device *dev, const struct in6_addr *addr);
+extern int __ipv6_dev_ac_dec(struct inet6_dev *idev, const struct in6_addr *addr);
 extern int ipv6_chk_acast_addr(struct net *net, struct net_device *dev,
-                              struct in6_addr *addr);
+                              const struct in6_addr *addr);
 
 
 /* Device notifier */
 
        struct rcu_head         rcu;
 };
 
-static inline void ipv6_eth_mc_map(struct in6_addr *addr, char *buf)
+static inline void ipv6_eth_mc_map(const struct in6_addr *addr, char *buf)
 {
        /*
         *      +-------+-------+-------+-------+-------+-------+
        memcpy(buf + 2, &addr->s6_addr32[3], sizeof(__u32));
 }
 
-static inline void ipv6_tr_mc_map(struct in6_addr *addr, char *buf)
+static inline void ipv6_tr_mc_map(const struct in6_addr *addr, char *buf)
 {
        /* All nodes FF01::1, FF02::1, FF02::1:FFxx:xxxx */
 
 
        return inet_getpeer(&daddr, create);
 }
 
-static inline struct inet_peer *inet_getpeer_v6(struct in6_addr *v6daddr, int create)
+static inline struct inet_peer *inet_getpeer_v6(const struct in6_addr *v6daddr, int create)
 {
        struct inetpeer_addr daddr;
 
 
                                                  pol_lookup_t lookup);
 
 extern struct fib6_node                *fib6_lookup(struct fib6_node *root,
-                                            struct in6_addr *daddr,
-                                            struct in6_addr *saddr);
+                                            const struct in6_addr *daddr,
+                                            const struct in6_addr *saddr);
 
 struct fib6_node               *fib6_locate(struct fib6_node *root,
-                                            struct in6_addr *daddr, int dst_len,
-                                            struct in6_addr *saddr, int src_len);
+                                            const struct in6_addr *daddr, int dst_len,
+                                            const struct in6_addr *saddr, int src_len);
 
 extern void                    fib6_clean_all(struct net *net,
                                               int (*func)(struct rt6_info *, void *arg),
 
 
 extern int                     ip6_route_get_saddr(struct net *net,
                                                    struct rt6_info *rt,
-                                                   struct in6_addr *daddr,
+                                                   const struct in6_addr *daddr,
                                                    unsigned int prefs,
                                                    struct in6_addr *saddr);
 
  *     support functions for ND
  *
  */
-extern struct rt6_info *       rt6_get_dflt_router(struct in6_addr *addr,
+extern struct rt6_info *       rt6_get_dflt_router(const struct in6_addr *addr,
                                                    struct net_device *dev);
-extern struct rt6_info *       rt6_add_dflt_router(struct in6_addr *gwaddr,
+extern struct rt6_info *       rt6_add_dflt_router(const struct in6_addr *gwaddr,
                                                    struct net_device *dev,
                                                    unsigned int pref);
 
 
 extern int                     rt6_route_rcv(struct net_device *dev,
                                              u8 *opt, int len,
-                                             struct in6_addr *gwaddr);
+                                             const struct in6_addr *gwaddr);
 
-extern void                    rt6_redirect(struct in6_addr *dest,
-                                            struct in6_addr *src,
-                                            struct in6_addr *saddr,
+extern void                    rt6_redirect(const struct in6_addr *dest,
+                                            const struct in6_addr *src,
+                                            const struct in6_addr *saddr,
                                             struct neighbour *neigh,
                                             u8 *lladdr,
                                             int on_link);
 
-extern void                    rt6_pmtu_discovery(struct in6_addr *daddr,
-                                                  struct in6_addr *saddr,
+extern void                    rt6_pmtu_discovery(const struct in6_addr *daddr,
+                                                  const struct in6_addr *saddr,
                                                   struct net_device *dev,
                                                   u32 pmtu);
 
 
 struct ip6_create_arg {
        __be32 id;
        u32 user;
-       struct in6_addr *src;
-       struct in6_addr *dst;
+       const struct in6_addr *src;
+       const struct in6_addr *dst;
 };
 
 void ip6_frag_init(struct inet_frag_queue *q, void *a);
 
                                                    struct neighbour *neigh,
                                                    const struct in6_addr *target);
 
-extern int                     ndisc_mc_map(struct in6_addr *addr, char *buf, struct net_device *dev, int dir);
+extern int                     ndisc_mc_map(const struct in6_addr *addr, char *buf,
+                                            struct net_device *dev, int dir);
 
 extern struct sk_buff          *ndisc_build_skb(struct net_device *dev,
                                                 const struct in6_addr *daddr,
 
        return ip_route_input_common(skb, dst, src, tos, devin, true);
 }
 
-extern unsigned short  ip_rt_frag_needed(struct net *net, struct iphdr *iph, unsigned short new_mtu, struct net_device *dev);
+extern unsigned short  ip_rt_frag_needed(struct net *net, const struct iphdr *iph,
+                                         unsigned short new_mtu, struct net_device *dev);
 extern void            ip_rt_send_redirect(struct sk_buff *skb);
 
 extern unsigned                inet_addr_type(struct net *net, __be32 addr);
 
 extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family);
 extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family);
 extern __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr);
-extern __be32 xfrm6_tunnel_spi_lookup(struct net *net, xfrm_address_t *saddr);
+extern __be32 xfrm6_tunnel_spi_lookup(struct net *net, const xfrm_address_t *saddr);
 extern int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb);
 extern int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
 extern int xfrm6_output(struct sk_buff *skb);
        case AF_INET:
                return (__force u32)a->a4 - (__force u32)b->a4;
        case AF_INET6:
-               return ipv6_addr_cmp((struct in6_addr *)a,
-                                    (struct in6_addr *)b);
+               return ipv6_addr_cmp((const struct in6_addr *)a,
+                                    (const struct in6_addr *)b);
        }
 }
 
 
 
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br,
-                                                   struct in6_addr *group)
+                                                   const struct in6_addr *group)
 {
        struct sk_buff *skb;
        struct ipv6hdr *ip6h;
                                  struct net_bridge_port *port,
                                  struct sk_buff *skb)
 {
-       struct iphdr *iph = ip_hdr(skb);
+       const struct iphdr *iph = ip_hdr(skb);
        struct igmphdr *ih = igmp_hdr(skb);
        struct net_bridge_mdb_entry *mp;
        struct igmpv3_query *ih3;
                                  struct net_bridge_port *port,
                                  struct sk_buff *skb)
 {
-       struct ipv6hdr *ip6h = ipv6_hdr(skb);
+       const struct ipv6hdr *ip6h = ipv6_hdr(skb);
        struct mld_msg *mld = (struct mld_msg *) icmp6_hdr(skb);
        struct net_bridge_mdb_entry *mp;
        struct mld2_query *mld2q;
        struct net_bridge_port_group __rcu **pp;
        unsigned long max_delay;
        unsigned long now = jiffies;
-       struct in6_addr *group = NULL;
+       const struct in6_addr *group = NULL;
        int err = 0;
 
        spin_lock(&br->multicast_lock);
                                 struct sk_buff *skb)
 {
        struct sk_buff *skb2 = skb;
-       struct iphdr *iph;
+       const struct iphdr *iph;
        struct igmphdr *ih;
        unsigned len;
        unsigned offset;
                                 struct sk_buff *skb)
 {
        struct sk_buff *skb2;
-       struct ipv6hdr *ip6h;
+       const struct ipv6hdr *ip6h;
        struct icmp6hdr *icmp6h;
        u8 nexthdr;
        unsigned len;
 
 static int br_parse_ip_options(struct sk_buff *skb)
 {
        struct ip_options *opt;
-       struct iphdr *iph;
+       const struct iphdr *iph;
        struct net_device *dev = skb->dev;
        u32 len;
 
                                           const struct net_device *out,
                                           int (*okfn)(struct sk_buff *))
 {
-       struct ipv6hdr *hdr;
+       const struct ipv6hdr *hdr;
        u32 pkt_len;
 
        if (skb->len < sizeof(struct ipv6hdr))
 
 __u32 __skb_get_rxhash(struct sk_buff *skb)
 {
        int nhoff, hash = 0, poff;
-       struct ipv6hdr *ip6;
-       struct iphdr *ip;
+       const struct ipv6hdr *ip6;
+       const struct iphdr *ip;
        u8 ip_proto;
        u32 addr1, addr2, ihl;
        union {
                if (!pskb_may_pull(skb, sizeof(*ip) + nhoff))
                        goto done;
 
-               ip = (struct iphdr *) (skb->data + nhoff);
+               ip = (const struct iphdr *) (skb->data + nhoff);
                if (ip->frag_off & htons(IP_MF | IP_OFFSET))
                        ip_proto = 0;
                else
                if (!pskb_may_pull(skb, sizeof(*ip6) + nhoff))
                        goto done;
 
-               ip6 = (struct ipv6hdr *) (skb->data + nhoff);
+               ip6 = (const struct ipv6hdr *) (skb->data + nhoff);
                ip_proto = ip6->nexthdr;
                addr1 = (__force u32) ip6->saddr.s6_addr32[3];
                addr2 = (__force u32) ip6->daddr.s6_addr32[3];
 
 {
        int proto, len, ulen;
        int hits = 0;
-       struct iphdr *iph;
+       const struct iphdr *iph;
        struct udphdr *uh;
        struct netpoll_info *npinfo = skb->dev->npinfo;
        struct netpoll *np, *tmp;
 
 
 /* add pseudo-header to DCCP checksum stored in skb->csum */
 static inline __sum16 dccp_v6_csum_finish(struct sk_buff *skb,
-                                     struct in6_addr *saddr,
-                                     struct in6_addr *daddr)
+                                     const struct in6_addr *saddr,
+                                     const struct in6_addr *daddr)
 {
        return csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_DCCP, skb->csum);
 }
 static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
                        u8 type, u8 code, int offset, __be32 info)
 {
-       struct ipv6hdr *hdr = (struct ipv6hdr *)skb->data;
+       const struct ipv6hdr *hdr = (const struct ipv6hdr *)skb->data;
        const struct dccp_hdr *dh = (struct dccp_hdr *)(skb->data + offset);
        struct dccp_sock *dp;
        struct ipv6_pinfo *np;
 
 static void dccp_v6_ctl_send_reset(struct sock *sk, struct sk_buff *rxskb)
 {
-       struct ipv6hdr *rxip6h;
+       const struct ipv6hdr *rxip6h;
        struct sk_buff *skb;
        struct flowi6 fl6;
        struct net *net = dev_net(skb_dst(rxskb)->dev);
 
 
 static int inet_gso_send_check(struct sk_buff *skb)
 {
-       struct iphdr *iph;
+       const struct iphdr *iph;
        const struct net_protocol *ops;
        int proto;
        int ihl;
        const struct net_protocol *ops;
        struct sk_buff **pp = NULL;
        struct sk_buff *p;
-       struct iphdr *iph;
+       const struct iphdr *iph;
        unsigned int hlen;
        unsigned int off;
        unsigned int id;
 
  * into IP header for icv calculation. Options are already checked
  * for validity, so paranoia is not required. */
 
-static int ip_clear_mutable_options(struct iphdr *iph, __be32 *daddr)
+static int ip_clear_mutable_options(const struct iphdr *iph, __be32 *daddr)
 {
        unsigned char * optptr = (unsigned char*)(iph+1);
        int  l = iph->ihl*4 - sizeof(struct iphdr);
 static void ah4_err(struct sk_buff *skb, u32 info)
 {
        struct net *net = dev_net(skb->dev);
-       struct iphdr *iph = (struct iphdr *)skb->data;
+       const struct iphdr *iph = (const struct iphdr *)skb->data;
        struct ip_auth_hdr *ah = (struct ip_auth_hdr *)(skb->data+(iph->ihl<<2));
        struct xfrm_state *x;
 
            icmp_hdr(skb)->code != ICMP_FRAG_NEEDED)
                return;
 
-       x = xfrm_state_lookup(net, skb->mark, (xfrm_address_t *)&iph->daddr, ah->spi, IPPROTO_AH, AF_INET);
+       x = xfrm_state_lookup(net, skb->mark, (const xfrm_address_t *)&iph->daddr,
+                             ah->spi, IPPROTO_AH, AF_INET);
        if (!x)
                return;
        printk(KERN_DEBUG "pmtu discovery on SA AH/%08x/%08x\n",
 
 
 static int esp_input_done2(struct sk_buff *skb, int err)
 {
-       struct iphdr *iph;
+       const struct iphdr *iph;
        struct xfrm_state *x = xfrm_input_state(skb);
        struct esp_data *esp = x->data;
        struct crypto_aead *aead = esp->aead;
 static void esp4_err(struct sk_buff *skb, u32 info)
 {
        struct net *net = dev_net(skb->dev);
-       struct iphdr *iph = (struct iphdr *)skb->data;
+       const struct iphdr *iph = (const struct iphdr *)skb->data;
        struct ip_esp_hdr *esph = (struct ip_esp_hdr *)(skb->data+(iph->ihl<<2));
        struct xfrm_state *x;
 
            icmp_hdr(skb)->code != ICMP_FRAG_NEEDED)
                return;
 
-       x = xfrm_state_lookup(net, skb->mark, (xfrm_address_t *)&iph->daddr, esph->spi, IPPROTO_ESP, AF_INET);
+       x = xfrm_state_lookup(net, skb->mark, (const xfrm_address_t *)&iph->daddr,
+                             esph->spi, IPPROTO_ESP, AF_INET);
        if (!x)
                return;
        NETDEBUG(KERN_DEBUG "pmtu discovery on SA ESP/%08x/%08x\n",
 
 }
 
 static struct rtable *icmp_route_lookup(struct net *net, struct sk_buff *skb_in,
-                                       struct iphdr *iph,
+                                       const struct iphdr *iph,
                                        __be32 saddr, u8 tos,
                                        int type, int code,
                                        struct icmp_bxm *param)
 
 static void icmp_unreach(struct sk_buff *skb)
 {
-       struct iphdr *iph;
+       const struct iphdr *iph;
        struct icmphdr *icmph;
        int hash, protocol;
        const struct net_protocol *ipprot;
                goto out_err;
 
        icmph = icmp_hdr(skb);
-       iph   = (struct iphdr *)skb->data;
+       iph   = (const struct iphdr *)skb->data;
 
        if (iph->ihl < 5) /* Mangled header, drop. */
                goto out_err;
        if (!pskb_may_pull(skb, iph->ihl * 4 + 8))
                goto out;
 
-       iph = (struct iphdr *)skb->data;
+       iph = (const struct iphdr *)skb->data;
        protocol = iph->protocol;
 
        /*
 
 static void icmp_redirect(struct sk_buff *skb)
 {
-       struct iphdr *iph;
+       const struct iphdr *iph;
 
        if (skb->len < sizeof(struct iphdr))
                goto out_err;
        if (!pskb_may_pull(skb, sizeof(struct iphdr)))
                goto out;
 
-       iph = (struct iphdr *)skb->data;
+       iph = (const struct iphdr *)skb->data;
 
        switch (icmp_hdr(skb)->code & 7) {
        case ICMP_REDIR_NET:
 
 
 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
        if (r->idiag_family == AF_INET6) {
-               struct ipv6_pinfo *np = inet6_sk(sk);
+               const struct ipv6_pinfo *np = inet6_sk(sk);
 
                ipv6_addr_copy((struct in6_addr *)r->id.idiag_src,
                               &np->rcv_saddr);
 
  * Basic tcp checks whether packet is suitable for LRO
  */
 
-static int lro_tcp_ip_check(struct iphdr *iph, struct tcphdr *tcph,
-                           int len, struct net_lro_desc *lro_desc)
+static int lro_tcp_ip_check(const struct iphdr *iph, const struct tcphdr *tcph,
+                           int len, const struct net_lro_desc *lro_desc)
 {
         /* check ip header: don't aggregate padded frames */
        if (ntohs(iph->tot_len) != len)
 
    by themself???
  */
 
-       struct iphdr *iph = (struct iphdr *)skb->data;
+       const struct iphdr *iph = (const struct iphdr *)skb->data;
        __be16       *p = (__be16*)(skb->data+(iph->ihl<<2));
        int grehlen = (iph->ihl<<2) + 4;
        const int type = icmp_hdr(skb)->type;
        rcu_read_unlock();
 }
 
-static inline void ipgre_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb)
+static inline void ipgre_ecn_decapsulate(const struct iphdr *iph, struct sk_buff *skb)
 {
        if (INET_ECN_is_ce(iph->tos)) {
                if (skb->protocol == htons(ETH_P_IP)) {
 }
 
 static inline u8
-ipgre_ecn_encapsulate(u8 tos, struct iphdr *old_iph, struct sk_buff *skb)
+ipgre_ecn_encapsulate(u8 tos, const struct iphdr *old_iph, struct sk_buff *skb)
 {
        u8 inner = 0;
        if (skb->protocol == htons(ETH_P_IP))
                inner = old_iph->tos;
        else if (skb->protocol == htons(ETH_P_IPV6))
-               inner = ipv6_get_dsfield((struct ipv6hdr *)old_iph);
+               inner = ipv6_get_dsfield((const struct ipv6hdr *)old_iph);
        return INET_ECN_encapsulate(tos, inner);
 }
 
 static int ipgre_rcv(struct sk_buff *skb)
 {
-       struct iphdr *iph;
+       const struct iphdr *iph;
        u8     *h;
        __be16    flags;
        __sum16   csum = 0;
 {
        struct ip_tunnel *tunnel = netdev_priv(dev);
        struct pcpu_tstats *tstats;
-       struct iphdr  *old_iph = ip_hdr(skb);
-       struct iphdr  *tiph;
+       const struct iphdr  *old_iph = ip_hdr(skb);
+       const struct iphdr  *tiph;
        u8     tos;
        __be16 df;
        struct rtable *rt;                      /* Route to the other host */
 
        if (dev->header_ops && dev->type == ARPHRD_IPGRE) {
                gre_hlen = 0;
-               tiph = (struct iphdr *)skb->data;
+               tiph = (const struct iphdr *)skb->data;
        } else {
                gre_hlen = tunnel->hlen;
                tiph = &tunnel->parms.iph;
                }
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
                else if (skb->protocol == htons(ETH_P_IPV6)) {
-                       struct in6_addr *addr6;
+                       const struct in6_addr *addr6;
                        int addr_type;
                        struct neighbour *neigh = skb_dst(skb)->neighbour;
 
                        if (neigh == NULL)
                                goto tx_error;
 
-                       addr6 = (struct in6_addr *)&neigh->primary_key;
+                       addr6 = (const struct in6_addr *)&neigh->primary_key;
                        addr_type = ipv6_addr_type(addr6);
 
                        if (addr_type == IPV6_ADDR_ANY) {
                if (skb->protocol == htons(ETH_P_IP))
                        tos = old_iph->tos;
                else if (skb->protocol == htons(ETH_P_IPV6))
-                       tos = ipv6_get_dsfield((struct ipv6hdr *)old_iph);
+                       tos = ipv6_get_dsfield((const struct ipv6hdr *)old_iph);
        }
 
        rt = ip_route_output_gre(dev_net(dev), dst, tiph->saddr,
                        iph->ttl = old_iph->ttl;
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
                else if (skb->protocol == htons(ETH_P_IPV6))
-                       iph->ttl = ((struct ipv6hdr *)old_iph)->hop_limit;
+                       iph->ttl = ((const struct ipv6hdr *)old_iph)->hop_limit;
 #endif
                else
                        iph->ttl = ip4_dst_hoplimit(&rt->dst);
 {
        struct net_device *tdev = NULL;
        struct ip_tunnel *tunnel;
-       struct iphdr *iph;
+       const struct iphdr *iph;
        int hlen = LL_MAX_HEADER;
        int mtu = ETH_DATA_LEN;
        int addend = sizeof(struct iphdr) + 4;
 
 static int ipgre_header_parse(const struct sk_buff *skb, unsigned char *haddr)
 {
-       struct iphdr *iph = (struct iphdr *) skb_mac_header(skb);
+       const struct iphdr *iph = (const struct iphdr *) skb_mac_header(skb);
        memcpy(haddr, &iph->saddr, 4);
        return 4;
 }
 
 static inline int ip_rcv_options(struct sk_buff *skb)
 {
        struct ip_options *opt;
-       struct iphdr *iph;
+       const struct iphdr *iph;
        struct net_device *dev = skb->dev;
 
        /* It looks as overkill, because not all
  */
 int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
 {
-       struct iphdr *iph;
+       const struct iphdr *iph;
        u32 len;
 
        /* When the interface is in promisc. mode, drop all the crap
 
 static void ip_cmsg_recv_dstaddr(struct msghdr *msg, struct sk_buff *skb)
 {
        struct sockaddr_in sin;
-       struct iphdr *iph = ip_hdr(skb);
+       const struct iphdr *iph = ip_hdr(skb);
        __be16 *ports = (__be16 *)skb_transport_header(skb);
 
        if (skb_transport_offset(skb) + 4 > skb->len)
 
 {
        struct net *net = dev_net(skb->dev);
        __be32 spi;
-       struct iphdr *iph = (struct iphdr *)skb->data;
+       const struct iphdr *iph = (const struct iphdr *)skb->data;
        struct ip_comp_hdr *ipch = (struct ip_comp_hdr *)(skb->data+(iph->ihl<<2));
        struct xfrm_state *x;
 
                return;
 
        spi = htonl(ntohs(ipch->cpi));
-       x = xfrm_state_lookup(net, skb->mark, (xfrm_address_t *)&iph->daddr,
+       x = xfrm_state_lookup(net, skb->mark, (const xfrm_address_t *)&iph->daddr,
                              spi, IPPROTO_COMP, AF_INET);
        if (!x)
                return;
 
    8 bytes of packet payload. It means, that precise relaying of
    ICMP in the real Internet is absolutely infeasible.
  */
-       struct iphdr *iph = (struct iphdr *)skb->data;
+       const struct iphdr *iph = (const struct iphdr *)skb->data;
        const int type = icmp_hdr(skb)->type;
        const int code = icmp_hdr(skb)->code;
        struct ip_tunnel *t;
 {
        struct ip_tunnel *tunnel = netdev_priv(dev);
        struct pcpu_tstats *tstats;
-       struct iphdr  *tiph = &tunnel->parms.iph;
+       const struct iphdr  *tiph = &tunnel->parms.iph;
        u8     tos = tunnel->parms.iph.tos;
        __be16 df = tiph->frag_off;
        struct rtable *rt;                      /* Route to the other host */
        struct net_device *tdev;                /* Device to other host */
-       struct iphdr  *old_iph = ip_hdr(skb);
+       const struct iphdr  *old_iph = ip_hdr(skb);
        struct iphdr  *iph;                     /* Our new IP header */
        unsigned int max_headroom;              /* The extra header space needed */
        __be32 dst = tiph->daddr;
 {
        struct net_device *tdev = NULL;
        struct ip_tunnel *tunnel;
-       struct iphdr *iph;
+       const struct iphdr *iph;
 
        tunnel = netdev_priv(dev);
        iph = &tunnel->parms.iph;
 
 static void ip_encap(struct sk_buff *skb, __be32 saddr, __be32 daddr)
 {
        struct iphdr *iph;
-       struct iphdr *old_iph = ip_hdr(skb);
+       const struct iphdr *old_iph = ip_hdr(skb);
 
        skb_push(skb, sizeof(struct iphdr));
        skb->transport_header = skb->network_header;
 
 }
 EXPORT_SYMBOL_GPL(nf_nat_set_seq_adjust);
 
-static void nf_nat_csum(struct sk_buff *skb, struct iphdr *iph, void *data,
+static void nf_nat_csum(struct sk_buff *skb, const struct iphdr *iph, void *data,
                        int datalen, __sum16 *check, int oldlen)
 {
        struct rtable *rt = skb_rtable(skb);
 
  * RFC 1122: SHOULD pass TOS value up to the transport layer.
  * -> It does. And not only TOS, but all IP header.
  */
-static int raw_v4_input(struct sk_buff *skb, struct iphdr *iph, int hash)
+static int raw_v4_input(struct sk_buff *skb, const struct iphdr *iph, int hash)
 {
        struct sock *sk;
        struct hlist_head *head;
        }
 
        if (inet->recverr) {
-               struct iphdr *iph = (struct iphdr *)skb->data;
+               const struct iphdr *iph = (const struct iphdr *)skb->data;
                u8 *payload = skb->data + (iph->ihl << 2);
 
                if (inet->hdrincl)
 {
        int hash;
        struct sock *raw_sk;
-       struct iphdr *iph;
+       const struct iphdr *iph;
        struct net *net;
 
        hash = protocol & (RAW_HTABLE_SIZE - 1);
        read_lock(&raw_v4_hashinfo.lock);
        raw_sk = sk_head(&raw_v4_hashinfo.ht[hash]);
        if (raw_sk != NULL) {
-               iph = (struct iphdr *)skb->data;
+               iph = (const struct iphdr *)skb->data;
                net = dev_net(skb->dev);
 
                while ((raw_sk = __raw_v4_lookup(net, raw_sk, protocol,
                                                skb->dev->ifindex)) != NULL) {
                        raw_err(raw_sk, skb, info);
                        raw_sk = sk_next(raw_sk);
-                       iph = (struct iphdr *)skb->data;
+                       iph = (const struct iphdr *)skb->data;
                }
        }
        read_unlock(&raw_v4_hashinfo.lock);
 
        return 68;
 }
 
-unsigned short ip_rt_frag_needed(struct net *net, struct iphdr *iph,
+unsigned short ip_rt_frag_needed(struct net *net, const struct iphdr *iph,
                                 unsigned short new_mtu,
                                 struct net_device *dev)
 {
 
 /*
  * This routine does path mtu discovery as defined in RFC1191.
  */
-static void do_pmtu_discovery(struct sock *sk, struct iphdr *iph, u32 mtu)
+static void do_pmtu_discovery(struct sock *sk, const struct iphdr *iph, u32 mtu)
 {
        struct dst_entry *dst;
        struct inet_sock *inet = inet_sk(sk);
 
 void tcp_v4_err(struct sk_buff *icmp_skb, u32 info)
 {
-       struct iphdr *iph = (struct iphdr *)icmp_skb->data;
+       const struct iphdr *iph = (const struct iphdr *)icmp_skb->data;
        struct tcphdr *th = (struct tcphdr *)(icmp_skb->data + (iph->ihl << 2));
        struct inet_connection_sock *icsk;
        struct tcp_sock *tp;
 
 struct sk_buff **tcp4_gro_receive(struct sk_buff **head, struct sk_buff *skb)
 {
-       struct iphdr *iph = skb_gro_network_header(skb);
+       const struct iphdr *iph = skb_gro_network_header(skb);
 
        switch (skb->ip_summed) {
        case CHECKSUM_COMPLETE:
 
 int tcp4_gro_complete(struct sk_buff *skb)
 {
-       struct iphdr *iph = ip_hdr(skb);
+       const struct iphdr *iph = ip_hdr(skb);
        struct tcphdr *th = tcp_hdr(skb);
 
        th->check = ~tcp_v4_check(skb->len - skb_transport_offset(skb),
 
 void __udp4_lib_err(struct sk_buff *skb, u32 info, struct udp_table *udptable)
 {
        struct inet_sock *inet;
-       struct iphdr *iph = (struct iphdr *)skb->data;
+       const struct iphdr *iph = (const struct iphdr *)skb->data;
        struct udphdr *uh = (struct udphdr *)(skb->data+(iph->ihl<<2));
        const int type = icmp_hdr(skb)->type;
        const int code = icmp_hdr(skb)->code;
 
 static void
 _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse)
 {
-       struct iphdr *iph = ip_hdr(skb);
+       const struct iphdr *iph = ip_hdr(skb);
        u8 *xprth = skb_network_header(skb) + iph->ihl * 4;
        struct flowi4 *fl4 = &fl->u.ip4;
 
 
 
 int xfrm4_extract_header(struct sk_buff *skb)
 {
-       struct iphdr *iph = ip_hdr(skb);
+       const struct iphdr *iph = ip_hdr(skb);
 
        XFRM_MODE_SKB_CB(skb)->ihl = sizeof(*iph);
        XFRM_MODE_SKB_CB(skb)->id = iph->id;
 
        return cnt;
 }
 
-int ipv6_chk_addr(struct net *net, struct in6_addr *addr,
+int ipv6_chk_addr(struct net *net, const struct in6_addr *addr,
                  struct net_device *dev, int strict)
 {
        struct inet6_ifaddr *ifp;
        return false;
 }
 
-int ipv6_chk_prefix(struct in6_addr *addr, struct net_device *dev)
+int ipv6_chk_prefix(const struct in6_addr *addr, struct net_device *dev)
 {
        struct inet6_dev *idev;
        struct inet6_ifaddr *ifa;
 
 /* Join to solicited addr multicast group. */
 
-void addrconf_join_solict(struct net_device *dev, struct in6_addr *addr)
+void addrconf_join_solict(struct net_device *dev, const struct in6_addr *addr)
 {
        struct in6_addr maddr;
 
        ipv6_dev_mc_inc(dev, &maddr);
 }
 
-void addrconf_leave_solict(struct inet6_dev *idev, struct in6_addr *addr)
+void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr)
 {
        struct in6_addr maddr;
 
 /*
  *     Manual configuration of address on an interface
  */
-static int inet6_addr_add(struct net *net, int ifindex, struct in6_addr *pfx,
+static int inet6_addr_add(struct net *net, int ifindex, const struct in6_addr *pfx,
                          unsigned int plen, __u8 ifa_flags, __u32 prefered_lft,
                          __u32 valid_lft)
 {
        return PTR_ERR(ifp);
 }
 
-static int inet6_addr_del(struct net *net, int ifindex, struct in6_addr *pfx,
+static int inet6_addr_del(struct net *net, int ifindex, const struct in6_addr *pfx,
                          unsigned int plen)
 {
        struct inet6_ifaddr *ifp;
        add_addr(idev, &in6addr_loopback, 128, IFA_HOST);
 }
 
-static void addrconf_add_linklocal(struct inet6_dev *idev, struct in6_addr *addr)
+static void addrconf_add_linklocal(struct inet6_dev *idev, const struct in6_addr *addr)
 {
        struct inet6_ifaddr * ifp;
        u32 addr_flags = IFA_F_PERMANENT;
 
 #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
 /* Check if address is a home address configured on any interface. */
-int ipv6_chk_home_addr(struct net *net, struct in6_addr *addr)
+int ipv6_chk_home_addr(struct net *net, const struct in6_addr *addr)
 {
        int ret = 0;
        struct inet6_ifaddr *ifp = NULL;
 
 
 static int ipv6_gso_send_check(struct sk_buff *skb)
 {
-       struct ipv6hdr *ipv6h;
+       const struct ipv6hdr *ipv6h;
        const struct inet6_protocol *ops;
        int err = -EINVAL;
 
 
 
 #include <net/checksum.h>
 
-static int ipv6_dev_ac_dec(struct net_device *dev, struct in6_addr *addr);
+static int ipv6_dev_ac_dec(struct net_device *dev, const struct in6_addr *addr);
 
 /* Big ac list lock for all the sockets */
 static DEFINE_RWLOCK(ipv6_sk_ac_lock);
  *     socket join an anycast group
  */
 
-int ipv6_sock_ac_join(struct sock *sk, int ifindex, struct in6_addr *addr)
+int ipv6_sock_ac_join(struct sock *sk, int ifindex, const struct in6_addr *addr)
 {
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct net_device *dev = NULL;
 /*
  *     socket leave an anycast group
  */
-int ipv6_sock_ac_drop(struct sock *sk, int ifindex, struct in6_addr *addr)
+int ipv6_sock_ac_drop(struct sock *sk, int ifindex, const struct in6_addr *addr)
 {
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct net_device *dev;
 /*
  *     device anycast group inc (add if not found)
  */
-int ipv6_dev_ac_inc(struct net_device *dev, struct in6_addr *addr)
+int ipv6_dev_ac_inc(struct net_device *dev, const struct in6_addr *addr)
 {
        struct ifacaddr6 *aca;
        struct inet6_dev *idev;
 /*
  *     device anycast group decrement
  */
-int __ipv6_dev_ac_dec(struct inet6_dev *idev, struct in6_addr *addr)
+int __ipv6_dev_ac_dec(struct inet6_dev *idev, const struct in6_addr *addr)
 {
        struct ifacaddr6 *aca, *prev_aca;
 
 }
 
 /* called with rcu_read_lock() */
-static int ipv6_dev_ac_dec(struct net_device *dev, struct in6_addr *addr)
+static int ipv6_dev_ac_dec(struct net_device *dev, const struct in6_addr *addr)
 {
        struct inet6_dev *idev = __in6_dev_get(dev);
 
  *     check if the interface has this anycast address
  *     called with rcu_read_lock()
  */
-static int ipv6_chk_acast_dev(struct net_device *dev, struct in6_addr *addr)
+static int ipv6_chk_acast_dev(struct net_device *dev, const struct in6_addr *addr)
 {
        struct inet6_dev *idev;
        struct ifacaddr6 *aca;
  *     check if given interface (or any, if dev==0) has this anycast address
  */
 int ipv6_chk_acast_addr(struct net *net, struct net_device *dev,
-                       struct in6_addr *addr)
+                       const struct in6_addr *addr)
 {
        int found = 0;
 
 
                     u8 type, u8 code, int offset, __be32 info)
 {
        struct net *net = dev_net(skb->dev);
-       struct ipv6hdr *iph = (struct ipv6hdr*)skb->data;
+       const struct ipv6hdr *iph = (const struct ipv6hdr *)skb->data;
        struct ip_esp_hdr *esph = (struct ip_esp_hdr *)(skb->data + offset);
        struct xfrm_state *x;
 
            type != ICMPV6_PKT_TOOBIG)
                return;
 
-       x = xfrm_state_lookup(net, skb->mark, (xfrm_address_t *)&iph->daddr, esph->spi, IPPROTO_ESP, AF_INET6);
+       x = xfrm_state_lookup(net, skb->mark, (const xfrm_address_t *)&iph->daddr,
+                             esph->spi, IPPROTO_ESP, AF_INET6);
        if (!x)
                return;
        printk(KERN_DEBUG "pmtu discovery on SA ESP/%08x/%pI6\n",
 
        struct ipv6hdr *hdr = ipv6_hdr(skb);
        struct sock *sk;
        struct ipv6_pinfo *np;
-       struct in6_addr *saddr = NULL;
+       const struct in6_addr *saddr = NULL;
        struct dst_entry *dst;
        struct icmp6hdr tmp_hdr;
        struct flowi6 fl6;
        struct sock *sk;
        struct inet6_dev *idev;
        struct ipv6_pinfo *np;
-       struct in6_addr *saddr = NULL;
+       const struct in6_addr *saddr = NULL;
        struct icmp6hdr *icmph = icmp6_hdr(skb);
        struct icmp6hdr tmp_hdr;
        struct flowi6 fl6;
 {
        struct net_device *dev = skb->dev;
        struct inet6_dev *idev = __in6_dev_get(dev);
-       struct in6_addr *saddr, *daddr;
-       struct ipv6hdr *orig_hdr;
+       const struct in6_addr *saddr, *daddr;
+       const struct ipv6hdr *orig_hdr;
        struct icmp6hdr *hdr;
        u8 type;
 
 
 # define BITOP_BE32_SWIZZLE    0
 #endif
 
-static __inline__ __be32 addr_bit_set(void *token, int fn_bit)
+static __inline__ __be32 addr_bit_set(const void *token, int fn_bit)
 {
-       __be32 *addr = token;
+       const __be32 *addr = token;
        /*
         * Here,
         *      1 << ((~fn_bit ^ BITOP_BE32_SWIZZLE) & 0x1f)
 
 struct lookup_args {
        int             offset;         /* key offset on rt6_info       */
-       struct in6_addr *addr;          /* search key                   */
+       const struct in6_addr   *addr;          /* search key                   */
 };
 
 static struct fib6_node * fib6_lookup_1(struct fib6_node *root,
        return NULL;
 }
 
-struct fib6_node * fib6_lookup(struct fib6_node *root, struct in6_addr *daddr,
-                              struct in6_addr *saddr)
+struct fib6_node * fib6_lookup(struct fib6_node *root, const struct in6_addr *daddr,
+                              const struct in6_addr *saddr)
 {
        struct fib6_node *fn;
        struct lookup_args args[] = {
 
 
 static struct fib6_node * fib6_locate_1(struct fib6_node *root,
-                                       struct in6_addr *addr,
+                                       const struct in6_addr *addr,
                                        int plen, int offset)
 {
        struct fib6_node *fn;
 }
 
 struct fib6_node * fib6_locate(struct fib6_node *root,
-                              struct in6_addr *daddr, int dst_len,
-                              struct in6_addr *saddr, int src_len)
+                              const struct in6_addr *daddr, int dst_len,
+                              const struct in6_addr *saddr, int src_len)
 {
        struct fib6_node *fn;
 
 
 
 int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
 {
-       struct ipv6hdr *hdr;
+       const struct ipv6hdr *hdr;
        u32             pkt_len;
        struct inet6_dev *idev;
        struct net *net = dev_net(skb->dev);
                int ret;
 
                if (ipprot->flags & INET6_PROTO_FINAL) {
-                       struct ipv6hdr *hdr;
+                       const struct ipv6hdr *hdr;
 
                        /* Free reference early: we don't need it any more,
                           and it may hold ip_conntrack module loaded
 
 int ip6_mc_input(struct sk_buff *skb)
 {
-       struct ipv6hdr *hdr;
+       const struct ipv6hdr *hdr;
        int deliver;
 
        IP6_UPD_PO_STATS_BH(dev_net(skb_dst(skb)->dev),
 
        return err;
 }
 
-static inline int ip6_rt_check(struct rt6key *rt_key,
-                              struct in6_addr *fl_addr,
-                              struct in6_addr *addr_cache)
+static inline int ip6_rt_check(const struct rt6key *rt_key,
+                              const struct in6_addr *fl_addr,
+                              const struct in6_addr *addr_cache)
 {
        return (rt_key->plen != 128 || !ipv6_addr_equal(fl_addr, &rt_key->addr)) &&
                (addr_cache == NULL || !ipv6_addr_equal(fl_addr, addr_cache));
 
 static struct dst_entry *ip6_sk_dst_check(struct sock *sk,
                                          struct dst_entry *dst,
-                                         struct flowi6 *fl6)
+                                         const struct flowi6 *fl6)
 {
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct rt6_info *rt = (struct rt6_info *)dst;
 
        for (t = rcu_dereference(start); t; t = rcu_dereference(t->next))
 
 static struct ip6_tnl *
-ip6_tnl_lookup(struct net *net, struct in6_addr *remote, struct in6_addr *local)
+ip6_tnl_lookup(struct net *net, const struct in6_addr *remote, const struct in6_addr *local)
 {
        unsigned int h0 = HASH(remote);
        unsigned int h1 = HASH(local);
  **/
 
 static struct ip6_tnl __rcu **
-ip6_tnl_bucket(struct ip6_tnl_net *ip6n, struct ip6_tnl_parm *p)
+ip6_tnl_bucket(struct ip6_tnl_net *ip6n, const struct ip6_tnl_parm *p)
 {
-       struct in6_addr *remote = &p->raddr;
-       struct in6_addr *local = &p->laddr;
+       const struct in6_addr *remote = &p->raddr;
+       const struct in6_addr *local = &p->laddr;
        unsigned h = 0;
        int prio = 0;
 
 static struct ip6_tnl *ip6_tnl_locate(struct net *net,
                struct ip6_tnl_parm *p, int create)
 {
-       struct in6_addr *remote = &p->raddr;
-       struct in6_addr *local = &p->laddr;
+       const struct in6_addr *remote = &p->raddr;
+       const struct in6_addr *local = &p->laddr;
        struct ip6_tnl __rcu **tp;
        struct ip6_tnl *t;
        struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);
 static __u16
 parse_tlv_tnl_enc_lim(struct sk_buff *skb, __u8 * raw)
 {
-       struct ipv6hdr *ipv6h = (struct ipv6hdr *) raw;
+       const struct ipv6hdr *ipv6h = (const struct ipv6hdr *) raw;
        __u8 nexthdr = ipv6h->nexthdr;
        __u16 off = sizeof (*ipv6h);
 
 ip6_tnl_err(struct sk_buff *skb, __u8 ipproto, struct inet6_skb_parm *opt,
            u8 *type, u8 *code, int *msg, __u32 *info, int offset)
 {
-       struct ipv6hdr *ipv6h = (struct ipv6hdr *) skb->data;
+       const struct ipv6hdr *ipv6h = (const struct ipv6hdr *) skb->data;
        struct ip6_tnl *t;
        int rel_msg = 0;
        u8 rel_type = ICMPV6_DEST_UNREACH;
        __u32 rel_info = ntohl(info);
        int err;
        struct sk_buff *skb2;
-       struct iphdr *eiph;
+       const struct iphdr *eiph;
        struct rtable *rt;
 
        err = ip6_tnl_err(skb, IPPROTO_IPIP, opt, &rel_type, &rel_code,
        return 0;
 }
 
-static void ip4ip6_dscp_ecn_decapsulate(struct ip6_tnl *t,
-                                       struct ipv6hdr *ipv6h,
+static void ip4ip6_dscp_ecn_decapsulate(const struct ip6_tnl *t,
+                                       const struct ipv6hdr *ipv6h,
                                        struct sk_buff *skb)
 {
        __u8 dsfield = ipv6_get_dsfield(ipv6h) & ~INET_ECN_MASK;
                IP_ECN_set_ce(ip_hdr(skb));
 }
 
-static void ip6ip6_dscp_ecn_decapsulate(struct ip6_tnl *t,
-                                       struct ipv6hdr *ipv6h,
+static void ip6ip6_dscp_ecn_decapsulate(const struct ip6_tnl *t,
+                                       const struct ipv6hdr *ipv6h,
                                        struct sk_buff *skb)
 {
        if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY)
 
 static int ip6_tnl_rcv(struct sk_buff *skb, __u16 protocol,
                       __u8 ipproto,
-                      void (*dscp_ecn_decapsulate)(struct ip6_tnl *t,
-                                                   struct ipv6hdr *ipv6h,
+                      void (*dscp_ecn_decapsulate)(const struct ip6_tnl *t,
+                                                   const struct ipv6hdr *ipv6h,
                                                    struct sk_buff *skb))
 {
        struct ip6_tnl *t;
-       struct ipv6hdr *ipv6h = ipv6_hdr(skb);
+       const struct ipv6hdr *ipv6h = ipv6_hdr(skb);
 
        rcu_read_lock();
 
  **/
 
 static inline int
-ip6_tnl_addr_conflict(struct ip6_tnl *t, struct ipv6hdr *hdr)
+ip6_tnl_addr_conflict(const struct ip6_tnl *t, const struct ipv6hdr *hdr)
 {
        return ipv6_addr_equal(&t->parms.raddr, &hdr->saddr);
 }
 ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct ip6_tnl *t = netdev_priv(dev);
-       struct iphdr  *iph = ip_hdr(skb);
+       const struct iphdr  *iph = ip_hdr(skb);
        int encap_limit = -1;
        struct flowi6 fl6;
        __u8 dsfield;
 
 }
 
 static struct mfc6_cache *ip6mr_cache_find(struct mr6_table *mrt,
-                                          struct in6_addr *origin,
-                                          struct in6_addr *mcastgrp)
+                                          const struct in6_addr *origin,
+                                          const struct in6_addr *mcastgrp)
 {
        int line = MFC6_HASH(mcastgrp, origin);
        struct mfc6_cache *c;
 
 {
        struct net *net = dev_net(skb->dev);
        __be32 spi;
-       struct ipv6hdr *iph = (struct ipv6hdr*)skb->data;
+       const struct ipv6hdr *iph = (const struct ipv6hdr *)skb->data;
        struct ip_comp_hdr *ipcomph =
                (struct ip_comp_hdr *)(skb->data + offset);
        struct xfrm_state *x;
                return;
 
        spi = htonl(ntohs(ipcomph->cpi));
-       x = xfrm_state_lookup(net, skb->mark, (xfrm_address_t *)&iph->daddr, spi, IPPROTO_COMP, AF_INET6);
+       x = xfrm_state_lookup(net, skb->mark, (const xfrm_address_t *)&iph->daddr,
+                             spi, IPPROTO_COMP, AF_INET6);
        if (!x)
                return;
 
 
 static void mld_ifc_timer_expire(unsigned long data);
 static void mld_ifc_event(struct inet6_dev *idev);
 static void mld_add_delrec(struct inet6_dev *idev, struct ifmcaddr6 *pmc);
-static void mld_del_delrec(struct inet6_dev *idev, struct in6_addr *addr);
+static void mld_del_delrec(struct inet6_dev *idev, const struct in6_addr *addr);
 static void mld_clear_delrec(struct inet6_dev *idev);
 static int sf_setstate(struct ifmcaddr6 *pmc);
 static void sf_markstate(struct ifmcaddr6 *pmc);
 static void ip6_mc_clear_src(struct ifmcaddr6 *pmc);
-static int ip6_mc_del_src(struct inet6_dev *idev, struct in6_addr *pmca,
-                         int sfmode, int sfcount, struct in6_addr *psfsrc,
+static int ip6_mc_del_src(struct inet6_dev *idev, const struct in6_addr *pmca,
+                         int sfmode, int sfcount, const struct in6_addr *psfsrc,
                          int delta);
-static int ip6_mc_add_src(struct inet6_dev *idev, struct in6_addr *pmca,
-                         int sfmode, int sfcount, struct in6_addr *psfsrc,
+static int ip6_mc_add_src(struct inet6_dev *idev, const struct in6_addr *pmca,
+                         int sfmode, int sfcount, const struct in6_addr *psfsrc,
                          int delta);
 static int ip6_mc_leave_src(struct sock *sk, struct ipv6_mc_socklist *iml,
                            struct inet6_dev *idev);
 
 /* called with rcu_read_lock() */
 static struct inet6_dev *ip6_mc_find_dev_rcu(struct net *net,
-                                            struct in6_addr *group,
+                                            const struct in6_addr *group,
                                             int ifindex)
 {
        struct net_device *dev = NULL;
 
 int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf)
 {
-       struct in6_addr *group;
+       const struct in6_addr *group;
        struct ipv6_mc_socklist *pmc;
        struct inet6_dev *idev;
        struct ipv6_pinfo *inet6 = inet6_sk(sk);
        struct group_filter __user *optval, int __user *optlen)
 {
        int err, i, count, copycount;
-       struct in6_addr *group;
+       const struct in6_addr *group;
        struct ipv6_mc_socklist *pmc;
        struct inet6_dev *idev;
        struct ipv6_pinfo *inet6 = inet6_sk(sk);
        spin_unlock_bh(&idev->mc_lock);
 }
 
-static void mld_del_delrec(struct inet6_dev *idev, struct in6_addr *pmca)
+static void mld_del_delrec(struct inet6_dev *idev, const struct in6_addr *pmca)
 {
        struct ifmcaddr6 *pmc, *pmc_prev;
        struct ip6_sf_list *psf, *psf_next;
 
 /* mark EXCLUDE-mode sources */
 static int mld_xmarksources(struct ifmcaddr6 *pmc, int nsrcs,
-       struct in6_addr *srcs)
+       const struct in6_addr *srcs)
 {
        struct ip6_sf_list *psf;
        int i, scount;
 }
 
 static int mld_marksources(struct ifmcaddr6 *pmc, int nsrcs,
-       struct in6_addr *srcs)
+       const struct in6_addr *srcs)
 {
        struct ip6_sf_list *psf;
        int i, scount;
 {
        struct mld2_query *mlh2 = NULL;
        struct ifmcaddr6 *ma;
-       struct in6_addr *group;
+       const struct in6_addr *group;
        unsigned long max_delay;
        struct inet6_dev *idev;
        struct mld_msg *mld;
 }
 
 static int ip6_mc_del1_src(struct ifmcaddr6 *pmc, int sfmode,
-       struct in6_addr *psfsrc)
+       const struct in6_addr *psfsrc)
 {
        struct ip6_sf_list *psf, *psf_prev;
        int rv = 0;
        return rv;
 }
 
-static int ip6_mc_del_src(struct inet6_dev *idev, struct in6_addr *pmca,
-                         int sfmode, int sfcount, struct in6_addr *psfsrc,
+static int ip6_mc_del_src(struct inet6_dev *idev, const struct in6_addr *pmca,
+                         int sfmode, int sfcount, const struct in6_addr *psfsrc,
                          int delta)
 {
        struct ifmcaddr6 *pmc;
  * Add multicast single-source filter to the interface list
  */
 static int ip6_mc_add1_src(struct ifmcaddr6 *pmc, int sfmode,
-       struct in6_addr *psfsrc, int delta)
+       const struct in6_addr *psfsrc, int delta)
 {
        struct ip6_sf_list *psf, *psf_prev;
 
 /*
  * Add multicast source filter list to the interface list
  */
-static int ip6_mc_add_src(struct inet6_dev *idev, struct in6_addr *pmca,
-                         int sfmode, int sfcount, struct in6_addr *psfsrc,
+static int ip6_mc_add_src(struct inet6_dev *idev, const struct in6_addr *pmca,
+                         int sfmode, int sfcount, const struct in6_addr *psfsrc,
                          int delta)
 {
        struct ifmcaddr6 *pmc;
 
 
 static int mip6_destopt_input(struct xfrm_state *x, struct sk_buff *skb)
 {
-       struct ipv6hdr *iph = ipv6_hdr(skb);
+       const struct ipv6hdr *iph = ipv6_hdr(skb);
        struct ipv6_destopt_hdr *destopt = (struct ipv6_destopt_hdr *)skb->data;
        int err = destopt->nexthdr;
 
 }
 
 static inline int mip6_report_rl_allow(struct timeval *stamp,
-                                      struct in6_addr *dst,
-                                      struct in6_addr *src, int iif)
+                                      const struct in6_addr *dst,
+                                      const struct in6_addr *src, int iif)
 {
        int allow = 0;
 
 
 static int mip6_rthdr_input(struct xfrm_state *x, struct sk_buff *skb)
 {
-       struct ipv6hdr *iph = ipv6_hdr(skb);
+       const struct ipv6hdr *iph = ipv6_hdr(skb);
        struct rt2_hdr *rt2 = (struct rt2_hdr *)skb->data;
        int err = rt2->rt_hdr.nexthdr;
 
 
        return lladdr + prepad;
 }
 
-int ndisc_mc_map(struct in6_addr *addr, char *buf, struct net_device *dev, int dir)
+int ndisc_mc_map(const struct in6_addr *addr, char *buf, struct net_device *dev, int dir)
 {
        switch (dev->type) {
        case ARPHRD_ETHER:
 static void ndisc_recv_ns(struct sk_buff *skb)
 {
        struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
-       struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
-       struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
+       const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
+       const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
        u8 *lladdr = NULL;
        u32 ndoptlen = skb->tail - (skb->transport_header +
                                    offsetof(struct nd_msg, opt));
 static void ndisc_recv_na(struct sk_buff *skb)
 {
        struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
-       struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
-       struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
+       const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
+       const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
        u8 *lladdr = NULL;
        u32 ndoptlen = skb->tail - (skb->transport_header +
                                    offsetof(struct nd_msg, opt));
        unsigned long ndoptlen = skb->len - sizeof(*rs_msg);
        struct neighbour *neigh;
        struct inet6_dev *idev;
-       struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
+       const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
        struct ndisc_options ndopts;
        u8 *lladdr = NULL;
 
 {
        struct inet6_dev *in6_dev;
        struct icmp6hdr *icmph;
-       struct in6_addr *dest;
-       struct in6_addr *target;        /* new first hop to destination */
+       const struct in6_addr *dest;
+       const struct in6_addr *target;  /* new first hop to destination */
        struct neighbour *neigh;
        int on_link = 0;
        struct ndisc_options ndopts;
        }
 
        icmph = icmp6_hdr(skb);
-       target = (struct in6_addr *) (icmph + 1);
+       target = (const struct in6_addr *) (icmph + 1);
        dest = target + 1;
 
        if (ipv6_addr_is_multicast(dest)) {
 
 int ip6_route_me_harder(struct sk_buff *skb)
 {
        struct net *net = dev_net(skb_dst(skb)->dev);
-       struct ipv6hdr *iph = ipv6_hdr(skb);
+       const struct ipv6hdr *iph = ipv6_hdr(skb);
        struct dst_entry *dst;
        struct flowi6 fl6 = {
                .flowi6_oif = skb->sk ? skb->sk->sk_bound_dev_if : 0,
        struct ip6_rt_info *rt_info = nf_queue_entry_reroute(entry);
 
        if (entry->hook == NF_INET_LOCAL_OUT) {
-               struct ipv6hdr *iph = ipv6_hdr(skb);
+               const struct ipv6hdr *iph = ipv6_hdr(skb);
 
                rt_info->daddr = iph->daddr;
                rt_info->saddr = iph->saddr;
        struct ip6_rt_info *rt_info = nf_queue_entry_reroute(entry);
 
        if (entry->hook == NF_INET_LOCAL_OUT) {
-               struct ipv6hdr *iph = ipv6_hdr(skb);
+               const struct ipv6hdr *iph = ipv6_hdr(skb);
                if (!ipv6_addr_equal(&iph->daddr, &rt_info->daddr) ||
                    !ipv6_addr_equal(&iph->saddr, &rt_info->saddr) ||
                    skb->mark != rt_info->mark)
 __sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook,
                             unsigned int dataoff, u_int8_t protocol)
 {
-       struct ipv6hdr *ip6h = ipv6_hdr(skb);
+       const struct ipv6hdr *ip6h = ipv6_hdr(skb);
        __sum16 csum = 0;
 
        switch (skb->ip_summed) {
                                       unsigned int dataoff, unsigned int len,
                                       u_int8_t protocol)
 {
-       struct ipv6hdr *ip6h = ipv6_hdr(skb);
+       const struct ipv6hdr *ip6h = ipv6_hdr(skb);
        __wsum hsum;
        __sum16 csum = 0;
 
 
 };
 
 static struct sock *__raw_v6_lookup(struct net *net, struct sock *sk,
-               unsigned short num, struct in6_addr *loc_addr,
-               struct in6_addr *rmt_addr, int dif)
+               unsigned short num, const struct in6_addr *loc_addr,
+               const struct in6_addr *rmt_addr, int dif)
 {
        struct hlist_node *node;
        int is_multicast = ipv6_addr_is_multicast(loc_addr);
  */
 static int ipv6_raw_deliver(struct sk_buff *skb, int nexthdr)
 {
-       struct in6_addr *saddr;
-       struct in6_addr *daddr;
+       const struct in6_addr *saddr;
+       const struct in6_addr *daddr;
        struct sock *sk;
        int delivered = 0;
        __u8 hash;
 {
        struct sock *sk;
        int hash;
-       struct in6_addr *saddr, *daddr;
+       const struct in6_addr *saddr, *daddr;
        struct net *net;
 
        hash = nexthdr & (RAW_HTABLE_SIZE - 1);
        sk = sk_head(&raw_v6_hashinfo.ht[hash]);
        if (sk != NULL) {
                /* Note: ipv6_hdr(skb) != skb->data */
-               struct ipv6hdr *ip6h = (struct ipv6hdr *)skb->data;
+               const struct ipv6hdr *ip6h = (const struct ipv6hdr *)skb->data;
                saddr = &ip6h->saddr;
                daddr = &ip6h->daddr;
                net = dev_net(skb->dev);
 static void raw6_sock_seq_show(struct seq_file *seq, struct sock *sp, int i)
 {
        struct ipv6_pinfo *np = inet6_sk(sp);
-       struct in6_addr *dest, *src;
+       const struct in6_addr *dest, *src;
        __u16 destp, srcp;
 
        dest  = &np->daddr;
 
 }
 
 static __inline__ struct frag_queue *
-fq_find(struct net *net, __be32 id, struct in6_addr *src, struct in6_addr *dst)
+fq_find(struct net *net, __be32 id, const struct in6_addr *src, const struct in6_addr *dst)
 {
        struct inet_frag_queue *q;
        struct ip6_create_arg arg;
 {
        struct frag_hdr *fhdr;
        struct frag_queue *fq;
-       struct ipv6hdr *hdr = ipv6_hdr(skb);
+       const struct ipv6hdr *hdr = ipv6_hdr(skb);
        struct net *net = dev_net(skb_dst(skb)->dev);
 
        IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_REASMREQDS);
 
 
 #ifdef CONFIG_IPV6_ROUTE_INFO
 static struct rt6_info *rt6_add_route_info(struct net *net,
-                                          struct in6_addr *prefix, int prefixlen,
-                                          struct in6_addr *gwaddr, int ifindex,
+                                          const struct in6_addr *prefix, int prefixlen,
+                                          const struct in6_addr *gwaddr, int ifindex,
                                           unsigned pref);
 static struct rt6_info *rt6_get_route_info(struct net *net,
-                                          struct in6_addr *prefix, int prefixlen,
-                                          struct in6_addr *gwaddr, int ifindex);
+                                          const struct in6_addr *prefix, int prefixlen,
+                                          const struct in6_addr *gwaddr, int ifindex);
 #endif
 
 static u32 *ipv6_cow_metrics(struct dst_entry *dst, unsigned long old)
                time_after(jiffies, rt->rt6i_expires);
 }
 
-static inline int rt6_need_strict(struct in6_addr *daddr)
+static inline int rt6_need_strict(const struct in6_addr *daddr)
 {
        return ipv6_addr_type(daddr) &
                (IPV6_ADDR_MULTICAST | IPV6_ADDR_LINKLOCAL | IPV6_ADDR_LOOPBACK);
 
 static inline struct rt6_info *rt6_device_match(struct net *net,
                                                    struct rt6_info *rt,
-                                                   struct in6_addr *saddr,
+                                                   const struct in6_addr *saddr,
                                                    int oif,
                                                    int flags)
 {
 
 #ifdef CONFIG_IPV6_ROUTE_INFO
 int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
-                 struct in6_addr *gwaddr)
+                 const struct in6_addr *gwaddr)
 {
        struct net *net = dev_net(dev);
        struct route_info *rinfo = (struct route_info *) opt;
        return __ip6_ins_rt(rt, &info);
 }
 
-static struct rt6_info *rt6_alloc_cow(struct rt6_info *ort, struct in6_addr *daddr,
-                                     struct in6_addr *saddr)
+static struct rt6_info *rt6_alloc_cow(struct rt6_info *ort, const struct in6_addr *daddr,
+                                     const struct in6_addr *saddr)
 {
        struct rt6_info *rt;
 
        return rt;
 }
 
-static struct rt6_info *rt6_alloc_clone(struct rt6_info *ort, struct in6_addr *daddr)
+static struct rt6_info *rt6_alloc_clone(struct rt6_info *ort, const struct in6_addr *daddr)
 {
        struct rt6_info *rt = ip6_rt_copy(ort);
        if (rt) {
 
 void ip6_route_input(struct sk_buff *skb)
 {
-       struct ipv6hdr *iph = ipv6_hdr(skb);
+       const struct ipv6hdr *iph = ipv6_hdr(skb);
        struct net *net = dev_net(skb->dev);
        int flags = RT6_LOOKUP_F_HAS_SADDR;
        struct flowi6 fl6 = {
        }
 
        if (cfg->fc_flags & RTF_GATEWAY) {
-               struct in6_addr *gw_addr;
+               const struct in6_addr *gw_addr;
                int gwa_type;
 
                gw_addr = &cfg->fc_gateway;
        return rt;
 };
 
-static struct rt6_info *ip6_route_redirect(struct in6_addr *dest,
-                                          struct in6_addr *src,
-                                          struct in6_addr *gateway,
+static struct rt6_info *ip6_route_redirect(const struct in6_addr *dest,
+                                          const struct in6_addr *src,
+                                          const struct in6_addr *gateway,
                                           struct net_device *dev)
 {
        int flags = RT6_LOOKUP_F_HAS_SADDR;
                                                   flags, __ip6_route_redirect);
 }
 
-void rt6_redirect(struct in6_addr *dest, struct in6_addr *src,
-                 struct in6_addr *saddr,
+void rt6_redirect(const struct in6_addr *dest, const struct in6_addr *src,
+                 const struct in6_addr *saddr,
                  struct neighbour *neigh, u8 *lladdr, int on_link)
 {
        struct rt6_info *rt, *nrt = NULL;
  *     i.e. Path MTU discovery
  */
 
-static void rt6_do_pmtu_disc(struct in6_addr *daddr, struct in6_addr *saddr,
+static void rt6_do_pmtu_disc(const struct in6_addr *daddr, const struct in6_addr *saddr,
                             struct net *net, u32 pmtu, int ifindex)
 {
        struct rt6_info *rt, *nrt;
        dst_release(&rt->dst);
 }
 
-void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr,
+void rt6_pmtu_discovery(const struct in6_addr *daddr, const struct in6_addr *saddr,
                        struct net_device *dev, u32 pmtu)
 {
        struct net *net = dev_net(dev);
 
 #ifdef CONFIG_IPV6_ROUTE_INFO
 static struct rt6_info *rt6_get_route_info(struct net *net,
-                                          struct in6_addr *prefix, int prefixlen,
-                                          struct in6_addr *gwaddr, int ifindex)
+                                          const struct in6_addr *prefix, int prefixlen,
+                                          const struct in6_addr *gwaddr, int ifindex)
 {
        struct fib6_node *fn;
        struct rt6_info *rt = NULL;
 }
 
 static struct rt6_info *rt6_add_route_info(struct net *net,
-                                          struct in6_addr *prefix, int prefixlen,
-                                          struct in6_addr *gwaddr, int ifindex,
+                                          const struct in6_addr *prefix, int prefixlen,
+                                          const struct in6_addr *gwaddr, int ifindex,
                                           unsigned pref)
 {
        struct fib6_config cfg = {
 }
 #endif
 
-struct rt6_info *rt6_get_dflt_router(struct in6_addr *addr, struct net_device *dev)
+struct rt6_info *rt6_get_dflt_router(const struct in6_addr *addr, struct net_device *dev)
 {
        struct rt6_info *rt;
        struct fib6_table *table;
        return rt;
 }
 
-struct rt6_info *rt6_add_dflt_router(struct in6_addr *gwaddr,
+struct rt6_info *rt6_add_dflt_router(const struct in6_addr *gwaddr,
                                     struct net_device *dev,
                                     unsigned int pref)
 {
 
 int ip6_route_get_saddr(struct net *net,
                        struct rt6_info *rt,
-                       struct in6_addr *daddr,
+                       const struct in6_addr *daddr,
                        unsigned int prefs,
                        struct in6_addr *saddr)
 {
 
 }
 
 static int
-isatap_chksrc(struct sk_buff *skb, struct iphdr *iph, struct ip_tunnel *t)
+isatap_chksrc(struct sk_buff *skb, const struct iphdr *iph, struct ip_tunnel *t)
 {
        struct ip_tunnel_prl_entry *p;
        int ok = 1;
                else
                        skb->ndisc_nodetype = NDISC_NODETYPE_NODEFAULT;
        } else {
-               struct in6_addr *addr6 = &ipv6_hdr(skb)->saddr;
+               const struct in6_addr *addr6 = &ipv6_hdr(skb)->saddr;
+
                if (ipv6_addr_is_isatap(addr6) &&
                    (addr6->s6_addr32[3] == iph->saddr) &&
                    ipv6_chk_prefix(addr6, t->dev))
    8 bytes of packet payload. It means, that precise relaying of
    ICMP in the real Internet is absolutely infeasible.
  */
-       struct iphdr *iph = (struct iphdr*)skb->data;
+       const struct iphdr *iph = (const struct iphdr *)skb->data;
        const int type = icmp_hdr(skb)->type;
        const int code = icmp_hdr(skb)->code;
        struct ip_tunnel *t;
        return err;
 }
 
-static inline void ipip6_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb)
+static inline void ipip6_ecn_decapsulate(const struct iphdr *iph, struct sk_buff *skb)
 {
        if (INET_ECN_is_ce(iph->tos))
                IP6_ECN_set_ce(ipv6_hdr(skb));
 
 static int ipip6_rcv(struct sk_buff *skb)
 {
-       struct iphdr *iph;
+       const struct iphdr *iph;
        struct ip_tunnel *tunnel;
 
        if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
  * comes from 6rd / 6to4 (RFC 3056) addr space.
  */
 static inline
-__be32 try_6rd(struct in6_addr *v6dst, struct ip_tunnel *tunnel)
+__be32 try_6rd(const struct in6_addr *v6dst, struct ip_tunnel *tunnel)
 {
        __be32 dst = 0;
 
 {
        struct ip_tunnel *tunnel = netdev_priv(dev);
        struct pcpu_tstats *tstats;
-       struct iphdr  *tiph = &tunnel->parms.iph;
-       struct ipv6hdr *iph6 = ipv6_hdr(skb);
+       const struct iphdr  *tiph = &tunnel->parms.iph;
+       const struct ipv6hdr *iph6 = ipv6_hdr(skb);
        u8     tos = tunnel->parms.iph.tos;
        __be16 df = tiph->frag_off;
        struct rtable *rt;                      /* Route to the other host */
        unsigned int max_headroom;              /* The extra header space needed */
        __be32 dst = tiph->daddr;
        int    mtu;
-       struct in6_addr *addr6;
+       const struct in6_addr *addr6;
        int addr_type;
 
        if (skb->protocol != htons(ETH_P_IPV6))
                        goto tx_error;
                }
 
-               addr6 = (struct in6_addr*)&neigh->primary_key;
+               addr6 = (const struct in6_addr*)&neigh->primary_key;
                addr_type = ipv6_addr_type(addr6);
 
                if ((addr_type & IPV6_ADDR_UNICAST) &&
                        goto tx_error;
                }
 
-               addr6 = (struct in6_addr*)&neigh->primary_key;
+               addr6 = (const struct in6_addr*)&neigh->primary_key;
                addr_type = ipv6_addr_type(addr6);
 
                if (addr_type == IPV6_ADDR_ANY) {
 {
        struct net_device *tdev = NULL;
        struct ip_tunnel *tunnel;
-       struct iphdr *iph;
+       const struct iphdr *iph;
 
        tunnel = netdev_priv(dev);
        iph = &tunnel->parms.iph;
 
 static DEFINE_PER_CPU(__u32 [16 + 5 + SHA_WORKSPACE_WORDS],
                      ipv6_cookie_scratch);
 
-static u32 cookie_hash(struct in6_addr *saddr, struct in6_addr *daddr,
+static u32 cookie_hash(const struct in6_addr *saddr, const struct in6_addr *daddr,
                       __be16 sport, __be16 dport, u32 count, int c)
 {
        __u32 *tmp = __get_cpu_var(ipv6_cookie_scratch);
        return tmp[17];
 }
 
-static __u32 secure_tcp_syn_cookie(struct in6_addr *saddr, struct in6_addr *daddr,
+static __u32 secure_tcp_syn_cookie(const struct in6_addr *saddr,
+                                  const struct in6_addr *daddr,
                                   __be16 sport, __be16 dport, __u32 sseq,
                                   __u32 count, __u32 data)
 {
                & COOKIEMASK));
 }
 
-static __u32 check_tcp_syn_cookie(__u32 cookie, struct in6_addr *saddr,
-                                 struct in6_addr *daddr, __be16 sport,
+static __u32 check_tcp_syn_cookie(__u32 cookie, const struct in6_addr *saddr,
+                                 const struct in6_addr *daddr, __be16 sport,
                                  __be16 dport, __u32 sseq, __u32 count,
                                  __u32 maxdiff)
 {
 
 __u32 cookie_v6_init_sequence(struct sock *sk, struct sk_buff *skb, __u16 *mssp)
 {
-       struct ipv6hdr *iph = ipv6_hdr(skb);
+       const struct ipv6hdr *iph = ipv6_hdr(skb);
        const struct tcphdr *th = tcp_hdr(skb);
        int mssind;
        const __u16 mss = *mssp;
 
 static inline int cookie_check(struct sk_buff *skb, __u32 cookie)
 {
-       struct ipv6hdr *iph = ipv6_hdr(skb);
+       const struct ipv6hdr *iph = ipv6_hdr(skb);
        const struct tcphdr *th = tcp_hdr(skb);
        __u32 seq = ntohl(th->seq) - 1;
        __u32 mssind = check_tcp_syn_cookie(cookie, &iph->saddr, &iph->daddr,
 
 
 static int     tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb);
 static void    __tcp_v6_send_check(struct sk_buff *skb,
-                                   struct in6_addr *saddr,
-                                   struct in6_addr *daddr);
+                                   const struct in6_addr *saddr,
+                                   const struct in6_addr *daddr);
 
 static const struct inet_connection_sock_af_ops ipv6_mapped;
 static const struct inet_connection_sock_af_ops ipv6_specific;
 static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific;
 #else
 static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
-                                                  struct in6_addr *addr)
+                                                  const struct in6_addr *addr)
 {
        return NULL;
 }
 }
 
 static __inline__ __sum16 tcp_v6_check(int len,
-                                  struct in6_addr *saddr,
-                                  struct in6_addr *daddr,
+                                  const struct in6_addr *saddr,
+                                  const struct in6_addr *daddr,
                                   __wsum base)
 {
        return csum_ipv6_magic(saddr, daddr, len, IPPROTO_TCP, base);
 static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
                u8 type, u8 code, int offset, __be32 info)
 {
-       struct ipv6hdr *hdr = (struct ipv6hdr*)skb->data;
+       const struct ipv6hdr *hdr = (const struct ipv6hdr*)skb->data;
        const struct tcphdr *th = (struct tcphdr *)(skb->data+offset);
        struct ipv6_pinfo *np;
        struct sock *sk;
 
 #ifdef CONFIG_TCP_MD5SIG
 static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
-                                                  struct in6_addr *addr)
+                                                  const struct in6_addr *addr)
 {
        struct tcp_sock *tp = tcp_sk(sk);
        int i;
        return tcp_v6_md5_do_lookup(sk, &inet6_rsk(req)->rmt_addr);
 }
 
-static int tcp_v6_md5_do_add(struct sock *sk, struct in6_addr *peer,
+static int tcp_v6_md5_do_add(struct sock *sk, const struct in6_addr *peer,
                             char *newkey, u8 newkeylen)
 {
        /* Add key to the list */
                                 newkey, newkeylen);
 }
 
-static int tcp_v6_md5_do_del(struct sock *sk, struct in6_addr *peer)
+static int tcp_v6_md5_do_del(struct sock *sk, const struct in6_addr *peer)
 {
        struct tcp_sock *tp = tcp_sk(sk);
        int i;
 }
 
 static int tcp_v6_md5_hash_pseudoheader(struct tcp_md5sig_pool *hp,
-                                       struct in6_addr *daddr,
-                                       struct in6_addr *saddr, int nbytes)
+                                       const struct in6_addr *daddr,
+                                       const struct in6_addr *saddr, int nbytes)
 {
        struct tcp6_pseudohdr *bp;
        struct scatterlist sg;
 }
 
 static int tcp_v6_md5_hash_hdr(char *md5_hash, struct tcp_md5sig_key *key,
-                              struct in6_addr *daddr, struct in6_addr *saddr,
+                              const struct in6_addr *daddr, struct in6_addr *saddr,
                               struct tcphdr *th)
 {
        struct tcp_md5sig_pool *hp;
                               struct sock *sk, struct request_sock *req,
                               struct sk_buff *skb)
 {
-       struct in6_addr *saddr, *daddr;
+       const struct in6_addr *saddr, *daddr;
        struct tcp_md5sig_pool *hp;
        struct hash_desc *desc;
        struct tcphdr *th = tcp_hdr(skb);
                saddr = &inet6_rsk(req)->loc_addr;
                daddr = &inet6_rsk(req)->rmt_addr;
        } else {
-               struct ipv6hdr *ip6h = ipv6_hdr(skb);
+               const struct ipv6hdr *ip6h = ipv6_hdr(skb);
                saddr = &ip6h->saddr;
                daddr = &ip6h->daddr;
        }
 {
        __u8 *hash_location = NULL;
        struct tcp_md5sig_key *hash_expected;
-       struct ipv6hdr *ip6h = ipv6_hdr(skb);
+       const struct ipv6hdr *ip6h = ipv6_hdr(skb);
        struct tcphdr *th = tcp_hdr(skb);
        int genhash;
        u8 newhash[16];
 #endif
 
 static void __tcp_v6_send_check(struct sk_buff *skb,
-                               struct in6_addr *saddr, struct in6_addr *daddr)
+                               const struct in6_addr *saddr, const struct in6_addr *daddr)
 {
        struct tcphdr *th = tcp_hdr(skb);
 
 
 static int tcp_v6_gso_send_check(struct sk_buff *skb)
 {
-       struct ipv6hdr *ipv6h;
+       const struct ipv6hdr *ipv6h;
        struct tcphdr *th;
 
        if (!pskb_may_pull(skb, sizeof(*th)))
 static struct sk_buff **tcp6_gro_receive(struct sk_buff **head,
                                         struct sk_buff *skb)
 {
-       struct ipv6hdr *iph = skb_gro_network_header(skb);
+       const struct ipv6hdr *iph = skb_gro_network_header(skb);
 
        switch (skb->ip_summed) {
        case CHECKSUM_COMPLETE:
 
 static int tcp6_gro_complete(struct sk_buff *skb)
 {
-       struct ipv6hdr *iph = ipv6_hdr(skb);
+       const struct ipv6hdr *iph = ipv6_hdr(skb);
        struct tcphdr *th = tcp_hdr(skb);
 
        th->check = ~tcp_v6_check(skb->len - skb_transport_offset(skb),
 static int tcp_v6_rcv(struct sk_buff *skb)
 {
        struct tcphdr *th;
-       struct ipv6hdr *hdr;
+       const struct ipv6hdr *hdr;
        struct sock *sk;
        int ret;
        struct net *net = dev_net(skb->dev);
                         struct sock *sk, struct request_sock *req, int i, int uid)
 {
        int ttd = req->expires - jiffies;
-       struct in6_addr *src = &inet6_rsk(req)->loc_addr;
-       struct in6_addr *dest = &inet6_rsk(req)->rmt_addr;
+       const struct in6_addr *src = &inet6_rsk(req)->loc_addr;
+       const struct in6_addr *dest = &inet6_rsk(req)->rmt_addr;
 
        if (ttd < 0)
                ttd = 0;
 
 static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
 {
-       struct in6_addr *dest, *src;
+       const struct in6_addr *dest, *src;
        __u16 destp, srcp;
        int timer_active;
        unsigned long timer_expires;
 static void get_timewait6_sock(struct seq_file *seq,
                               struct inet_timewait_sock *tw, int i)
 {
-       struct in6_addr *dest, *src;
+       const struct in6_addr *dest, *src;
        __u16 destp, srcp;
        struct inet6_timewait_sock *tw6 = inet6_twsk((struct sock *)tw);
        int ttd = tw->tw_ttd - jiffies;
 
                                          struct udp_table *udptable)
 {
        struct sock *sk;
-       struct ipv6hdr *iph = ipv6_hdr(skb);
+       const struct ipv6hdr *iph = ipv6_hdr(skb);
 
        if (unlikely(sk = skb_steal_sock(skb)))
                return sk;
                    struct udp_table *udptable)
 {
        struct ipv6_pinfo *np;
-       struct ipv6hdr *hdr = (struct ipv6hdr*)skb->data;
-       struct in6_addr *saddr = &hdr->saddr;
-       struct in6_addr *daddr = &hdr->daddr;
+       const struct ipv6hdr *hdr = (const struct ipv6hdr *)skb->data;
+       const struct in6_addr *saddr = &hdr->saddr;
+       const struct in6_addr *daddr = &hdr->daddr;
        struct udphdr *uh = (struct udphdr*)(skb->data+offset);
        struct sock *sk;
        int err;
 }
 
 static struct sock *udp_v6_mcast_next(struct net *net, struct sock *sk,
-                                     __be16 loc_port, struct in6_addr *loc_addr,
-                                     __be16 rmt_port, struct in6_addr *rmt_addr,
+                                     __be16 loc_port, const struct in6_addr *loc_addr,
+                                     __be16 rmt_port, const struct in6_addr *rmt_addr,
                                      int dif)
 {
        struct hlist_nulls_node *node;
  * so we don't need to lock the hashes.
  */
 static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
-               struct in6_addr *saddr, struct in6_addr *daddr,
+               const struct in6_addr *saddr, const struct in6_addr *daddr,
                struct udp_table *udptable)
 {
        struct sock *sk, *stack[256 / sizeof(struct sock *)];
        struct net *net = dev_net(skb->dev);
        struct sock *sk;
        struct udphdr *uh;
-       struct in6_addr *saddr, *daddr;
+       const struct in6_addr *saddr, *daddr;
        u32 ulen = 0;
 
        if (!pskb_may_pull(skb, sizeof(struct udphdr)))
 
 static int udp6_ufo_send_check(struct sk_buff *skb)
 {
-       struct ipv6hdr *ipv6h;
+       const struct ipv6hdr *ipv6h;
        struct udphdr *uh;
 
        if (!pskb_may_pull(skb, sizeof(*uh)))
 {
        struct inet_sock *inet = inet_sk(sp);
        struct ipv6_pinfo *np = inet6_sk(sp);
-       struct in6_addr *dest, *src;
+       const struct in6_addr *dest, *src;
        __u16 destp, srcp;
 
        dest  = &np->daddr;
 
 {
        struct ipv6hdr *top_iph;
        struct ip_beet_phdr *ph;
-       struct iphdr *iphv4;
        int optlen, hdr_len;
 
-       iphv4 = ip_hdr(skb);
        hdr_len = 0;
        optlen = XFRM_MODE_SKB_CB(skb)->optlen;
        if (unlikely(optlen))
 
 
 static inline void ipip6_ecn_decapsulate(struct sk_buff *skb)
 {
-       struct ipv6hdr *outer_iph = ipv6_hdr(skb);
+       const struct ipv6hdr *outer_iph = ipv6_hdr(skb);
        struct ipv6hdr *inner_iph = ipipv6_hdr(skb);
 
        if (INET_ECN_is_ce(ipv6_get_dsfield(outer_iph)))
                dsfield &= ~INET_ECN_MASK;
        ipv6_change_dsfield(top_iph, 0, dsfield);
        top_iph->hop_limit = ip6_dst_hoplimit(dst->child);
-       ipv6_addr_copy(&top_iph->saddr, (struct in6_addr *)&x->props.saddr);
-       ipv6_addr_copy(&top_iph->daddr, (struct in6_addr *)&x->id.daddr);
+       ipv6_addr_copy(&top_iph->saddr, (const struct in6_addr *)&x->props.saddr);
+       ipv6_addr_copy(&top_iph->daddr, (const struct in6_addr *)&x->id.daddr);
        return 0;
 }
 
 
        struct flowi6 *fl6 = &fl->u.ip6;
        int onlyproto = 0;
        u16 offset = skb_network_header_len(skb);
-       struct ipv6hdr *hdr = ipv6_hdr(skb);
+       const struct ipv6hdr *hdr = ipv6_hdr(skb);
        struct ipv6_opt_hdr *exthdr;
        const unsigned char *nh = skb_network_header(skb);
        u8 nexthdr = nh[IP6CB(skb)->nhoff];
 
 
 static struct kmem_cache *xfrm6_tunnel_spi_kmem __read_mostly;
 
-static inline unsigned xfrm6_tunnel_spi_hash_byaddr(xfrm_address_t *addr)
+static inline unsigned xfrm6_tunnel_spi_hash_byaddr(const xfrm_address_t *addr)
 {
        unsigned h;
 
        return spi % XFRM6_TUNNEL_SPI_BYSPI_HSIZE;
 }
 
-static struct xfrm6_tunnel_spi *__xfrm6_tunnel_spi_lookup(struct net *net, xfrm_address_t *saddr)
+static struct xfrm6_tunnel_spi *__xfrm6_tunnel_spi_lookup(struct net *net, const xfrm_address_t *saddr)
 {
        struct xfrm6_tunnel_net *xfrm6_tn = xfrm6_tunnel_pernet(net);
        struct xfrm6_tunnel_spi *x6spi;
        return NULL;
 }
 
-__be32 xfrm6_tunnel_spi_lookup(struct net *net, xfrm_address_t *saddr)
+__be32 xfrm6_tunnel_spi_lookup(struct net *net, const xfrm_address_t *saddr)
 {
        struct xfrm6_tunnel_spi *x6spi;
        u32 spi;
 static int xfrm6_tunnel_rcv(struct sk_buff *skb)
 {
        struct net *net = dev_net(skb->dev);
-       struct ipv6hdr *iph = ipv6_hdr(skb);
+       const struct ipv6hdr *iph = ipv6_hdr(skb);
        __be32 spi;
 
-       spi = xfrm6_tunnel_spi_lookup(net, (xfrm_address_t *)&iph->saddr);
+       spi = xfrm6_tunnel_spi_lookup(net, (const xfrm_address_t *)&iph->saddr);
        return xfrm6_rcv_spi(skb, IPPROTO_IPV6, spi) > 0 ? : 0;
 }
 
 
                sin6->sin6_family = AF_INET6;
                sin6->sin6_port = port;
                sin6->sin6_flowinfo = 0;
-               ipv6_addr_copy(&sin6->sin6_addr, (struct in6_addr *)xaddr->a6);
+               ipv6_addr_copy(&sin6->sin6_addr, (const struct in6_addr *)xaddr->a6);
                sin6->sin6_scope_id = 0;
                return 128;
            }
 
        }
        case htons(ETH_P_IPV6):
        {
-               struct ipv6hdr *iph;
+               const struct ipv6hdr *iph;
                int poff;
 
                if (!pskb_network_may_pull(skb, sizeof(*iph)))
 
  */
 void sctp_v4_err(struct sk_buff *skb, __u32 info)
 {
-       struct iphdr *iph = (struct iphdr *)skb->data;
+       const struct iphdr *iph = (const struct iphdr *)skb->data;
        const int ihlen = iph->ihl * 4;
        const int type = icmp_hdr(skb)->type;
        const int code = icmp_hdr(skb)->code;
 
 static int sctp_v6_available(union sctp_addr *addr, struct sctp_sock *sp)
 {
        int type;
-       struct in6_addr *in6 = (struct in6_addr *)&addr->v6.sin6_addr;
+       const struct in6_addr *in6 = (const struct in6_addr *)&addr->v6.sin6_addr;
 
        type = ipv6_addr_type(in6);
        if (IPV6_ADDR_ANY == type)
 
 
                case AF_INET6:
                        ipv6_addr_copy((struct in6_addr *)x->sel.daddr.a6,
-                                      (struct in6_addr *)daddr);
+                                      (const struct in6_addr *)daddr);
                        ipv6_addr_copy((struct in6_addr *)x->sel.saddr.a6,
-                                      (struct in6_addr *)saddr);
+                                      (const struct in6_addr *)saddr);
                        x->sel.prefixlen_d = 128;
                        x->sel.prefixlen_s = 128;
                        ipv6_addr_copy((struct in6_addr *)x->props.saddr.a6,
-                                      (struct in6_addr *)saddr);
+                                      (const struct in6_addr *)saddr);
                        ipv6_addr_copy((struct in6_addr *)x->id.daddr.a6,
-                                      (struct in6_addr *)daddr);
+                                      (const struct in6_addr *)daddr);
                        break;
                }
 
 static void xfrm_audit_helper_pktinfo(struct sk_buff *skb, u16 family,
                                      struct audit_buffer *audit_buf)
 {
-       struct iphdr *iph4;
-       struct ipv6hdr *iph6;
+       const struct iphdr *iph4;
+       const struct ipv6hdr *iph6;
 
        switch (family) {
        case AF_INET: