Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 16 Aug 2008 04:27:46 GMT
From:      Ryan French <rfrench@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 147507 for review
Message-ID:  <200808160427.m7G4RkAa017400@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=147507

Change 147507 by rfrench@rfrench_mpls on 2008/08/16 04:27:26

	Pretty much too many changes to list. I have been working very hard on trying to get sending and receiving working before the end of the summer of code on Monday, but it still isnt quite working.

Affected files ...

.. //depot/projects/soc2008/rfrench_mpls/mpls-needle/readme.txt#1 add
.. //depot/projects/soc2008/rfrench_mpls/net/if_ethersubr.c#4 edit
.. //depot/projects/soc2008/rfrench_mpls/net/netisr.h#3 edit
.. //depot/projects/soc2008/rfrench_mpls/netmpls/mpls.h#3 edit
.. //depot/projects/soc2008/rfrench_mpls/netmpls/mpls_input.c#3 edit
.. //depot/projects/soc2008/rfrench_mpls/netmpls/mpls_proto.c#3 edit
.. //depot/projects/soc2008/rfrench_mpls/netmpls/mpls_raw.c#3 edit

Differences ...

==== //depot/projects/soc2008/rfrench_mpls/net/if_ethersubr.c#4 (text+ko) ====

@@ -832,9 +832,9 @@
 		}
 		/* XXX handling for simplex devices in case of M/BCAST ?? */
 		if (m->m_flags && (M_BCAST | M_MCAST))
-			etype = htons(ETHERTYPE_MPLS_MCAST);
+			isr = NETISR_MPLS_MCAST;
 		else
-			etype = htons(ETHERTYPE_MPLS);
+			isr = NETISR_MPLS;
 		break;
 #endif /* MPLS */
 	default:

==== //depot/projects/soc2008/rfrench_mpls/net/netisr.h#3 (text+ko) ====

@@ -51,6 +51,7 @@
 #define	NETISR_POLL	0		/* polling callback, must be first */
 #define	NETISR_IP	2		/* same as AF_INET */
 #define NETISR_MPLS	4		/* mpls packet */
+#define NETISR_MPLS_MCAST	/* mpls multicase packet */
 #define	NETISR_ROUTE	14		/* routing socket */
 #define	NETISR_AARP	15		/* Appletalk ARP */
 #define	NETISR_ATALK2	16		/* Appletalk phase 2 */

==== //depot/projects/soc2008/rfrench_mpls/netmpls/mpls.h#3 (text+ko) ====

@@ -92,11 +92,11 @@
         u_int16_t        smpls_out_ifindex;
         u_int16_t        smpls_in_ifindex;
         u_int32_t        smpls_in_label;                /* MPLS label 20 bits*/
-#if MPLS_MCAST
-        u_int8_t smpls_mcexp;
-        u_int8_t smpls_pad2[2];
-        u_int32_t smpls_mclabel;
-#endif
+//#if MPLS_MCAST
+//        u_int8_t smpls_mcexp;
+//        u_int8_t smpls_pad2[2];
+//        u_int32_t smpls_mclabel;
+//#endif
 };
 
 #define MPLS_OP_POP             1
@@ -112,9 +112,9 @@
  * Names for MPLS sysctl objects
  */
 #define MPLSCTL_ENABLE                  1
-#define MPLSCTL_DEFTTL                        2
+#define MPLSCTL_DEFTTL                  2
 #define MPLSCTL_IFQUEUE                 3
-#define MPLSCTL_MAXINKLOOP                4
+#define MPLSCTL_MAXINKLOOP              4
 #define MPLSCTL_MAXID                   5
 
 #define MPLSCTL_NAMES { \
@@ -152,8 +152,7 @@
 void    mpe_input(struct mbuf *, struct ifnet *, struct sockaddr_mpls *,
             u_int32_t);
 
-extern int mpls_raw_usrreq(struct socket *, int, struct mbuf *,
-                        struct mbuf *, struct mbuf *, struct proc *);
+// extern struct pr_usrreqs mpls_raw_usrreq;
 
 extern struct ifqueue   mplsintrq;        /* MPLS input queue */
 extern int              mplsqmaxlen;        /* MPLS input queue length */

==== //depot/projects/soc2008/rfrench_mpls/netmpls/mpls_input.c#3 (text+ko) ====

@@ -15,8 +15,6 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include "mpe.h"
-
 #include <sys/param.h>
 #include <sys/mbuf.h>
 #include <sys/systm.h>
@@ -24,6 +22,7 @@
 
 #include <net/if.h>
 #include <net/if_types.h>
+#include <net/netisr.h>
 #include <net/route.h>
 
 #include <netmpls/mpls.h>
@@ -41,6 +40,8 @@
 mpls_init(void)
 {
         mplsintrq.ifq_maxlen = mplsqmaxlen;
+        netisr_register(NETISR_MPLS, mpls_input, &mplsintrq, 0);
+        printf("mpls initialised");
 }
 
 void
@@ -68,7 +69,7 @@
 mpls_input(struct mbuf *m)
 {
         struct ifnet *ifp = m->m_pkthdr.rcvif;
-        struct sockaddr_mpls *smpls;
+        struct sockaddr_mpls *smpls = NULL;
         struct sockaddr_mpls sa_mpls;
         struct shim_hdr *shim;
         struct rtentry *rt = NULL;
@@ -115,7 +116,7 @@
         for (i = 0; i < mpls_inkloop; i++) {
                 bzero(&sa_mpls, sizeof(sa_mpls));
                 smpls = &sa_mpls;
-                smpls->smpls_family = AF_MPLS;
+                smpls->smpls_family = NETISR_MPLS;
                 smpls->smpls_len = sizeof(*smpls);
                 smpls->smpls_in_ifindex = ifp->if_index;
                 smpls->smpls_in_label = shim->shim_label & MPLS_LABEL_MASK;
@@ -156,12 +157,12 @@
                         hasbos = MPLS_BOS_ISSET(shim->shim_label);
                         m = mpls_shim_pop(m);
                         if (hasbos) {
-#if NMPE > 0
-                                if (rt->rt_ifp->if_type == IFT_MPLS) {
-                                        mpe_input(m, rt->rt_ifp, smpls, ttl);
-                                        goto done;
-                                }
-#endif
+// #if NMPE > 0
+//                                 if (rt->rt_ifp->if_type == IFT_MPLS) {
+//                                         mpe_input(m, rt->rt_ifp, smpls, ttl);
+//                                         goto done;
+//                                 }
+// #endif
                                 /* last label but we have no clue so drop */
                                 m_freem(m);
                                 goto done;

==== //depot/projects/soc2008/rfrench_mpls/netmpls/mpls_proto.c#3 (text+ko) ====

@@ -27,15 +27,20 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
+ 
+#include <sys/cdefs.h>
 
 #include <sys/param.h>
+#include <sys/kernel.h>
 #include <sys/socket.h>
+#include <sys/domain.h>
 #include <sys/protosw.h>
-#include <sys/domain.h>
-#include <sys/mbuf.h>
+#include <sys/queue.h>
+#include <sys/sysctl.h>
 
 #include <net/if.h>
 #include <net/route.h>
+#include <net/netisr.h>
 
 #include <netmpls/mpls.h>
 
@@ -43,29 +48,35 @@
  * MPLS protocol family:
  */
 
-extern	struct domain mplsdomain;
+extern struct domain mplsdomain;
+extern struct pr_usrreqs mpls_raw_usrreq;
 
 struct protosw mplssw[] = {
-{ 0,			&mplsdomain,	0,			0,
-  0,			0,				0,			0,
-  0,
-  mpls_init,	0,				0,			0,			mpls_sysctl
-},
-{ SOCK_DGRAM,	&mplsdomain,	0,			PR_ATOMIC|PR_ADDR,
-  0,			0,				0,			0,
-  mpls_raw_usrreq,
-  0,			0,				0,			0,			mpls_sysctl,
-},
+	{ 
+		.pr_type = 		0,
+		.pr_domain =	&mplsdomain,
+		.pr_init =		mpls_init/*,
+		.pr_sysctl = 	mpls_sysctl*/
+	},
+	{ 
+		.pr_type = 		SOCK_DGRAM,
+		.pr_domain =	&mplsdomain,
+		.pr_flags =		PR_ATOMIC | PR_ADDR,
+		.pr_usrreqs =	&mpls_raw_usrreq/*,
+		.pr_sysctl = 	mpls_sysctl*/
+	},
 /* raw wildcard */
-{ SOCK_RAW,		&mplsdomain,	0,			PR_ATOMIC|PR_ADDR,
-  0,			0,				0,			0,
-  mpls_raw_usrreq,
-  0,			0,				0,			0,			mpls_sysctl,
-},
+	{ 
+		.pr_type = 		SOCK_RAW,
+		.pr_domain =	&mplsdomain,
+		.pr_flags =		PR_ATOMIC | PR_ADDR,
+		.pr_usrreqs =	&mpls_raw_usrreq/*,
+		.pr_sysctl = 	mpls_sysctl*/
+	},
 };
 
 struct domain mplsdomain = {
-	AF_MPLS, "mpls", mpls_init, 0, 0, 
+	NETISR_MPLS, "mpls", mpls_init, 0, 0, 
 	mplssw,
 	&mplssw[sizeof(mplssw)/sizeof(mplssw[0])], 0,
 	rn_inithead,

==== //depot/projects/soc2008/rfrench_mpls/netmpls/mpls_raw.c#3 (text+ko) ====

@@ -62,7 +62,8 @@
 
 int *mplsctl_vars[MPLSCTL_MAXID] = MPLSCTL_VARS;
 
-int     mpls_control(struct socket *, u_long, caddr_t, struct ifnet *);
+int     mpls_control(struct socket *, u_long, caddr_t, struct ifnet *, struct thread *);
+static int     mpls_attach(struct socket *);
 
 /*
  * Generic MPLS control operations (ioctl's).
@@ -70,76 +71,109 @@
  */
 /* ARGSUSED */
 int
-mpls_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp)
+mpls_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *mthread)
 {
         return (EOPNOTSUPP);
 }
 
-int
-mpls_raw_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
-    struct mbuf *control, struct proc *p)
+static int
+mpls_attach(struct socket *so)
 {
-        int error = 0;
-
-#ifdef MPLS_DEBUG
-        printf("mpls_raw_usrreq: called! (reqid=%d).\n", req);
-#endif  /* MPLS_DEBUG */
-
-        if (req == PRU_CONTROL)
-                return (mpls_control(so, (u_long)m, (caddr_t)nam,
-                    (struct ifnet *)control));
-
-        switch (req) {
-        case PRU_ATTACH:
-                if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) {
-                        error = soreserve(so, mpls_raw_sendspace,
-                                mpls_raw_recvspace);
-                        if (error)
-                                break;
-                }
-                break;
-
-        case PRU_DETACH:
-        case PRU_BIND:
-        case PRU_LISTEN:
-        case PRU_CONNECT:
-        case PRU_CONNECT2:
-        case PRU_DISCONNECT:
-        case PRU_SHUTDOWN:
-        case PRU_RCVD:
-        case PRU_SEND:
-        case PRU_SENSE:
-        case PRU_RCVOOB:
-        case PRU_SENDOOB:
-        case PRU_SOCKADDR:
-        case PRU_PEERADDR:
-                error = EOPNOTSUPP;
-                break;
-
-        default:
-                panic("rip_usrreq");
-        }
-
-        return (error);
+	int error = 0;
+	if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) {
+		error = soreserve(so, mpls_raw_sendspace, mpls_raw_recvspace);
+		return error;
+	}
+    else return EOPNOTSUPP;
 }
 
-int
-mpls_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
-    size_t newlen)
-{
-        if (name[0] >= MPLSCTL_MAXID)
-                return EOPNOTSUPP;
+struct
+pr_usrreqs mpls_raw_usrreq = {
+	.pru_accept = pru_accept_notsupp,
+	.pru_attach = mpls_attach,
+	.pru_bind = pru_bind_notsupp,
+	.pru_connect = pru_connect_notsupp,
+	.pru_connect2 = pru_connect2_notsupp,
+	.pru_control = mpls_control,
+	.pru_disconnect = pru_disconnect_notsupp,
+	.pru_listen = pru_listen_notsupp,
+	.pru_peeraddr = pru_peeraddr_notsupp,
+	.pru_rcvd = pru_rcvd_notsupp,
+	.pru_rcvoob = pru_rcvoob_notsupp,
+	.pru_send = pru_send_notsupp,
+	.pru_sense = pru_sense_null,
+	.pru_shutdown = pru_shutdown_notsupp,
+	.pru_sockaddr = pru_sockaddr_notsupp,
+	.pru_sosend = pru_sosend_notsupp,
+	.pru_soreceive = pru_soreceive_notsupp,
+	.pru_sopoll = pru_sopoll_notsupp
+};
 
-        /* Almost all sysctl names at this level are terminal. */
-        if (namelen != 1 && name[0] != MPLSCTL_IFQUEUE)
-                return (ENOTDIR);
+// int
+// mpls_raw_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
+//     struct mbuf *control, struct proc *p)
+// {
+//         int error = 0;
+// 
+// #ifdef MPLS_DEBUG
+//         printf("mpls_raw_usrreq: called! (reqid=%d).\n", req);
+// #endif  /* MPLS_DEBUG */
+// 
+//         if (req == PRU_CONTROL)
+//                 return (mpls_control(so, (u_long)m, (caddr_t)nam,
+//                     (struct ifnet *)control));
+// 
+//         switch (req) {
+//         case PRU_ATTACH:
+//                 if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) {
+//                         error = soreserve(so, mpls_raw_sendspace,
+//                                 mpls_raw_recvspace);
+//                         if (error)
+//                                 break;
+//                 }
+//                 break;
+// 
+//         case PRU_DETACH:
+//         case PRU_BIND:
+//         case PRU_LISTEN:
+//         case PRU_CONNECT:
+//         case PRU_CONNECT2:
+//         case PRU_DISCONNECT:
+//         case PRU_SHUTDOWN:
+//         case PRU_RCVD:
+//         case PRU_SEND:
+//         case PRU_SENSE:
+//         case PRU_RCVOOB:
+//         case PRU_SENDOOB:
+//         case PRU_SOCKADDR:
+//         case PRU_PEERADDR:
+//                 error = EOPNOTSUPP;
+//                 break;
+// 
+//         default:
+//                 panic("rip_usrreq");
+//         }
+// 
+//         return (error);
+// }
 
-        switch (name[0]) {
-        case MPLSCTL_IFQUEUE:
-                return (sysctl_ifq(name + 1, namelen - 1,
-                    oldp, oldlenp, newp, newlen, &mplsintrq));
-        default:
-                return sysctl_int_arr(mplsctl_vars, name, namelen,
-                    oldp, oldlenp, newp, newlen);
-        }
-}
+// int
+// mpls_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
+//     size_t newlen)
+// {
+//         if (name[0] >= MPLSCTL_MAXID)
+//                 return EOPNOTSUPP;
+// 
+//         /* Almost all sysctl names at this level are terminal. */
+//         if (namelen != 1 && name[0] != MPLSCTL_IFQUEUE)
+//                 return (ENOTDIR);
+// 
+//         switch (name[0]) {
+//         case MPLSCTL_IFQUEUE:
+//                 return (sysctl_ifq(name + 1, namelen - 1,
+//                     oldp, oldlenp, newp, newlen, &mplsintrq));
+//         default:
+//                 return sysctl_int_arr(mplsctl_vars, name, namelen,
+//                     oldp, oldlenp, newp, newlen);
+//         }
+// }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200808160427.m7G4RkAa017400>