Zhang, Yanmin a écrit :
On Mon, 2008-01-21 at 22:22 -0800, David Miller wrote:
From: "Zhang, Yanmin" <[EMAIL PROTECTED]>
Date: Tue, 22 Jan 2008 14:07:19 +0800

I am wondering if UDP stack in kernel has a bug.
If one server binds to INADDR_ANY with port N, then any other socket
can be bound to a specific IP address with port N.  When packets
come in destined for port N, the delivery will be prioritized
to whichever socket has the more specific and matching binding.
What does 'more specific' mean here? I assume 127.0.0.1 should be
prioritized before 0.0.0.0 which means packets should be queued to
127.0.0.1 firstly.

vi +278 net/ipv4/udp.c

                        int score = (sk->sk_family == PF_INET ? 1 : 0);
                        if (inet->rcv_saddr) {
                                if (inet->rcv_saddr != daddr)
                                        continue;
                                score+=2;
                        }
                        if (inet->daddr) {
                                if (inet->daddr != saddr)
                                        continue;
                                score+=2;
                        }
                        if (inet->dport) {
                                if (inet->dport != sport)
                                        continue;
                                score+=2;
                        }
                        if (sk->sk_bound_dev_if) {
                                if (sk->sk_bound_dev_if != dif)
                                        continue;
                                score+=2;
                        }

So in your case, socket bound to 127.0.0.1 should have a better score (+2) than other one, unless the other one got an >= score because of another match (rcv_saddr set or bounded to an interface)





--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to