summaryrefslogtreecommitdiff
path: root/sys/netinet/udp_usrreq.c
diff options
context:
space:
mode:
authorJonathan Lemon <jlemon@FreeBSD.org>2001-02-26 21:19:47 +0000
committerJonathan Lemon <jlemon@FreeBSD.org>2001-02-26 21:19:47 +0000
commitc693a045de10c4a8ac87237a8cd6abca5e501065 (patch)
treea724b7398a9719872fe81cf61b91c63ee965cd58 /sys/netinet/udp_usrreq.c
parent68960924fe80e3a2ab5b6511f5d0ac7a5cee02f4 (diff)
Notes
Diffstat (limited to 'sys/netinet/udp_usrreq.c')
-rw-r--r--sys/netinet/udp_usrreq.c29
1 files changed, 16 insertions, 13 deletions
diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c
index 2e7fe8958857..1dd3eee9f216 100644
--- a/sys/netinet/udp_usrreq.c
+++ b/sys/netinet/udp_usrreq.c
@@ -504,31 +504,34 @@ udp_ctlinput(cmd, sa, vip)
struct sockaddr *sa;
void *vip;
{
- register struct ip *ip = vip;
- register struct udphdr *uh;
+ struct ip *ip = vip;
+ struct udphdr *uh;
void (*notify) __P((struct inpcb *, int)) = udp_notify;
+ struct in_addr faddr;
+ struct inpcb *inp;
+ int s;
+
+ faddr = ((struct sockaddr_in *)sa)->sin_addr;
+ if (sa->sa_family != AF_INET || faddr.s_addr == INADDR_ANY)
+ return;
if (PRC_IS_REDIRECT(cmd)) {
- /*
- * Redirects go to all references to the destination,
- * and use in_rtchange to invalidate the route cache.
- */
ip = 0;
notify = in_rtchange;
} else if (cmd == PRC_HOSTDEAD)
- /*
- * Dead host indications: notify all references to the
- * destination.
- */
ip = 0;
else if ((unsigned)cmd >= PRC_NCMDS || inetctlerrmap[cmd] == 0)
return;
if (ip) {
+ s = splnet();
uh = (struct udphdr *)((caddr_t)ip + (ip->ip_hl << 2));
- in_pcbnotify(&udb, sa, uh->uh_dport, ip->ip_src, uh->uh_sport,
- cmd, notify, 0, 0);
+ inp = in_pcblookup_hash(&udbinfo, faddr, uh->uh_dport,
+ ip->ip_src, uh->uh_sport, 0, NULL);
+ if (inp != NULL && inp->inp_socket != NULL)
+ (*notify)(inp, inetctlerrmap[cmd]);
+ splx(s);
} else
- in_pcbnotifyall(&udb, sa, cmd, notify);
+ in_pcbnotifyall(&udb, faddr, inetctlerrmap[cmd], notify);
}
static int