From: Keith Sklower Date: Sun, 23 Apr 1989 03:06:06 +0000 (-0800) Subject: checkpoint at first working tp4 connection; & before gnodes X-Git-Tag: BSD-4_3_Tahoe-Snapshot-Development~381 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/b4dc7708ec297046aa0d84af71e49949ebefbbdf checkpoint at first working tp4 connection; & before gnodes SCCS-vsn: sys/netinet/ip_icmp.c 7.12 SCCS-vsn: sys/netinet/in_pcb.c 7.9 SCCS-vsn: sys/netinet/in_pcb.h 7.4 SCCS-vsn: sys/netinet/in_proto.c 7.4 SCCS-vsn: sys/netinet/in_var.h 7.4 SCCS-vsn: sys/netinet/if_ether.c 7.10 SCCS-vsn: sys/netinet/in.h 7.7 SCCS-vsn: sys/netinet/in.c 7.10 --- diff --git a/usr/src/sys/netinet/if_ether.c b/usr/src/sys/netinet/if_ether.c index 744c8f41ed..28dd53dcd3 100644 --- a/usr/src/sys/netinet/if_ether.c +++ b/usr/src/sys/netinet/if_ether.c @@ -14,7 +14,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * @(#)if_ether.c 7.9 (Berkeley) %G% + * @(#)if_ether.c 7.10 (Berkeley) %G% */ /* @@ -39,6 +39,7 @@ #include "../net/if.h" #include "in.h" #include "in_systm.h" +#include "in_var.h" #include "ip.h" #include "if_ether.h" @@ -165,6 +166,7 @@ arpresolve(ac, m, destip, desten, usetrailers) { register struct arptab *at; struct sockaddr_in sin; + register struct in_ifaddr *ia; u_long lna; int s; @@ -176,7 +178,9 @@ arpresolve(ac, m, destip, desten, usetrailers) } lna = in_lnaof(*destip); /* if for us, use software loopback driver if up */ - if (destip->s_addr == ac->ac_ipaddr.s_addr) { + for (ia = in_ifaddr; ia; ia = ia->ia_next) + if ((ia->ia_ifp == &ac->ac_if) && + (destip->s_addr == ia->ia_addr.sin_addr.s_addr)) { /* * This test used to be * if (loif.if_flags & IFF_UP) @@ -300,18 +304,29 @@ in_arpinput(ac, m) register struct ether_arp *ea; struct ether_header *eh; register struct arptab *at; /* same as "merge" flag */ + register struct in_ifaddr *ia; + struct in_ifaddr *maybe_ia = 0; struct mbuf *mcopy = 0; struct sockaddr_in sin; struct sockaddr sa; struct in_addr isaddr, itaddr, myaddr; int proto, op, s, completed = 0; - myaddr = ac->ac_ipaddr; ea = mtod(m, struct ether_arp *); proto = ntohs(ea->arp_pro); op = ntohs(ea->arp_op); bcopy((caddr_t)ea->arp_spa, (caddr_t)&isaddr, sizeof (isaddr)); bcopy((caddr_t)ea->arp_tpa, (caddr_t)&itaddr, sizeof (itaddr)); + for (ia = in_ifaddr; ia; ia = ia->ia_next) + if (ia->ia_ifp == &ac->ac_if) { + maybe_ia = ia; + if ((itaddr.s_addr == ia->ia_addr.sin_addr.s_addr) || + (isaddr.s_addr == ia->ia_addr.sin_addr.s_addr)) + break; + } + if (maybe_ia == 0) + goto out; + myaddr = ia ? ia->ia_addr.sin_addr : maybe_ia->ia_addr.sin_addr; if (!bcmp((caddr_t)ea->arp_sha, (caddr_t)ac->ac_enaddr, sizeof (ea->arp_sha))) goto out; /* it's from me, ignore it. */ diff --git a/usr/src/sys/netinet/in.c b/usr/src/sys/netinet/in.c index eac5b1d071..1793dba220 100644 --- a/usr/src/sys/netinet/in.c +++ b/usr/src/sys/netinet/in.c @@ -14,7 +14,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * @(#)in.c 7.9 (Berkeley) %G% + * @(#)in.c 7.10 (Berkeley) %G% */ #include "param.h" @@ -34,27 +34,6 @@ #include "in_var.h" #ifdef INET -inet_hash(sin, hp) - register struct sockaddr_in *sin; - struct afhash *hp; -{ - register u_long n; - - n = in_netof(sin->sin_addr); - if (n) - while ((n & 0xff) == 0) - n >>= 8; - hp->afh_nethash = n; - hp->afh_hosthash = ntohl(sin->sin_addr.s_addr); -} - -inet_netmatch(sin1, sin2) - struct sockaddr_in *sin1, *sin2; -{ - - return (in_netof(sin1->sin_addr) == in_netof(sin2->sin_addr)); -} - /* * Formulate an Internet address from network + host. */ @@ -111,6 +90,53 @@ in_netof(in) return (net); } +/* + * Compute and save network mask as sockaddr from an internet address. + */ +in_sockmaskof(in, sockmask) + struct in_addr in; + register struct sockaddr_in *sockmask; +{ + register u_long net; + register u_long mask; + { + register u_long i = ntohl(in.s_addr); + + if (i == 0) + net = 0, mask = 0; + else if (IN_CLASSA(i)) + net = i & IN_CLASSA_NET, mask = IN_CLASSA_NET; + else if (IN_CLASSB(i)) + net = i & IN_CLASSB_NET, mask = IN_CLASSB_NET; + else if (IN_CLASSC(i)) + net = i & IN_CLASSC_NET, mask = IN_CLASSC_NET; + else + net = i, mask = -1; + } + { + register struct in_ifaddr *ia; + /* + * Check whether network is a subnet; + * if so, return subnet number. + */ + for (ia = in_ifaddr; ia; ia = ia->ia_next) + if (net == ia->ia_net) + mask = ia->ia_subnetmask; + } + { + register char *cp = (char *)&(sockmask->sin_port); + register char *cpbase = (char *)&(sockmask->sin_addr); + + sockmask->sin_addr.s_addr = htonl(mask); + sockmask->sin_len = 0; + while (--cp >= cpbase) + if (*cp) { + sockmask->sin_len = 1 + cp - (caddr_t)sockmask; + break; + } + } +} + /* * Return the host portion of an internet address. */ @@ -209,9 +235,13 @@ in_control(so, cmd, data, ifp) { register struct ifreq *ifr = (struct ifreq *)data; register struct in_ifaddr *ia = 0; - struct ifaddr *ifa; + register struct ifaddr *ifa; + struct in_ifaddr *oia; + struct in_aliasreq *ifra = (struct in_aliasreq *)data; struct mbuf *m; - int error; + struct sockaddr_in oldaddr; + int error, hostIsNew, maskIsNew; + u_long i; /* * Find address for this interface, if it exists. @@ -223,6 +253,18 @@ in_control(so, cmd, data, ifp) switch (cmd) { + case SIOCAIFADDR: + case SIOCDIFADDR: + if (ifra->ifra_addr.sin_family == AF_INET) + for (oia = ia; ia; ia = ia->ia_next) { + if (ia->ia_ifp == ifp && + ia->ia_addr.sin_addr.s_addr == + ifra->ifra_addr.sin_addr.s_addr) + break; + } + if (cmd == SIOCDIFADDR && ia == 0) + return (EADDRNOTAVAIL); + /* FALLTHROUGH */ case SIOCSIFADDR: case SIOCSIFNETMASK: case SIOCSIFDSTADDR: @@ -248,8 +290,17 @@ in_control(so, cmd, data, ifp) ifa->ifa_next = (struct ifaddr *) ia; } else ifp->if_addrlist = (struct ifaddr *) ia; + ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr; + ia->ia_ifa.ifa_dstaddr + = (struct sockaddr *)&ia->ia_dstaddr; + ia->ia_ifa.ifa_netmask + = (struct sockaddr *)&ia->ia_sockmask; + ia->ia_sockmask.sin_len = 8; + if (ifp->if_flags & IFF_BROADCAST) { + ia->ia_broadaddr.sin_len = sizeof(ia->ia_addr); + ia->ia_broadaddr.sin_family = AF_INET; + } ia->ia_ifp = ifp; - IA_SIN(ia)->sin_family = AF_INET; if (ifp != &loif) in_interfaces++; } @@ -265,65 +316,118 @@ in_control(so, cmd, data, ifp) return (EADDRNOTAVAIL); break; } - switch (cmd) { case SIOCGIFADDR: - ifr->ifr_addr = ia->ia_addr; + *((struct sockaddr_in *)&ifr->ifr_addr) = ia->ia_addr; break; case SIOCGIFBRDADDR: if ((ifp->if_flags & IFF_BROADCAST) == 0) return (EINVAL); - ifr->ifr_dstaddr = ia->ia_broadaddr; + *((struct sockaddr_in *)&ifr->ifr_dstaddr) = ia->ia_broadaddr; break; case SIOCGIFDSTADDR: if ((ifp->if_flags & IFF_POINTOPOINT) == 0) return (EINVAL); - ifr->ifr_dstaddr = ia->ia_dstaddr; + *((struct sockaddr_in *)&ifr->ifr_dstaddr) = ia->ia_dstaddr; break; case SIOCGIFNETMASK: -#define satosin(sa) ((struct sockaddr_in *)(sa)) - satosin(&ifr->ifr_addr)->sin_family = AF_INET; - satosin(&ifr->ifr_addr)->sin_addr.s_addr = htonl(ia->ia_subnetmask); + *((struct sockaddr_in *)&ifr->ifr_addr) = ia->ia_sockmask; break; case SIOCSIFDSTADDR: - { - struct sockaddr oldaddr; - if ((ifp->if_flags & IFF_POINTOPOINT) == 0) return (EINVAL); oldaddr = ia->ia_dstaddr; - ia->ia_dstaddr = ifr->ifr_dstaddr; + ia->ia_dstaddr = *(struct sockaddr_in *)&ifr->ifr_dstaddr; if (ifp->if_ioctl && (error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR, ia))) { ia->ia_dstaddr = oldaddr; return (error); } if (ia->ia_flags & IFA_ROUTE) { - rtinit(&oldaddr, &ia->ia_addr, (int)SIOCDELRT, - RTF_HOST); - rtinit(&ia->ia_dstaddr, &ia->ia_addr, (int)SIOCADDRT, - RTF_HOST|RTF_UP); + ia->ia_ifa.ifa_dstaddr = (struct sockaddr *)&oldaddr; + rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST); + ia->ia_ifa.ifa_dstaddr = (struct sockaddr *)&ia->ia_addr; + rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP); } - } break; case SIOCSIFBRDADDR: if ((ifp->if_flags & IFF_BROADCAST) == 0) return (EINVAL); - ia->ia_broadaddr = ifr->ifr_broadaddr; + ia->ia_broadaddr = *(struct sockaddr_in *)&ifr->ifr_broadaddr; break; case SIOCSIFADDR: return (in_ifinit(ifp, ia, - (struct sockaddr_in *) &ifr->ifr_addr)); + (struct sockaddr_in *) &ifr->ifr_addr, 1)); case SIOCSIFNETMASK: - ia->ia_subnetmask = ntohl(satosin(&ifr->ifr_addr)->sin_addr.s_addr); + i = ifra->ifra_addr.sin_addr.s_addr; + ia->ia_subnetmask = ntohl(ia->ia_sockmask.sin_addr.s_addr = i); + break; + + case SIOCAIFADDR: + maskIsNew = 0; hostIsNew = 1; error = u.u_error; + if (ia->ia_addr.sin_family == AF_INET) { + if (ifra->ifra_addr.sin_len == 0) { + ifra->ifra_addr = ia->ia_addr; + hostIsNew = 0; + } else if (ifra->ifra_addr.sin_addr.s_addr == + ia->ia_addr.sin_addr.s_addr) + hostIsNew = 0; + } + if (ifra->ifra_mask.sin_len) { + in_ifscrub(ifp, ia); + ia->ia_sockmask = ifra->ifra_mask; + ia->ia_subnetmask = + ntohl(ia->ia_sockmask.sin_addr.s_addr); + maskIsNew = 1; + } + if ((ifp->if_flags & IFF_POINTOPOINT) && + (ifra->ifra_dstaddr.sin_family == AF_INET)) { + in_ifscrub(ifp, ia); + ia->ia_dstaddr = ifra->ifra_dstaddr; + maskIsNew = 1; /* We lie; but the effect's the same */ + } + if (ifra->ifra_addr.sin_family == AF_INET && + (hostIsNew || maskIsNew)) + error = in_ifinit(ifp, ia, &ifra->ifra_addr, 0); + if ((ifp->if_flags & IFF_BROADCAST) && + (ifra->ifra_broadaddr.sin_family == AF_INET)) + ia->ia_broadaddr = ifra->ifra_broadaddr; + return (error); + + case SIOCDIFADDR: + in_ifscrub(ifp, ia); + if ((ifa = ifp->if_addrlist) == (struct ifaddr *)ia) + ifp->if_addrlist = ifa->ifa_next; + else { + while (ifa->ifa_next && + (ifa->ifa_next != (struct ifaddr *)ia)) + ifa = ifa->ifa_next; + if (ifa->ifa_next) + ifa->ifa_next = ((struct ifaddr *)ia)->ifa_next; + else + printf("Couldn't unlink inifaddr from ifp\n"); + } + oia = ia; + if (oia == (ia = in_ifaddr)) { + in_ifaddr = ia->ia_next; + } else { + while (ia->ia_next && (ia->ia_next != oia)) { + ia = ia->ia_next; + } + if (ia->ia_next) + ia->ia_next = oia->ia_next; + else + printf("Didn't unlink inifadr from list\n"); + } + (void) m_free(dtom(oia)); break; default: @@ -334,23 +438,38 @@ in_control(so, cmd, data, ifp) return (0); } +/* + * Delete any existing route for an interface. + */ +in_ifscrub(ifp, ia) + register struct ifnet *ifp; + register struct in_ifaddr *ia; +{ + + if ((ia->ia_flags & IFA_ROUTE) == 0) + return; + if (ifp->if_flags & (IFF_LOOPBACK|IFF_POINTOPOINT)) + rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST); + else + rtinit(&(ia->ia_ifa), (int)RTM_DELETE, 0); + ia->ia_flags &= ~IFA_ROUTE; +} + /* * Initialize an interface's internet address * and routing table entry. */ -in_ifinit(ifp, ia, sin) +in_ifinit(ifp, ia, sin, scrub) register struct ifnet *ifp; register struct in_ifaddr *ia; struct sockaddr_in *sin; { register u_long i = ntohl(sin->sin_addr.s_addr); - struct sockaddr oldaddr; - struct sockaddr_in netaddr; + struct sockaddr_in oldaddr; int s = splimp(), error; oldaddr = ia->ia_addr; - ia->ia_addr = *(struct sockaddr *)sin; - + ia->ia_addr = *sin; /* * Give the interface a chance to initialize * if this is its first address, @@ -361,25 +480,10 @@ in_ifinit(ifp, ia, sin) ia->ia_addr = oldaddr; return (error); } - - /* - * Delete any previous route for an old address. - */ - bzero((caddr_t)&netaddr, sizeof (netaddr)); - netaddr.sin_family = AF_INET; - if (ia->ia_flags & IFA_ROUTE) { - if (ifp->if_flags & IFF_LOOPBACK) - rtinit(&oldaddr, &oldaddr, (int)SIOCDELRT, RTF_HOST); - else if (ifp->if_flags & IFF_POINTOPOINT) - rtinit(&ia->ia_dstaddr, &oldaddr, (int)SIOCDELRT, - RTF_HOST); - else { - netaddr.sin_addr = in_makeaddr(ia->ia_subnet, - INADDR_ANY); - rtinit((struct sockaddr *)&netaddr, &oldaddr, - (int)SIOCDELRT, 0); - } - ia->ia_flags &= ~IFA_ROUTE; + if (scrub) { + ia->ia_ifa.ifa_addr = (struct sockaddr *)&oldaddr; + in_ifscrub(ifp, ia); + ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr; } if (IN_CLASSA(i)) ia->ia_netmask = IN_CLASSA_NET; @@ -394,9 +498,9 @@ in_ifinit(ifp, ia, sin) */ ia->ia_subnetmask |= ia->ia_netmask; ia->ia_subnet = i & ia->ia_subnetmask; + ia->ia_sockmask.sin_addr.s_addr = htonl(ia->ia_subnetmask); if (ifp->if_flags & IFF_BROADCAST) { - ia->ia_broadaddr.sa_family = AF_INET; - ((struct sockaddr_in *)(&ia->ia_broadaddr))->sin_addr = + ia->ia_broadaddr.sin_addr = in_makeaddr(ia->ia_subnet, INADDR_BROADCAST); ia->ia_netbroadcast.s_addr = htonl(ia->ia_net | (INADDR_BROADCAST &~ ia->ia_netmask)); @@ -404,16 +508,14 @@ in_ifinit(ifp, ia, sin) /* * Add route for the network. */ - if (ifp->if_flags & IFF_LOOPBACK) - rtinit(&ia->ia_addr, &ia->ia_addr, (int)SIOCADDRT, - RTF_HOST|RTF_UP); - else if (ifp->if_flags & IFF_POINTOPOINT) - rtinit(&ia->ia_dstaddr, &ia->ia_addr, (int)SIOCADDRT, - RTF_HOST|RTF_UP); + if (ifp->if_flags & IFF_LOOPBACK) { + ia->ia_ifa.ifa_dstaddr = ia->ia_ifa.ifa_addr; + rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP); + } else if (ifp->if_flags & IFF_POINTOPOINT && + ia->ia_dstaddr.sin_family == AF_INET) + rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP); else { - netaddr.sin_addr = in_makeaddr(ia->ia_subnet, INADDR_ANY); - rtinit((struct sockaddr *)&netaddr, &ia->ia_addr, - (int)SIOCADDRT, RTF_UP); + rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_UP); } ia->ia_flags |= IFA_ROUTE; splx(s); @@ -450,7 +552,7 @@ in_broadcast(in) */ for (ia = in_ifaddr; ia; ia = ia->ia_next) if (ia->ia_ifp->if_flags & IFF_BROADCAST) { - if (satosin(&ia->ia_broadaddr)->sin_addr.s_addr == in.s_addr) + if (ia->ia_broadaddr.sin_addr.s_addr == in.s_addr) return (1); /* * Check for old-style (host 0) broadcast. diff --git a/usr/src/sys/netinet/in.h b/usr/src/sys/netinet/in.h index 95c74f704b..d881e5e526 100644 --- a/usr/src/sys/netinet/in.h +++ b/usr/src/sys/netinet/in.h @@ -14,7 +14,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * @(#)in.h 7.6 (Berkeley) %G% + * @(#)in.h 7.7 (Berkeley) %G% */ /* @@ -33,6 +33,8 @@ #define IPPROTO_PUP 12 /* pup */ #define IPPROTO_UDP 17 /* user datagram protocol */ #define IPPROTO_IDP 22 /* xns idp */ +#define IPPROTO_TP 29 /* tp-4 w/ class negotiation */ +#define IPPROTO_EON 80 /* ISO cnlp */ #define IPPROTO_RAW 255 /* raw IP packet */ #define IPPROTO_MAX 256 @@ -101,7 +103,8 @@ struct in_addr { * Socket address, internet style. */ struct sockaddr_in { - short sin_family; + u_char sin_len; + u_char sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; @@ -111,6 +114,7 @@ struct sockaddr_in { * Options for use with [gs]etsockopt at the IP level. */ #define IP_OPTIONS 1 /* set/get IP per-packet options */ +#define IP_HDRINCL 2 /* set/get IP per-packet options */ #ifdef KERNEL extern struct domain inetdomain; diff --git a/usr/src/sys/netinet/in_pcb.c b/usr/src/sys/netinet/in_pcb.c index bd51daefdc..47049da6fb 100644 --- a/usr/src/sys/netinet/in_pcb.c +++ b/usr/src/sys/netinet/in_pcb.c @@ -14,7 +14,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * @(#)in_pcb.c 7.8 (Berkeley) %G% + * @(#)in_pcb.c 7.9 (Berkeley) %G% */ #include "param.h" @@ -168,6 +168,7 @@ in_pcbconnect(inp, nam) ro->ro_rt->rt_ifp == (struct ifnet *)0)) { /* No route yet, so try to acquire one */ ro->ro_dst.sa_family = AF_INET; + ro->ro_dst.sa_len = sizeof(struct sockaddr_in); ((struct sockaddr_in *) &ro->ro_dst)->sin_addr = sin->sin_addr; rtalloc(ro); @@ -251,6 +252,7 @@ in_setsockaddr(inp, nam) sin = mtod(nam, struct sockaddr_in *); bzero((caddr_t)sin, sizeof (*sin)); sin->sin_family = AF_INET; + sin->sin_len = sizeof(*sin); sin->sin_port = inp->inp_lport; sin->sin_addr = inp->inp_laddr; } @@ -265,6 +267,7 @@ in_setpeeraddr(inp, nam) sin = mtod(nam, struct sockaddr_in *); bzero((caddr_t)sin, sizeof (*sin)); sin->sin_family = AF_INET; + sin->sin_len = sizeof(*sin); sin->sin_port = inp->inp_fport; sin->sin_addr = inp->inp_faddr; } @@ -310,10 +313,15 @@ in_losing(inp) register struct rtentry *rt; if ((rt = inp->inp_route.ro_rt)) { + rt_missmsg(RTM_LOSING, &inp->inp_route.ro_dst, + rt->rt_gateway, (struct sockaddr *)rt_mask(rt), + (struct sockaddr *)0, rt->rt_flags, 0); if (rt->rt_flags & RTF_DYNAMIC) - (void) rtrequest((int)SIOCDELRT, rt); - rtfree(rt); + (void) rtrequest(RTM_DELETE, rt_key(rt), + rt->rt_gateway, rt_mask(rt), rt->rt_flags, + (struct rtentry **)0); inp->inp_route.ro_rt = 0; + rtfree(rt); /* * A new route can be allocated * the next time output is attempted. diff --git a/usr/src/sys/netinet/in_pcb.h b/usr/src/sys/netinet/in_pcb.h index 2e15a0a24a..bf6ecd3570 100644 --- a/usr/src/sys/netinet/in_pcb.h +++ b/usr/src/sys/netinet/in_pcb.h @@ -14,7 +14,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * @(#)in_pcb.h 7.3 (Berkeley) %G% + * @(#)in_pcb.h 7.4 (Berkeley) %G% */ /* @@ -39,10 +39,28 @@ struct inpcb { struct mbuf *inp_options; /* IP options */ }; +#ifdef sotorawcb +/* + * Common structure pcb for raw internet protocol access. + * Here are internet specific extensions to the raw control block, + * and space is allocated to the necessary sockaddrs. + */ +struct raw_inpcb { + struct rawcb rinp_rcb; /* common control block prefix */ + struct mbuf *rinp_options; /* IP options */ + int rinp_flags; /* flags, e.g. raw sockopts */ +#define RINPF_HDRINCL 0x1 /* user supplies entire IP header */ + struct sockaddr_in rinp_faddr; /* foreign address */ + struct sockaddr_in rinp_laddr; /* local address */ + struct route rinp_route; /* placeholder for routing entry */ +}; +#endif + #define INPLOOKUP_WILDCARD 1 #define INPLOOKUP_SETLOCAL 2 #define sotoinpcb(so) ((struct inpcb *)(so)->so_pcb) +#define sotorawinpcb(so) ((struct raw_inpcb *)(so)->so_pcb) #ifdef KERNEL struct inpcb *in_pcblookup(); diff --git a/usr/src/sys/netinet/in_proto.c b/usr/src/sys/netinet/in_proto.c index 9a191afc24..2fabf3d4c3 100644 --- a/usr/src/sys/netinet/in_proto.c +++ b/usr/src/sys/netinet/in_proto.c @@ -14,7 +14,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * @(#)in_proto.c 7.3 (Berkeley) %G% + * @(#)in_proto.c 7.4 (Berkeley) %G% */ #include "param.h" @@ -38,8 +38,7 @@ int udp_init(); int tcp_input(),tcp_ctlinput(); int tcp_usrreq(),tcp_ctloutput(); int tcp_init(),tcp_fasttimo(),tcp_slowtimo(),tcp_drain(); -int rip_input(),rip_output(),rip_ctloutput(); -extern int raw_usrreq(); +int rip_input(),rip_output(),rip_ctloutput(), rip_usrreq(); /* * IMP protocol family: raw interface. * Using the raw interface entry to get the timer routine @@ -54,6 +53,15 @@ int rimp_output(), hostslowtimo(); int idpip_input(), nsip_ctlinput(); #endif +#ifdef TPIP +int tpip_input(), tpip_ctlinput(), tp_ctloutput(), tp_usrreq(); +int tp_init(), tp_slowtimo(), tp_drain(); +#endif + +#ifdef EON +int eoninput(), eonctlinput(), eonprotoinit(); +#endif EON + extern struct domain inetdomain; struct protosw inetsw[] = { @@ -74,25 +82,40 @@ struct protosw inetsw[] = { }, { SOCK_RAW, &inetdomain, IPPROTO_RAW, PR_ATOMIC|PR_ADDR, rip_input, rip_output, 0, rip_ctloutput, - raw_usrreq, + rip_usrreq, 0, 0, 0, 0, }, { SOCK_RAW, &inetdomain, IPPROTO_ICMP, PR_ATOMIC|PR_ADDR, icmp_input, rip_output, 0, rip_ctloutput, - raw_usrreq, + rip_usrreq, 0, 0, 0, 0, }, +#ifdef TPIP +{ SOCK_SEQPACKET,&inetdomain, IPPROTO_TP, PR_CONNREQUIRED|PR_WANTRCVD, + tpip_input, 0, tpip_ctlinput, tp_ctloutput, + tp_usrreq, + tp_init, 0, tp_slowtimo, tp_drain, +}, +#endif +/* EON (ISO CLNL over IP) */ +#ifdef EON +{ SOCK_RAW, &inetdomain, IPPROTO_EON, 0, + eoninput, 0, eonctlinput, 0, + 0, + eonprotoinit, 0, 0, 0, +}, +#endif #ifdef NSIP { SOCK_RAW, &inetdomain, IPPROTO_IDP, PR_ATOMIC|PR_ADDR, idpip_input, rip_output, nsip_ctlinput, 0, - raw_usrreq, + rip_usrreq, 0, 0, 0, 0, }, #endif /* raw wildcard */ { SOCK_RAW, &inetdomain, 0, PR_ATOMIC|PR_ADDR, rip_input, rip_output, 0, rip_ctloutput, - raw_usrreq, + rip_usrreq, 0, 0, 0, 0, }, }; @@ -107,7 +130,7 @@ extern struct domain impdomain; struct protosw impsw[] = { { SOCK_RAW, &impdomain, 0, PR_ATOMIC|PR_ADDR, 0, rimp_output, 0, 0, - raw_usrreq, + rip_usrreq, 0, 0, hostslowtimo, 0, }, }; @@ -128,7 +151,7 @@ extern struct domain hydomain; struct protosw hysw[] = { { SOCK_RAW, &hydomain, 0, PR_ATOMIC|PR_ADDR, 0, rhy_output, 0, 0, - raw_usrreq, + rip_usrreq, 0, 0, 0, 0, }, }; diff --git a/usr/src/sys/netinet/in_var.h b/usr/src/sys/netinet/in_var.h index 16cd3a2af9..1edd23086d 100644 --- a/usr/src/sys/netinet/in_var.h +++ b/usr/src/sys/netinet/in_var.h @@ -14,7 +14,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * @(#)in_var.h 7.3 (Berkeley) %G% + * @(#)in_var.h 7.4 (Berkeley) %G% */ /* @@ -25,23 +25,33 @@ */ struct in_ifaddr { struct ifaddr ia_ifa; /* protocol-independent info */ -#define ia_addr ia_ifa.ifa_addr -#define ia_broadaddr ia_ifa.ifa_broadaddr -#define ia_dstaddr ia_ifa.ifa_dstaddr #define ia_ifp ia_ifa.ifa_ifp + /* ia_{,sub}net{,mask} in host order */ u_long ia_net; /* network number of interface */ u_long ia_netmask; /* mask of net part */ u_long ia_subnet; /* subnet number, including net */ - u_long ia_subnetmask; /* mask of net + subnet */ - struct in_addr ia_netbroadcast; /* broadcast addr for (logical) net */ + u_long ia_subnetmask; /* mask of subnet part */ int ia_flags; + struct in_addr ia_netbroadcast; /* to recognize net broadcasts */ struct in_ifaddr *ia_next; /* next in list of internet addresses */ + struct sockaddr_in ia_addr; /* reserve space for interface name */ + struct sockaddr_in ia_dstaddr; /* reserve space for broadcast addr */ +#define ia_broadaddr ia_dstaddr + struct sockaddr_in ia_sockmask; /* reserve space for general netmask */ +}; + +struct in_aliasreq { + char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ + struct sockaddr_in ifra_addr; + struct sockaddr_in ifra_broadaddr; +#define ifra_dstaddr ifra_broadaddr + struct sockaddr_in ifra_mask; }; /* * Given a pointer to an in_ifaddr (ifaddr), * return a pointer to the addr as a sockadd_in. */ -#define IA_SIN(ia) ((struct sockaddr_in *)(&((struct in_ifaddr *)ia)->ia_addr)) +#define IA_SIN(ia) (&(((struct in_ifaddr *)(ia))->ia_addr)) /* * ia_flags */ diff --git a/usr/src/sys/netinet/ip_icmp.c b/usr/src/sys/netinet/ip_icmp.c index d4947e2624..0b09e5125f 100644 --- a/usr/src/sys/netinet/ip_icmp.c +++ b/usr/src/sys/netinet/ip_icmp.c @@ -14,7 +14,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * @(#)ip_icmp.c 7.8.1.2 (Berkeley) %G% + * @(#)ip_icmp.c 7.12 (Berkeley) %G% */ #include "param.h" @@ -73,13 +73,13 @@ icmp_error(n, type, code, dest) * error message, only known informational types. */ if (oip->ip_off &~ (IP_MF|IP_DF)) - goto free; + goto freeit; if (oip->ip_p == IPPROTO_ICMP && type != ICMP_REDIRECT && dtom(oip)->m_len >= oiplen + ICMP_MINLEN && n->m_len >= oiplen + ICMP_MINLEN && !ICMP_INFOTYPE(((struct icmp *)((caddr_t)oip + oiplen))->icmp_type)) { icmpstat.icps_oldicmp++; - goto free; + goto freeit; } /* @@ -87,7 +87,7 @@ icmp_error(n, type, code, dest) */ m = m_gethdr(M_DONTWAIT, MT_HEADER); if (m == NULL) - goto free; + goto freeit; icmplen = oiplen + min(8, oip->ip_len); m->m_len = icmplen + ICMP_MINLEN; MH_ALIGN(m, m->m_len); @@ -127,7 +127,7 @@ icmp_error(n, type, code, dest) nip->ip_p = IPPROTO_ICMP; icmp_reflect(m); -free: +freeit: m_freem(n); } @@ -164,7 +164,7 @@ icmp_input(m, hlen) #endif if (icmplen < ICMP_MINLEN) { icmpstat.icps_tooshort++; - goto free; + goto freeit; } i = hlen + MIN(icmplen, ICMP_ADVLENMIN); if (m->m_len < i && (m = m_pullup(m, i)) == 0) { @@ -177,7 +177,7 @@ icmp_input(m, hlen) icp = mtod(m, struct icmp *); if (in_cksum(m, icmplen)) { icmpstat.icps_checksum++; - goto free; + goto freeit; } m->m_len += hlen; m->m_data -= hlen; @@ -225,7 +225,7 @@ icmp_input(m, hlen) icp->icmp_ip.ip_len = ntohs((u_short)icp->icmp_ip.ip_len); if (icmplen < ICMP_ADVLENMIN || icmplen < ICMP_ADVLEN(icp)) { icmpstat.icps_badlen++; - goto free; + goto freeit; } #ifdef ICMPPRINTFS if (icmpprintfs) @@ -309,7 +309,7 @@ reflect: rtredirect((struct sockaddr *)&icmpsrc, (struct sockaddr *)&icmpdst, (struct sockaddr *)&icmpmask, RTF_GATEWAY, - (struct sockaddr *)&icmpgw); + (struct sockaddr *)&icmpgw, (struct rtentry **)0); icmpsrc.sin_addr = icp->icmp_ip.ip_dst; pfctlinput(PRC_REDIRECT_NET, (struct sockaddr *)&icmpsrc); @@ -318,7 +318,7 @@ reflect: rtredirect((struct sockaddr *)&icmpsrc, (struct sockaddr *)&icmpdst, (struct sockaddr *)0, RTF_GATEWAY | RTF_HOST, - (struct sockaddr *)&icmpgw); + (struct sockaddr *)&icmpgw, (struct rtentry **)0); pfctlinput(PRC_REDIRECT_HOST, (struct sockaddr *)&icmpsrc); } @@ -343,7 +343,7 @@ raw: (struct sockaddr *)&icmpdst); return; -free: +freeit: m_freem(m); } @@ -388,7 +388,7 @@ icmp_reflect(m) u_int len; register u_char *cp; - int opt, cnt, off; + int opt, cnt; u_int len; /* @@ -447,7 +447,7 @@ icmp_reflect(m) m->m_pkthdr.len -= optlen; optlen += sizeof(struct ip); bcopy((caddr_t)ip + optlen, (caddr_t)(ip + 1), - m->m_len - sizeof(struct ip)); + (unsigned)(m->m_len - sizeof(struct ip))); } icmp_send(m, opts);