| .. | .. |
|---|
| 22 | 22 | #include <linux/proc_fs.h> |
|---|
| 23 | 23 | #include <net/ping.h> |
|---|
| 24 | 24 | |
|---|
| 25 | | -static void ping_v6_destroy(struct sock *sk) |
|---|
| 26 | | -{ |
|---|
| 27 | | - inet6_destroy_sock(sk); |
|---|
| 28 | | -} |
|---|
| 29 | | - |
|---|
| 30 | 25 | /* Compatibility glue so we can support IPv6 when it's compiled as a module */ |
|---|
| 31 | 26 | static int dummy_ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, |
|---|
| 32 | 27 | int *addr_len) |
|---|
| .. | .. |
|---|
| 101 | 96 | addr_type = ipv6_addr_type(daddr); |
|---|
| 102 | 97 | if ((__ipv6_addr_needs_scope_id(addr_type) && !oif) || |
|---|
| 103 | 98 | (addr_type & IPV6_ADDR_MAPPED) || |
|---|
| 104 | | - (oif && sk->sk_bound_dev_if && oif != sk->sk_bound_dev_if)) |
|---|
| 99 | + (oif && sk->sk_bound_dev_if && oif != sk->sk_bound_dev_if && |
|---|
| 100 | + l3mdev_master_ifindex_by_index(sock_net(sk), oif) != sk->sk_bound_dev_if)) |
|---|
| 105 | 101 | return -EINVAL; |
|---|
| 106 | 102 | |
|---|
| 107 | 103 | /* TODO: use ip6_datagram_send_ctl to get options from cmsg */ |
|---|
| .. | .. |
|---|
| 171 | 167 | .owner = THIS_MODULE, |
|---|
| 172 | 168 | .init = ping_init_sock, |
|---|
| 173 | 169 | .close = ping_close, |
|---|
| 174 | | - .destroy = ping_v6_destroy, |
|---|
| 175 | 170 | .connect = ip6_datagram_connect_v6_only, |
|---|
| 176 | 171 | .disconnect = __udp_disconnect, |
|---|
| 177 | 172 | .setsockopt = ipv6_setsockopt, |
|---|