X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/27e5eff54a6763a96371675aeb98e9ac226af497..62a291b267aa13f09506740f0137dfe7d4b587bb:/usr/src/sys/netinet/udp_usrreq.c diff --git a/usr/src/sys/netinet/udp_usrreq.c b/usr/src/sys/netinet/udp_usrreq.c index c88c757661..4ad6191c88 100644 --- a/usr/src/sys/netinet/udp_usrreq.c +++ b/usr/src/sys/netinet/udp_usrreq.c @@ -1,25 +1,26 @@ -/* udp_usrreq.c 6.4 84/06/22 */ - -#include "../h/param.h" -#include "../h/dir.h" -#include "../h/user.h" -#include "../h/mbuf.h" -#include "../h/protosw.h" -#include "../h/socket.h" -#include "../h/socketvar.h" -#include "../h/errno.h" +/* udp_usrreq.c 6.13 85/05/27 */ + +#include "param.h" +#include "dir.h" +#include "user.h" +#include "mbuf.h" +#include "protosw.h" +#include "socket.h" +#include "socketvar.h" +#include "errno.h" +#include "stat.h" #include "../net/if.h" #include "../net/route.h" -#include "../netinet/in.h" -#include "../netinet/in_pcb.h" -#include "../netinet/in_systm.h" -#include "../netinet/ip.h" -#include "../netinet/ip_var.h" -#include "../netinet/ip_icmp.h" -#include "../netinet/udp.h" -#include "../netinet/udp_var.h" +#include "in.h" +#include "in_pcb.h" +#include "in_systm.h" +#include "ip.h" +#include "ip_var.h" +#include "ip_icmp.h" +#include "udp.h" +#include "udp_var.h" /* * UDP protocol implementation. @@ -31,7 +32,7 @@ udp_init() udb.inp_next = udb.inp_prev = &udb; } -int udpcksum = 0; +int udpcksum = 1; struct sockaddr_in udp_in = { AF_INET }; udp_input(m0) @@ -75,7 +76,7 @@ udp_input(m0) if (udpcksum && ui->ui_sum) { ui->ui_next = ui->ui_prev = 0; ui->ui_x1 = 0; - ui->ui_len = htons((u_short)len); + ui->ui_len = ui->ui_ulen; if (ui->ui_sum = in_cksum(m, len + sizeof (struct ip))) { udpstat.udps_badsum++; m_freem(m); @@ -91,7 +92,7 @@ udp_input(m0) INPLOOKUP_WILDCARD); if (inp == 0) { /* don't send ICMP response for broadcast packet */ - if (in_lnaof(ui->ui_dst) == INADDR_ANY) + if (in_broadcast(ui->ui_dst)) goto bad; icmp_error((struct ip *)ui, ICMP_UNREACH, ICMP_UNREACH_PORT); return; @@ -168,7 +169,7 @@ udp_output(inp, m0) */ for (m = m0; m; m = m->m_next) len += m->m_len; - m = m_get(M_DONTWAIT, MT_HEADER); + MGET(m, M_DONTWAIT, MT_HEADER); if (m == 0) { m_freem(m0); return (ENOBUFS); @@ -196,14 +197,16 @@ udp_output(inp, m0) * Stuff checksum and output datagram. */ ui->ui_sum = 0; - if ((ui->ui_sum = in_cksum(m, sizeof (struct udpiphdr) + len)) == 0) + if (udpcksum) { + if ((ui->ui_sum = in_cksum(m, sizeof (struct udpiphdr) + len)) == 0) ui->ui_sum = -1; + } ((struct ip *)ui)->ip_len = sizeof (struct udpiphdr) + len; ((struct ip *)ui)->ip_ttl = MAXTTL; so = inp->inp_socket; if (so->so_options & SO_DONTROUTE) return (ip_output(m, (struct mbuf *)0, (struct route *)0, - IP_ROUTETOIF)); + (so->so_options & SO_BROADCAST) | IP_ROUTETOIF)); /* * Use cached route for previous datagram if * this is also to the same destination. @@ -218,9 +221,13 @@ udp_output(inp, m0) RTFREE(ro->ro_rt); ro->ro_rt = (struct rtentry *)0; } - return (ip_output(m, (struct mbuf *)0, ro, so->so_state & SS_PRIV)); + return (ip_output(m, (struct mbuf *)0, ro, + so->so_options & SO_BROADCAST)); } +int udp_sendspace = 2048; /* really max datagram size */ +int udp_recvspace = 4 * (1024+sizeof(struct sockaddr_in)); /* 4 1K dgrams */ + /*ARGSUSED*/ udp_usrreq(so, req, m, nam, rights) struct socket *so; @@ -230,6 +237,9 @@ udp_usrreq(so, req, m, nam, rights) struct inpcb *inp = sotoinpcb(so); int error = 0; + if (req == PRU_CONTROL) + return (in_control(so, (int)m, (caddr_t)nam, + (struct ifnet *)rights)); if (rights && rights->m_len) { error = EINVAL; goto release; @@ -248,7 +258,7 @@ udp_usrreq(so, req, m, nam, rights) error = in_pcballoc(so, &udb); if (error) break; - error = soreserve(so, 2048, 2048); + error = soreserve(so, udp_sendspace, udp_recvspace); if (error) break; break; @@ -302,6 +312,7 @@ udp_usrreq(so, req, m, nam, rights) case PRU_SEND: { struct in_addr laddr; + int s; if (nam) { laddr = inp->inp_laddr; @@ -309,9 +320,15 @@ udp_usrreq(so, req, m, nam, rights) error = EISCONN; break; } + /* + * Must block input while temporarily connected. + */ + s = splnet(); error = in_pcbconnect(inp, nam); - if (error) + if (error) { + splx(s); break; + } } else { if (inp->inp_faddr.s_addr == INADDR_ANY) { error = ENOTCONN; @@ -323,6 +340,7 @@ udp_usrreq(so, req, m, nam, rights) if (nam) { in_pcbdisconnect(inp); inp->inp_laddr = laddr; + splx(s); } } break; @@ -341,17 +359,12 @@ udp_usrreq(so, req, m, nam, rights) in_setpeeraddr(inp, nam); break; - case PRU_CONTROL: - m = NULL; - error = EOPNOTSUPP; - break; - case PRU_SENSE: - m = NULL; - /* fall thru... */ + /* + * stat: don't bother with a blocksize. + */ + return (0); - case PRU_RCVD: - case PRU_RCVOOB: case PRU_SENDOOB: case PRU_FASTTIMO: case PRU_SLOWTIMO: @@ -360,6 +373,10 @@ udp_usrreq(so, req, m, nam, rights) error = EOPNOTSUPP; break; + case PRU_RCVD: + case PRU_RCVOOB: + return (EOPNOTSUPP); /* do not free mbuf's */ + default: panic("udp_usrreq"); }