|
@@ -805,15 +805,6 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
|
|
fl.fl6_flowlabel = np->flow_label;
|
|
fl.fl6_flowlabel = np->flow_label;
|
|
}
|
|
}
|
|
|
|
|
|
- if (ipv6_addr_any(daddr)) {
|
|
|
|
- /*
|
|
|
|
- * unspecified destination address
|
|
|
|
- * treated as error... is this correct ?
|
|
|
|
- */
|
|
|
|
- fl6_sock_release(flowlabel);
|
|
|
|
- return(-EINVAL);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
if (fl.oif == 0)
|
|
if (fl.oif == 0)
|
|
fl.oif = sk->sk_bound_dev_if;
|
|
fl.oif = sk->sk_bound_dev_if;
|
|
|
|
|
|
@@ -846,7 +837,10 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
- ipv6_addr_copy(&fl.fl6_dst, daddr);
|
|
|
|
|
|
+ if (!ipv6_addr_any(daddr))
|
|
|
|
+ ipv6_addr_copy(&fl.fl6_dst, daddr);
|
|
|
|
+ else
|
|
|
|
+ fl.fl6_dst.s6_addr[15] = 0x1; /* :: means loopback (BSD'ism) */
|
|
if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr))
|
|
if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr))
|
|
ipv6_addr_copy(&fl.fl6_src, &np->saddr);
|
|
ipv6_addr_copy(&fl.fl6_src, &np->saddr);
|
|
|
|
|