linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / net / ipv6 / ip6_output.c
index e460489..5bf70b1 100644 (file)
@@ -161,7 +161,7 @@ int ip6_output(struct sk_buff *skb)
 int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
             struct ipv6_txoptions *opt, int ipfragok)
 {
-       struct ipv6_pinfo *np = inet6_sk(sk);
+       struct ipv6_pinfo *np = sk ? inet6_sk(sk) : NULL;
        struct in6_addr *first_hop = &fl->fl6_dst;
        struct dst_entry *dst = skb->dst;
        struct ipv6hdr *hdr;
@@ -733,29 +733,28 @@ int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl)
                if (*dst) {
                        struct rt6_info *rt = (struct rt6_info*)*dst;
        
-                       /* Yes, checking route validity in not connected
-                        * case is not very simple. Take into account,
-                        * that we do not support routing by source, TOS,
-                        * and MSG_DONTROUTE            --ANK (980726)
-                        *
-                        * 1. If route was host route, check that
-                        *    cached destination is current.
-                        *    If it is network route, we still may
-                        *    check its validity using saved pointer
-                        *    to the last used address: daddr_cache.
-                        *    We do not want to save whole address now,
-                        *    (because main consumer of this service
-                        *    is tcp, which has not this problem),
-                        *    so that the last trick works only on connected
-                        *    sockets.
-                        * 2. oif also should be the same.
-                        */
+                               /* Yes, checking route validity in not connected
+                                  case is not very simple. Take into account,
+                                  that we do not support routing by source, TOS,
+                                  and MSG_DONTROUTE            --ANK (980726)
+       
+                                  1. If route was host route, check that
+                                     cached destination is current.
+                                     If it is network route, we still may
+                                     check its validity using saved pointer
+                                     to the last used address: daddr_cache.
+                                     We do not want to save whole address now,
+                                     (because main consumer of this service
+                                      is tcp, which has not this problem),
+                                     so that the last trick works only on connected
+                                     sockets.
+                                  2. oif also should be the same.
+                                */
+       
                        if (((rt->rt6i_dst.plen != 128 ||
-                             !ipv6_addr_equal(&fl->fl6_dst,
-                                              &rt->rt6i_dst.addr))
+                             !ipv6_addr_equal(&fl->fl6_dst, &rt->rt6i_dst.addr))
                             && (np->daddr_cache == NULL ||
-                                !ipv6_addr_equal(&fl->fl6_dst,
-                                                 np->daddr_cache)))
+                                !ipv6_addr_equal(&fl->fl6_dst, np->daddr_cache)))
                            || (fl->oif && fl->oif != (*dst)->dev->ifindex)) {
                                dst_release(*dst);
                                *dst = NULL;
@@ -890,7 +889,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
                np->cork.hop_limit = hlimit;
                np->cork.tclass = tclass;
                mtu = dst_mtu(rt->u.dst.path);
-               if (np->frag_size < mtu) {
+               if (np && np->frag_size < mtu) {
                        if (np->frag_size)
                                mtu = np->frag_size;
                }