]> git.ozlabs.org Git - ppp.git/blobdiff - modules/if_ppp.c
let remote_name override name supplied by peer; some minor fixes
[ppp.git] / modules / if_ppp.c
index 7f62b7014e3e3017215ec739308ee8cb7184d29c..2a4dcfc0f42b9f909ce4f16ec232263850e8043a 100644 (file)
@@ -24,7 +24,7 @@
  * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
  * OR MODIFICATIONS.
  *
- * $Id: if_ppp.c,v 1.2 1996/08/28 06:35:11 paulus Exp $
+ * $Id: if_ppp.c,v 1.5 1997/04/30 05:43:54 paulus Exp $
  */
 
 /*
@@ -37,7 +37,6 @@
 
 #include <sys/types.h>
 #include <sys/param.h>
-#include <sys/stream.h>
 #include <sys/errno.h>
 #include <sys/mbuf.h>
 #include <sys/socket.h>
 #include <modules/ppp_mod.h>
 #endif
 
+#include <sys/stream.h>
+
+#ifdef SNIT_SUPPORT
+#include <sys/time.h>
+#include <net/nit_if.h>
+#include <netinet/if_ether.h>
+#endif
+
 #ifdef __osf__
 #define SIOCSIFMTU SIOCSIPMTU
 #define SIOCGIFMTU SIOCRIPMTU
@@ -66,9 +73,6 @@
 
 #define ifr_mtu                ifr_metric
 
-#define PPP_MINMTU     64
-#define PPP_MAXMTU     65536
-
 static int if_ppp_open __P((queue_t *, int, int, int));
 static int if_ppp_close __P((queue_t *, int));
 static int if_ppp_wput __P((queue_t *, mblk_t *));
@@ -112,6 +116,11 @@ static int if_ppp_ioctl __P((struct ifnet *, u_int, caddr_t));
 static struct mbuf *make_mbufs __P((mblk_t *, int));
 static mblk_t *make_message __P((struct mbuf *, int));
 
+#ifdef SNIT_SUPPORT
+/* Fake ether header for SNIT */
+static struct ether_header snit_ehdr = {{0}, {0}, ETHERTYPE_IP};
+#endif
+
 #ifndef __osf__
 static void ppp_if_detach __P((struct ifnet *));
 
@@ -129,8 +138,10 @@ if_ppp_unload()
     for (i = 0; i < ppp_nalloc; ++i)
        if (ifs[i] != 0)
            ppp_if_detach(ifs[i]);
-    FREE(ifs, ppp_nalloc * sizeof (struct ifnet *));
-    FREE(states, ppp_nalloc * sizeof (struct if_ppp_t *));
+    if (ifs) {
+       FREE(ifs, ppp_nalloc * sizeof (struct ifnet *));
+       FREE(states, ppp_nalloc * sizeof (struct if_ppp_t *));
+    }
     ppp_nalloc = 0;
     return 0;
 }
@@ -259,8 +270,10 @@ if_ppp_wput(q, mp)
                bzero(newstates, newn * sizeof (struct if_ppp_t *));
                bcopy(ifs, newifs, ppp_nalloc * sizeof(struct ifnet *));
                bcopy(states, newstates, ppp_nalloc * sizeof(if_ppp_t *));
-               FREE(ifs, ppp_nalloc * sizeof(struct ifnet *));
-               FREE(states, ppp_nalloc * sizeof(if_ppp_t *));
+               if (ifs) {
+                   FREE(ifs, ppp_nalloc * sizeof(struct ifnet *));
+                   FREE(states, ppp_nalloc * sizeof(if_ppp_t *));
+               }
                ifs = newifs;
                states = newstates;
                ppp_nalloc = newn;
@@ -276,7 +289,7 @@ if_ppp_wput(q, mp)
                ifs[unit] = ifp;
                ifp->if_name = "ppp";
                ifp->if_unit = unit;
-               ifp->if_mtu = PPP_MRU;
+               ifp->if_mtu = PPP_MTU;
                ifp->if_flags = IFF_POINTOPOINT | IFF_RUNNING;
 #ifdef IFF_MULTICAST
                ifp->if_flags |= IFF_MULTICAST;
@@ -284,10 +297,14 @@ if_ppp_wput(q, mp)
                ifp->if_output = if_ppp_output;
 #ifdef __osf__
                ifp->if_version = "Point-to-Point Protocol, version 2.3";
-               ifp->if_mediamtu = 1500;
+               ifp->if_mediamtu = PPP_MTU;
                ifp->if_type = IFT_PPP;
                ifp->if_hdrlen = PPP_HDRLEN;
                ifp->if_addrlen = 0;
+               ifp->if_flags |= IFF_NOARP | IFF_SIMPLEX | IFF_NOTRAILERS;
+#ifdef IFF_VAR_MTU
+               ifp->if_flags |= IFF_VAR_MTU;
+#endif
 #ifdef NETMASTERCPU
                ifp->if_affinity = NETMASTERCPU;
 #endif
@@ -298,7 +315,7 @@ if_ppp_wput(q, mp)
                if (sp->flags & DBGLOG)
                    printf("if_ppp: created unit %d\n", unit);
            } else {
-               ifp->if_mtu = PPP_MRU;
+               ifp->if_mtu = PPP_MTU;
                ifp->if_flags |= IFF_RUNNING;
            }
 
@@ -405,10 +422,23 @@ if_ppp_rput(q, mp)
            break;
        }
 
-/* For Digital UNIX, there's space set aside in the header mbuf
+#ifdef SNIT_SUPPORT
+       if (proto == PPP_IP && (ifp->if_flags & IFF_PROMISC)) {
+           struct nit_if nif;
+
+           nif.nif_header = (caddr_t) &snit_ehdr;
+           nif.nif_hdrlen = sizeof(snit_ehdr);
+           nif.nif_bodylen = len;
+           nif.nif_promisc = 0;
+           snit_intr(ifp, mb, &nif);
+       }
+#endif
+
+/*
+ * For Digital UNIX, there's space set aside in the header mbuf
  * for the interface info.
  *
- * For Sun it's smuggled around via a pointer at the front of the mbuf
+ * For Sun it's smuggled around via a pointer at the front of the mbuf.
  */
 #ifdef __osf__
         mb->m_pkthdr.rcvif = ifp;
@@ -498,7 +528,23 @@ if_ppp_output(ifp, m0, dst)
     switch (dst->sa_family) {
     case AF_INET:
        proto = PPP_IP;
+#ifdef SNIT_SUPPORT
+       if (ifp->if_flags & IFF_PROMISC) {
+           struct nit_if nif;
+           struct mbuf *m;
+           int len;
+
+           for (len = 0, m = m0; m != NULL; m = m->m_next)
+               len += m->m_len;
+           nif.nif_header = (caddr_t) &snit_ehdr;
+           nif.nif_hdrlen = sizeof(snit_ehdr);
+           nif.nif_bodylen = len;
+           nif.nif_promisc = 0;
+           snit_intr(ifp, m0, &nif);
+       }
+#endif
        break;
+
     default:
        m_freem(m0);
        return EAFNOSUPPORT;
@@ -724,10 +770,14 @@ make_message(m, off)
     }
 }
 
-/* Digital UNIX doesn't allow for removing ifnet structures
- * from the list.  Taking the i/f down from pppd will take
- * care of most of the stuff that this code intends to do
- * anyhow
+/*
+ * Digital UNIX doesn't allow for removing ifnet structures
+ * from the list.  But then we're not using this as a loadable
+ * module anyway, so that's OK.
+ *
+ * Under SunOS, this should allow the module to be unloaded.
+ * Unfortunately, it doesn't seem to detach all the references,
+ * so your system may well crash after you unload this module :-(
  */
 #ifndef __osf__