|
@@ -695,12 +695,20 @@ static int raw_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
|
|
|
{
|
|
|
struct inet_sock *inet = inet_sk(sk);
|
|
|
struct sockaddr_in *addr = (struct sockaddr_in *) uaddr;
|
|
|
+ u32 tb_id = RT_TABLE_LOCAL;
|
|
|
int ret = -EINVAL;
|
|
|
int chk_addr_ret;
|
|
|
|
|
|
if (sk->sk_state != TCP_CLOSE || addr_len < sizeof(struct sockaddr_in))
|
|
|
goto out;
|
|
|
- chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr);
|
|
|
+
|
|
|
+ if (sk->sk_bound_dev_if)
|
|
|
+ tb_id = l3mdev_fib_table_by_index(sock_net(sk),
|
|
|
+ sk->sk_bound_dev_if) ? : tb_id;
|
|
|
+
|
|
|
+ chk_addr_ret = inet_addr_type_table(sock_net(sk), addr->sin_addr.s_addr,
|
|
|
+ tb_id);
|
|
|
+
|
|
|
ret = -EADDRNOTAVAIL;
|
|
|
if (addr->sin_addr.s_addr && chk_addr_ret != RTN_LOCAL &&
|
|
|
chk_addr_ret != RTN_MULTICAST && chk_addr_ret != RTN_BROADCAST)
|