Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux...
[platform/adaptation/renesas_rcar/renesas_kernel.git] / net / ipv6 / sit.c
index 43b3337..1cca576 100644 (file)
@@ -250,11 +250,6 @@ static struct ip_tunnel *ipip6_tunnel_locate(struct net *net,
 
        dev_net_set(dev, net);
 
-       if (strchr(name, '%')) {
-               if (dev_alloc_name(dev, name) < 0)
-                       goto failed_free;
-       }
-
        nt = netdev_priv(dev);
 
        nt->parms = *parms;
@@ -401,11 +396,6 @@ out:
        return err;
 }
 
-static void prl_entry_destroy_rcu(struct rcu_head *head)
-{
-       kfree(container_of(head, struct ip_tunnel_prl_entry, rcu_head));
-}
-
 static void prl_list_destroy_rcu(struct rcu_head *head)
 {
        struct ip_tunnel_prl_entry *p, *n;
@@ -433,7 +423,7 @@ ipip6_tunnel_del_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a)
                     p = &x->next) {
                        if (x->addr == a->addr) {
                                *p = x->next;
-                               call_rcu(&x->rcu_head, prl_entry_destroy_rcu);
+                               kfree_rcu(x, rcu_head);
                                t->prl_count--;
                                goto out;
                        }
@@ -452,7 +442,7 @@ out:
 }
 
 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;
@@ -465,7 +455,8 @@ isatap_chksrc(struct sk_buff *skb, struct iphdr *iph, struct ip_tunnel *t)
                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))
@@ -499,7 +490,7 @@ static int ipip6_err(struct sk_buff *skb, u32 info)
    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;
@@ -557,7 +548,7 @@ out:
        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));
@@ -565,7 +556,7 @@ static inline void ipip6_ecn_decapsulate(struct iphdr *iph, struct sk_buff *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)))
@@ -621,7 +612,7 @@ out:
  * 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;
 
@@ -664,8 +655,8 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
 {
        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 */
@@ -673,8 +664,9 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
        struct iphdr  *iph;                     /* Our new IP header */
        unsigned int max_headroom;              /* The extra header space needed */
        __be32 dst = tiph->daddr;
+       struct flowi4 fl4;
        int    mtu;
-       struct in6_addr *addr6;
+       const struct in6_addr *addr6;
        int addr_type;
 
        if (skb->protocol != htons(ETH_P_IPV6))
@@ -693,7 +685,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
                        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) &&
@@ -718,7 +710,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
                        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) {
@@ -732,7 +724,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
                dst = addr6->s6_addr32[3];
        }
 
-       rt = ip_route_output_ports(dev_net(dev), NULL,
+       rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,
                                   dst, tiph->saddr,
                                   0, 0,
                                   IPPROTO_IPV6, RT_TOS(tos),
@@ -826,8 +818,8 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
        iph->frag_off           =       df;
        iph->protocol           =       IPPROTO_IPV6;
        iph->tos                =       INET_ECN_encapsulate(tos, ipv6_get_dsfield(iph6));
-       iph->daddr              =       rt->rt_dst;
-       iph->saddr              =       rt->rt_src;
+       iph->daddr              =       fl4.daddr;
+       iph->saddr              =       fl4.saddr;
 
        if ((iph->ttl = tiph->ttl) == 0)
                iph->ttl        =       iph6->hop_limit;
@@ -849,13 +841,14 @@ static void ipip6_tunnel_bind_dev(struct net_device *dev)
 {
        struct net_device *tdev = NULL;
        struct ip_tunnel *tunnel;
-       struct iphdr *iph;
+       const struct iphdr *iph;
+       struct flowi4 fl4;
 
        tunnel = netdev_priv(dev);
        iph = &tunnel->parms.iph;
 
        if (iph->daddr) {
-               struct rtable *rt = ip_route_output_ports(dev_net(dev), NULL,
+               struct rtable *rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,
                                                          iph->daddr, iph->saddr,
                                                          0, 0,
                                                          IPPROTO_IPV6,