From: Philippe Troin <phil@fifi.org>
To: "Nadav Har'El" <nyh@math.technion.ac.il>
Cc: Erik De Bonte <erikd@lithtech.com>, linux-kernel@vger.kernel.org
Subject: Re: Determining IP:port corresponding to an ICMP port unreachable
Date: 31 Jul 2001 09:41:43 -0700 [thread overview]
Message-ID: <87k80pyrso.fsf@ceramic.fifi.org> (raw)
In-Reply-To: <AF020C5FC551DD43A4958A679EA16A1501349556@mailcluster.lith.com> <20010731111131.B29309@leeor.math.technion.ac.il>
In-Reply-To: <20010731111131.B29309@leeor.math.technion.ac.il>
"Nadav Har'El" <nyh@math.technion.ac.il> writes:
> On Mon, Jul 30, 2001, Erik De Bonte wrote about "Determining IP:port
> corresponding to an ICMP port unreachable":
> > When an ICMP port unreachable message is received and corresponds
> > to a UDP socket, is there a way to determine the corresponding
> > unreachable IP and port? I'm able to retrieve the IP, but not the
> > port. From looking through the kernel source, it appears that the
> > port is never extracted from the payload section of the ICMP
> > message. If this is indeed a limitation of the kernel, is there a
> > plan to "fix" it in the future?
>
> If you recvfrom (for example) on a UDP socket (which, obviously, has
> some port number) on which you sent a message previously, recvfrom
> will return (-1) (with errno=connection refused) if an ICMP port
> unreachable was received by the kernel for this port. This kind of
> error is asynchronous, in the sense that you will get it some time
> later after sending the original message (you could have sent and
> received a dozen other messages in the meantime).
>
> For connected()ed sockets, this behavior is indeed useful - you know
> which port sent the message, which host and port was meant to get
> that message (because the socket is connected() and only sends to
> one host/port).
>
> But for non-connected()ed sockets, you can only find out the host
> sending the ICMP message. Note that sometimes (e.g., with host
> unreachable errors) you don't even know the host you orignally sent
> the message to (that is burried in the IP heard inside the ICMP
> data) - only the host that sent you the error. And you don't know
> any port number (again, the port number is inside the ICMP packet,
> but you have no access to it - this is what you wrote too).
>
> This is why the original BSD behavior was to pass these errors only
> on connect()ed sockets. Linux decided to give those errors on
> unconnect()ed sockets - while it is usually not useful, it fits more
> closely with RFC 1122 which says in section 4.1.2.3: "UDP MUST pass
> to the application layer all ICMP error messages that it receives
> from the IP layer".
>
> There's a discussion about this issue in Stevens' book ""UNIX
> Network Programming", section 8.9 (Elementary UDP Sockets, Server
> Not Running), page 221, and he discusses why the socket API is
> problematic in that respect.
>
> I think the only recourse you have (if you really want to know which
> host/port every ICMP message is about) is to listen on a raw socket, which
> you open with something like
> in_icmp=socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
> shutdown(in_icmp,SHUT_WR); /* optional (we don't intend to write) */
>
> And then you'll get full ICMP packets (all of them!) - and you'll
> have to pick out the ones intended for your port(s), and then take
> out the destination ip and port inside the ip header that is inside
> the ICMP packet (not the ip header of the ICMP packet itself!). This
> is rather ugly, because it requires you to understand how IP and UDP
> headers look like. Note that you need superuser permissions to
> create (but not to read) a raw socket.
Nah, on linux, use setsockopt with IP_RECVERR.
man 7 ip
Phil.
next prev parent reply other threads:[~2001-07-31 16:42 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-07-30 23:08 Determining IP:port corresponding to an ICMP port unreachable Erik De Bonte
2001-07-31 8:11 ` Nadav Har'El
2001-07-31 16:41 ` Philippe Troin [this message]
-- strict thread matches above, loose matches on Subject: below --
2001-07-31 19:03 Erik De Bonte
2001-07-31 19:20 ` Nadav Har'El
2001-08-01 22:53 ` Alexey Kuznetsov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87k80pyrso.fsf@ceramic.fifi.org \
--to=phil@fifi.org \
--cc=erikd@lithtech.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nyh@math.technion.ac.il \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox