From owner-p4-projects@FreeBSD.ORG Sat Aug 16 04:27:47 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 631B01065676; Sat, 16 Aug 2008 04:27:47 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 191401065675 for ; Sat, 16 Aug 2008 04:27:47 +0000 (UTC) (envelope-from rfrench@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 0A5EB8FC17 for ; Sat, 16 Aug 2008 04:27:47 +0000 (UTC) (envelope-from rfrench@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.2/8.14.2) with ESMTP id m7G4RkKE017402 for ; Sat, 16 Aug 2008 04:27:46 GMT (envelope-from rfrench@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.2/8.14.1/Submit) id m7G4RkAa017400 for perforce@freebsd.org; Sat, 16 Aug 2008 04:27:46 GMT (envelope-from rfrench@FreeBSD.org) Date: Sat, 16 Aug 2008 04:27:46 GMT Message-Id: <200808160427.m7G4RkAa017400@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to rfrench@FreeBSD.org using -f From: Ryan French To: Perforce Change Reviews Cc: Subject: PERFORCE change 147507 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 16 Aug 2008 04:27:47 -0000 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 #include #include @@ -24,6 +22,7 @@ #include #include +#include #include #include @@ -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 #include +#include #include +#include #include -#include -#include +#include +#include #include #include +#include #include @@ -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); +// } +// }