|
|
|
@ -1034,10 +1034,13 @@ source_ok: |
|
|
|
|
if (!fld.daddr) { |
|
|
|
|
fld.daddr = fld.saddr; |
|
|
|
|
|
|
|
|
|
err = -EADDRNOTAVAIL; |
|
|
|
|
if (dev_out) |
|
|
|
|
dev_put(dev_out); |
|
|
|
|
err = -EINVAL; |
|
|
|
|
dev_out = init_net.loopback_dev; |
|
|
|
|
if (!dev_out->dn_ptr) |
|
|
|
|
goto out; |
|
|
|
|
err = -EADDRNOTAVAIL; |
|
|
|
|
dev_hold(dev_out); |
|
|
|
|
if (!fld.daddr) { |
|
|
|
|
fld.daddr = |
|
|
|
@ -1110,6 +1113,8 @@ source_ok: |
|
|
|
|
if (dev_out == NULL) |
|
|
|
|
goto out; |
|
|
|
|
dn_db = rcu_dereference_raw(dev_out->dn_ptr); |
|
|
|
|
if (!dn_db) |
|
|
|
|
goto e_inval; |
|
|
|
|
/* Possible improvement - check all devices for local addr */ |
|
|
|
|
if (dn_dev_islocal(dev_out, fld.daddr)) { |
|
|
|
|
dev_put(dev_out); |
|
|
|
@ -1151,6 +1156,8 @@ select_source: |
|
|
|
|
dev_put(dev_out); |
|
|
|
|
dev_out = init_net.loopback_dev; |
|
|
|
|
dev_hold(dev_out); |
|
|
|
|
if (!dev_out->dn_ptr) |
|
|
|
|
goto e_inval; |
|
|
|
|
fld.flowidn_oif = dev_out->ifindex; |
|
|
|
|
if (res.fi) |
|
|
|
|
dn_fib_info_put(res.fi); |
|
|
|
|