diff -ur --unidirectional-new-file skipsrc-1.0.orig/skip/freebsd/skip_es.c work.new/skip/freebsd/skip_es.c --- skipsrc-1.0.orig/skip/freebsd/skip_es.c Fri Oct 25 13:12:42 1996 +++ work.new/skip/freebsd/skip_es.c Tue Feb 1 10:07:11 2000 @@ -63,6 +63,10 @@ #include #include +#if __FreeBSD_version >= 400013 +#include +#endif + /* * global SKIP interface information */ @@ -73,14 +77,24 @@ int skip_alignment = 4; /* 32 bit */ static unsigned int inetsw_size = 0; +#if __FreeBSD_version < 400013 static struct protosw *inetsw_default; extern struct protosw inetsw[]; +#else +static struct ipprotosw *inetsw_default; +extern struct ipprotosw inetsw[]; +#endif skip_es_t *skip_es_ifs = NULL; static int skip_inited = 0; static unsigned short skip_pktid; static skip_softc_t skip_softc[SKIP_MAX_OPENS]; +static struct callout_handle + skip_timeout_handle = CALLOUT_HANDLE_INITIALIZER(&skip_timeout_handle); + +MALLOC_DEFINE(M_SKIP, "skip", "SKIP control structures and buffers"); + /* * statistics */ @@ -116,11 +130,13 @@ static int skip_ifoutput(struct ifnet *, struct mbuf *, struct sockaddr *, struct rtentry *rtp); static int skip_ifinput(struct mbuf *, int); -static void skip_inittimers(); -static void skip_uninittimers(); -static void skip_timer(); +static void skip_inittimers(void); +static void skip_uninittimers(void); +static void skip_timer(void *); static int skip_add_interface(char *); static int skip_del_interface(char *); +static void skip_ifwakeup(skip_softc_t *); +static int skip_bufextend(struct mbuf *, int); static void skip_encrypt_done(void *, struct mbuf *, struct mbuf *, void *, skip_arg_t *); @@ -136,14 +152,14 @@ /* * From Crypt/MAC system... */ -extern int skip_es_bypass_init(); -extern void skip_es_bypass_uninit(); -extern void skip_key_initstore(); -extern void skip_key_uninitstore(); -extern void skip_key_initcryptors(); -extern void skip_key_uninitcryptors(); -extern void skip_mac_init(); -extern void skip_mac_uninit(); +extern int skip_es_bypass_init(void); +extern void skip_es_bypass_uninit(void); +extern void skip_key_initstore(void); +extern void skip_key_uninitstore(void); +extern void skip_key_initcryptors(void); +extern void skip_key_uninitcryptors(void); +extern void skip_mac_init(void); +extern void skip_mac_uninit(void); extern int skip_fmt_kmgr(union skip_messages *, skip_keycb_t *); extern struct cdevsw skipdevsw; @@ -157,7 +173,7 @@ * Returns: 0 on success, errno otherwise. */ int -skip_init() +skip_init(void) { register int s, rc; register struct protosw *pr; @@ -252,7 +268,10 @@ for (pr = inetdomain.dom_protosw; pr < inetdomain.dom_protoswNPROTOSW; pr++) { - pr->pr_input = skip_ifinput; + if (pr->pr_protocol == IPPROTO_DIVERT) + continue; + pr->pr_input = + (void (*)(struct mbuf *, int)) skip_ifinput; } splx(s); } @@ -266,7 +285,7 @@ * Returns: 0 on success, errno otherwise. */ int -skip_uninit() +skip_uninit(void) { register int s; if (skip_busy || skip_keys_stats.skip_encrypt_keys_active @@ -319,7 +338,11 @@ major(dev), flags); #endif +#if __FreeBSD_version < 400005 if (suser(p->p_ucred, &p->p_acflag )) { +#else + if (suser(p)) { +#endif return (EPERM); } if (minor(dev) >= SKIP_MAX_OPENS) { @@ -422,27 +445,30 @@ * Returns: 0 if no data available, 1 otherwise */ int -skip_ifselect(dev, rw, p) +skip_ifpoll(dev, events, p) dev_t dev; - int rw; + int events; struct proc *p; { register skip_softc_t *sp = &skip_softc[minor(dev)]; register int s; + int revents = 0; - if (rw == FWRITE) { - return (1); - } + /* Check readable */ s = splimp(); - if (sp->q.ifq_len > 0) { - splx(s); - return (1); + if (events & (POLLIN | POLLRDNORM)) { + if (sp->q.ifq_len > 0) + revents |= (events & (POLLIN | POLLRDNORM)); + else + selrecord(p, &sp->sp_si); } - selrecord(p, &sp->sp_si); + /* Always writable */ + if (events & (POLLOUT | POLLWRNORM)) + revents |= (events & (POLLOUT | POLLWRNORM)); splx(s); - return(0); + return(revents); } /* skip_ifread() @@ -786,9 +812,9 @@ * Returns: None */ static void -skip_inittimers() +skip_inittimers(void) { - timeout(skip_timer, NULL, skip_key_tick * hz); + skip_timeout_handle = timeout(skip_timer, NULL, skip_key_tick * hz); } /* skip_uninittimers() @@ -798,9 +824,10 @@ * Returns: None */ static void -skip_uninittimers() +skip_uninittimers(void) { - untimeout(skip_timer, NULL); + untimeout(skip_timer, NULL, skip_timeout_handle); + callout_handle_init(&skip_timeout_handle); } /* skip_timer() @@ -812,14 +839,13 @@ */ /*ARGSUSED*/ static void -skip_timer(arg) - caddr_t arg; +skip_timer(void *arg) { /* * run through the key store */ skip_key_iterate(skip_key_check, NULL); - timeout(skip_timer, NULL, skip_key_tick * hz); + skip_timeout_handle = timeout(skip_timer, NULL, skip_key_tick * hz); } #ifdef notdef @@ -846,6 +872,7 @@ } #endif +#ifdef notdef void skip_dump_buf(char *what, unsigned char *p, int len) { @@ -857,7 +884,9 @@ } printf("].\n"); } +#endif +#ifdef notdef void skip_dump_ip(struct ip *ip) { @@ -878,6 +907,7 @@ ip->ip_ttl, ip->ip_p, ntohs(ip->ip_sum)); } +#endif /* * SKIP Ioctl and Interface management routines @@ -1107,7 +1137,7 @@ int skip_ifioctl(dev, cmd, data, fflag, p) dev_t dev; - int cmd; + u_long cmd; caddr_t data; int fflag; struct proc *p; @@ -1390,7 +1420,6 @@ skip_es_t *skip_if; int iphlen, hdrlen = 0; struct mbuf *decryptbuf = NULL; - extern u_char ip_protox[]; skip_param_t params; skip_hdr_t skip_hdr; skip_es_hash_t *entry, **acl; @@ -1408,7 +1436,7 @@ panic("skip_ifinput: mtod returned NULL!"); } - if (!SKIP_IF(ifp)) { + if (!ifp || !SKIP_IF(ifp)) { /* * SKIP not present on this interface, pass the packet */ @@ -1718,7 +1747,7 @@ */ decryptbuf->m_data += iphlen; - SKIP_DEBUG2("skip_ifinput: decryptbuf m_len=%d m_data=%d\n", + SKIP_DEBUG2("skip_ifinput: decryptbuf m_len=%d m_data=%p\n", decryptbuf->m_len, decryptbuf->m_data); } @@ -1745,8 +1774,12 @@ ip->ip_id = ntohs(ip->ip_id); ip->ip_off = ntohs(ip->ip_off); pass: - m->m_flags &= ~ M_EOR; + m->m_flags &= ~ M_PROTO1; +#if __FreeBSD_version < 400013 (*inetsw_default[ip_protox[ip->ip_p]].pr_input)(m, hlen); +#else + (*inetsw_default[ip_protox[ip->ip_p]].pr_input)(m, hlen, ip->ip_p); +#endif return (0); } @@ -1910,6 +1943,13 @@ */ IPADDRCOPY(¶ms.tunnel_addr, &newip->ip_dst); + /* + * insert different source address if specified + */ + + if(params.source != 0) + (&newip->ip_src)->s_addr = params.source; + encryptbuf->m_len += sizeof (struct ip); /* @@ -2005,7 +2045,7 @@ if (params.kp_alg) { newip->ip_p = SKIP_NEXT_ESP; } else { - newip->ip_p = IPPROTO_ENCAP; + newip->ip_p = IPPROTO_IPIP; } } skip_if->stats.skip_if_raw_out++; @@ -2028,6 +2068,13 @@ * insert tunnel address as destination */ IPADDRCOPY(¶ms.tunnel_addr, &newip->ip_dst); + + /* + * insert different source address if specified + */ + + if(params.source != 0) + (&newip->ip_src)->s_addr = params.source; } if (params.s_nsid == 0) { @@ -2097,7 +2144,7 @@ register skip_param_t *params = &res->params; register struct ip *ip = mtod(original, struct ip *); int rc, s, iphlen; - struct mbuf *outbuf, *new_hdr; + struct mbuf *outbuf; SKIP_PRINT("skip_decrypt_done", params); @@ -2125,7 +2172,7 @@ */ outbuf = (res->modes & SKIP_CRYPT_ON) ? m : original; - if (res->proto != IPPROTO_ENCAP) { + if (res->proto != IPPROTO_IPIP) { /* * transport mode, need to copy original IP header */ @@ -2195,7 +2242,7 @@ /* * tag the start of the header buffer so SKIP can recognise it */ - outbuf->m_flags |= M_EOR | M_PKTHDR; + outbuf->m_flags |= M_PROTO1 | M_PKTHDR; s = splimp(); if (IF_QFULL(&ipintrq)) { @@ -2240,7 +2287,8 @@ unsigned short len; struct ip *hptr; struct rtentry *rtp; + struct mbuf *n; /* * recover the route pointer */ @@ -2263,6 +2311,9 @@ hptr->ip_len = htons(len); /* total length */ skip_ipsum(hptr); + + for (m->m_pkthdr.len = 0, n = m; n != NULL; n = n->m_next) + m->m_pkthdr.len += n->m_len; (*skip_if->if_output)(skip_if->ifp, m, dst, rtp); RTFREE(rtp);