]> git.neil.brown.name Git - history.git/commitdiff
UDP fixes:
authorAlexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Tue, 19 Mar 2002 12:17:37 +0000 (04:17 -0800)
committerDavid S. Miller <davem@nuts.ninka.net>
Tue, 19 Mar 2002 12:17:37 +0000 (04:17 -0800)
- respect multicast interface when connecting

net/ipv4/udp.c
net/ipv6/udp.c

index b0b616b52a124f7b61701daa8a1ed9b85a8276aa..c67ea0c1191b938674522f56f2570b3d9dacb8c8 100644 (file)
@@ -725,6 +725,8 @@ int udp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
        struct inet_opt *inet = inet_sk(sk);
        struct sockaddr_in *usin = (struct sockaddr_in *) uaddr;
        struct rtable *rt;
+       u32 saddr;
+       int oif;
        int err;
 
        
@@ -736,8 +738,16 @@ int udp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
 
        sk_dst_reset(sk);
 
-       err = ip_route_connect(&rt, usin->sin_addr.s_addr, inet->saddr,
-                              RT_CONN_FLAGS(sk), sk->bound_dev_if);
+       oif = sk->bound_dev_if;
+       saddr = inet->saddr;
+       if (MULTICAST(usin->sin_addr.s_addr)) {
+               if (!oif)
+                       oif = inet->mc_index;
+               if (!saddr)
+                       saddr = inet->mc_addr;
+       }
+       err = ip_route_connect(&rt, usin->sin_addr.s_addr, saddr,
+                              RT_CONN_FLAGS(sk), oif);
        if (err)
                return err;
        if ((rt->rt_flags&RTCF_BROADCAST) && !sk->broadcast) {
index a895089358aad5f9eaab8c5b0d394adbfcd613eb..f0be1474dcdb1e986d7a8d29844b8d478d5e6758 100644 (file)
@@ -293,6 +293,8 @@ ipv4_connected:
                                return -EINVAL;
                        }
                        sk->bound_dev_if = usin->sin6_scope_id;
+                       if (!sk->bound_dev_if && (addr_type&IPV6_ADDR_MULTICAST))
+                               fl.oif = np->mcast_oif;
                }
 
                /* Connect to link-local address requires an interface */
@@ -317,6 +319,9 @@ ipv4_connected:
        fl.uli_u.ports.dport = inet->dport;
        fl.uli_u.ports.sport = inet->sport;
 
+       if (!fl.oif && (addr_type&IPV6_ADDR_MULTICAST))
+               fl.oif = np->mcast_oif;
+
        if (flowlabel) {
                if (flowlabel->opt && flowlabel->opt->srcrt) {
                        struct rt0_hdr *rt0 = (struct rt0_hdr *) flowlabel->opt->srcrt;