All of lore.kernel.org
 help / color / mirror / Atom feed
From: "James R. Leu" <jleu@mindspring.com>
To: linux-ppp@vger.kernel.org
Subject: [PATCH] MPLSCP
Date: Tue, 25 Jan 2005 04:28:05 +0000	[thread overview]
Message-ID: <20050125042805.GC13927@mindspring.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 323 bytes --]

Hello,

I have been maintaining a patch to pppd since 2001.  The patch was originally
written by <Serge.Krier@advalvas.be> for use with my mpls-linux project.
(http://mpls-linux.sf.net/) The patch adds MPLSCP to the pppd daemon.

Please consider accepting this patch.

(patch attached)
-- 
James R. Leu
jleu@mindspring.com

[-- Attachment #2: ppp-2.4.2-mpls.patch --]
[-- Type: text/plain, Size: 10370 bytes --]

diff -uNr ppp/pppd/main.c ppp-mpls/pppd/main.c
--- ppp/pppd/main.c	2005-01-24 21:02:51.659741400 -0600
+++ ppp-mpls/pppd/main.c	2005-01-24 21:09:10.904087496 -0600
@@ -70,6 +70,9 @@
 #include "fsm.h"
 #include "lcp.h"
 #include "ipcp.h"
+
+#include "mplscp.h"
+
 #ifdef INET6
 #include "ipv6cp.h"
 #endif
@@ -246,6 +249,7 @@
     &cbcp_protent,
 #endif
     &ipcp_protent,
+    &mplscp_protent,
 #ifdef INET6
     &ipv6cp_protent,
 #endif
diff -uNr ppp/pppd/Makefile.linux ppp-mpls/pppd/Makefile.linux
--- ppp/pppd/Makefile.linux	2005-01-24 21:02:51.661741096 -0600
+++ ppp-mpls/pppd/Makefile.linux	2005-01-24 21:09:10.185196784 -0600
@@ -13,16 +13,16 @@
 
 PPPDSRCS = main.c magic.c fsm.c lcp.c ipcp.c upap.c chap-new.c md5.c ccp.c \
 	   ecp.c ipxcp.c auth.c options.c sys-linux.c md4.c chap_ms.c \
-	   demand.c utils.c tty.c eap.c chap-md5.c
+	   demand.c utils.c tty.c eap.c chap-md5.c mplscp.c
 
 HEADERS = ccp.h chap-new.h ecp.h fsm.h ipcp.h \
 	ipxcp.h lcp.h magic.h md5.h patchlevel.h pathnames.h pppd.h \
-	upap.h eap.h
+	upap.h eap.h mplscp.h
 
 MANPAGES = pppd.8
 PPPDOBJS = main.o magic.o fsm.o lcp.o ipcp.o upap.o chap-new.o md5.o ccp.o \
 	   ecp.o auth.o options.o demand.o utils.o sys-linux.o ipxcp.o tty.o \
-	   eap.o chap-md5.o
+	   eap.o chap-md5.o mplscp.o
 
 #
 # include dependencies if present
diff -uNr ppp/pppd/mplscp.c ppp-mpls/pppd/mplscp.c
--- ppp/pppd/mplscp.c	1969-12-31 18:00:00.000000000 -0600
+++ ppp-mpls/pppd/mplscp.c	2004-07-13 22:46:26.000000000 -0500
@@ -0,0 +1,371 @@
+
+/* MPLSCP - Serge.Krier@advalvas.be (C) 2001 */
+
+#include <stdio.h>
+#include <string.h>
+#include <netdb.h>
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "pppd.h"
+#include "fsm.h"
+#include "mplscp.h"
+
+
+/* local vars */
+/* static int mplscp_is_up; */                  /* have called np_up() */
+
+/*
+ * Callbacks for fsm code.  (CI = Configuration Information)
+ */
+static void mplscp_resetci __P((fsm *));	/* Reset our CI */
+static int  mplscp_cilen __P((fsm *));	        /* Return length of our CI */
+static void mplscp_addci __P((fsm *, u_char *, int *)); /* Add our CI */
+static int  mplscp_ackci __P((fsm *, u_char *, int));	/* Peer ack'd our CI */
+static int  mplscp_nakci __P((fsm *, u_char *, int));	/* Peer nak'd our CI */
+static int  mplscp_rejci __P((fsm *, u_char *, int));	/* Peer rej'd our CI */
+static int  mplscp_reqci __P((fsm *, u_char *, int *, int)); /* Rcv CI */
+static void mplscp_up __P((fsm *));		/* We're UP */
+static void mplscp_down __P((fsm *));		/* We're DOWN */
+static void mplscp_finished __P((fsm *));	/* Don't need lower layer */
+
+fsm mplscp_fsm[NUM_PPP];		/* MPLSCP fsm structure */
+
+static fsm_callbacks mplscp_callbacks = { /* MPLSCP callback routines */
+  mplscp_resetci,		/* Reset our Configuration Information */
+  mplscp_cilen,			/* Length of our Configuration Information */
+  mplscp_addci,			/* Add our Configuration Information */
+  mplscp_ackci,			/* ACK our Configuration Information */
+  mplscp_nakci,			/* NAK our Configuration Information */
+  mplscp_rejci,			/* Reject our Configuration Information */
+  mplscp_reqci,			/* Request peer's Configuration Information */
+  mplscp_up,			/* Called when fsm reaches OPENED state */
+  mplscp_down,			/* Called when fsm leaves OPENED state */
+  NULL,			        /* Called when we want the lower layer up */
+  mplscp_finished,		/* Called when we want the lower layer down */
+  NULL,			        /* Called when Protocol-Reject received */
+  NULL,			        /* Retransmission is necessary */
+  NULL,			        /* Called to handle protocol-specific codes */
+  "MPLSCP"			/* String name of protocol */
+};
+
+static option_t mplscp_option_list[] = {
+    { "mpls", o_bool, &mplscp_protent.enabled_flag,
+      "Enable MPLSCP (and MPLS)", 1 },
+    { NULL } };
+
+/*
+ * Protocol entry points from main code.
+ */
+
+static void mplscp_init __P((int));
+static void mplscp_open __P((int));
+static void mplscp_close __P((int, char *));
+static void mplscp_lowerup __P((int));
+static void mplscp_lowerdown __P((int));
+static void mplscp_input __P((int, u_char *, int));
+static void mplscp_protrej __P((int));
+static int  mplscp_printpkt __P((u_char *, int,
+				 void (*) __P((void *, char *, ...)), void *));
+
+struct protent mplscp_protent = {
+    PPP_MPLSCP,
+    mplscp_init,
+    mplscp_input,
+    mplscp_protrej,
+    mplscp_lowerup,
+    mplscp_lowerdown,
+    mplscp_open,
+    mplscp_close,
+    mplscp_printpkt,
+    NULL,
+    0,                            /* MPLS not enabled by default */
+    "MPLSCP",
+    "MPLS",
+    mplscp_option_list,
+    NULL,
+    NULL,
+    NULL
+};
+
+/*
+ * mplscp_init - Initialize MPLSCP.
+ */
+static void
+mplscp_init(int unit) {
+
+  fsm *f = &mplscp_fsm[unit];
+  
+  f->unit = unit;
+  f->protocol = PPP_MPLSCP;
+  f->callbacks = &mplscp_callbacks;  
+  fsm_init(&mplscp_fsm[unit]); 
+  
+}
+
+/*
+ * mplscp_open - MPLSCP is allowed to come up.
+ */
+static void
+mplscp_open(int unit) {
+  
+  fsm_open(&mplscp_fsm[unit]);
+
+}
+
+/*
+ * mplscp_close - Take MPLSCP down.
+ */
+static void
+mplscp_close(int unit, char *reason) {
+
+  fsm_close(&mplscp_fsm[unit], reason);
+
+}
+
+/*
+ * mplscp_lowerup - The lower layer is up.
+ */
+static void
+mplscp_lowerup(int unit) {
+
+  fsm_lowerup(&mplscp_fsm[unit]);
+}
+
+/*
+ * mplscp_lowerdown - The lower layer is down.
+ */
+static void
+mplscp_lowerdown(int unit) {
+  
+  fsm_lowerdown(&mplscp_fsm[unit]);
+}
+
+/*
+ * mplscp_input - Input MPLSCP packet.
+ */
+static void
+mplscp_input(int unit, u_char *p, int len) {
+
+  fsm_input(&mplscp_fsm[unit], p, len);
+}
+
+/*
+ * mplscp_protrej - A Protocol-Reject was received for MPLSCP.
+ * Pretend the lower layer went down, so we shut up.
+ */
+static void
+mplscp_protrej(int unit) {
+
+    fsm_lowerdown(&mplscp_fsm[unit]);
+}
+
+/*
+ * mplscp_resetci - Reset our CI.
+ * Called by fsm_sconfreq, Send Configure Request.
+ */
+static void
+mplscp_resetci(fsm *f) {
+
+  return;
+}
+
+/*
+ * mplscp_cilen - Return length of our CI.
+ * Called by fsm_sconfreq, Send Configure Request.
+ */
+static int
+mplscp_cilen(fsm *f) {
+
+  return 0;
+}
+
+/*
+ * mplscp_addci - Add our desired CIs to a packet.
+ * Called by fsm_sconfreq, Send Configure Request.
+ */
+static void
+mplscp_addci(fsm *f, u_char *ucp, int *lenp) {
+
+}
+
+/*
+ * ipcp_ackci - Ack our CIs.
+ * Called by fsm_rconfack, Receive Configure ACK.
+ *
+ * Returns:
+ *	0 - Ack was bad.
+ *	1 - Ack was good.
+ */
+static int
+mplscp_ackci(fsm *f, u_char *p, int  len) {
+  
+  return 1;
+
+}
+
+/*
+ * mplscp_nakci - Peer has sent a NAK for some of our CIs.
+ * This should not modify any state if the Nak is bad
+ * or if MPLSCP is in the OPENED state.
+ * Calback from fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject.
+ *
+ * Returns:
+ *	0 - Nak was bad.
+ *	1 - Nak was good.
+ */
+static int
+mplscp_nakci(fsm *f, u_char *p, int len) {
+
+  return 1;
+}
+
+/*
+ * MPLSVP_rejci - Reject some of our CIs.
+ * Callback from fsm_rconfnakrej.
+ */
+static int
+mplscp_rejci(fsm *f, u_char *p, int len) {
+
+  return 1;
+
+}
+
+/*
+ * mplscp_reqci - Check the peer's requested CIs and send appropriate response.
+ * Callback from fsm_rconfreq, Receive Configure Request
+ *
+ * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified
+ * appropriately.  If reject_if_disagree is non-zero, doesn't return
+ * CONFNAK; returns CONFREJ if it can't return CONFACK.
+ */
+static int
+mplscp_reqci(fsm *f, u_char *inp, int *len, int reject_if_disagree) {
+  
+  
+  int rc = CONFACK;		/* Final packet return code */
+   
+  PUTCHAR(CONFACK,inp);
+
+  return rc;
+
+}
+
+static void
+mplscp_up(fsm *f) {
+
+  sifnpmode(f->unit, PPP_MPLS_UC, NPMODE_PASS);
+  /*  sifnpmode(f->unit, PPP_MPLS_MC, NPMODE_PASS);*/
+  
+  np_up(f->unit, PPP_MPLS_UC);
+  /*  np_up(f->unit, PPP_MPLS_MC);*/
+  /*  ipcp_is_up = 1;*/
+
+  
+#if 1
+  printf("MPLSCP is OPENED\n");
+#endif
+
+}
+
+static void
+mplscp_down(fsm *f) {
+  
+  sifnpmode(f->unit, PPP_MPLS_UC, NPMODE_DROP);
+  /*  sifnpmode(f->unit, PPP_MPLS_MC, NPMODE_DROP);*/
+
+  sifdown(f->unit); 
+  
+#if 1
+  printf("MPLSCP is CLOSED\n");
+#endif
+  
+
+}
+
+static void 
+mplscp_finished(fsm *f) {
+  
+  np_finished(f->unit, PPP_MPLS_UC);
+  /*  np_finished(f->unit, PPP_MPLS_MC);*/
+
+}
+
+/*
+ * mpls_printpkt - print the contents of an MPLSCP packet.
+ */
+static char *mplscp_codenames[] = {
+    "ConfReq", "ConfAck", "ConfNak", "ConfRej",
+    "TermReq", "TermAck", "CodeRej"
+};
+
+static int
+mplscp_printpkt(u_char *p, int plen, 
+		void (*printer) __P((void *, char *, ...)),
+		void *arg) {
+ 
+    int code, id, len, olen;
+    u_char *pstart, *optend;
+
+    if (plen < HEADERLEN)
+	return 0;
+    pstart = p;
+    GETCHAR(code, p);
+    GETCHAR(id, p);
+    GETSHORT(len, p);
+    if (len < HEADERLEN || len > plen)
+	return 0;
+
+    if (code >= 1 && code <= sizeof(mplscp_codenames) / sizeof(char *))
+	printer(arg, " %s", mplscp_codenames[code-1]);
+    else
+	printer(arg, " code=0x%x", code);
+    printer(arg, " id=0x%x", id);
+    len -= HEADERLEN;
+    switch (code) {
+    case CONFREQ:
+    case CONFACK:
+    case CONFNAK:
+    case CONFREJ:
+	/* print option list */
+	while (len >= 2) {
+	    GETCHAR(code, p);
+	    GETCHAR(olen, p);
+	    p -= 2;
+	    if (olen < 2 || olen > len) {
+		break;
+	    }
+	    printer(arg, " <");
+	    len -= olen;
+	    optend = p + olen;
+	    while (p < optend) {
+		GETCHAR(code, p);
+		printer(arg, " %.2x", code);
+	    }
+	    printer(arg, ">");
+	}
+	break;
+
+    case TERMACK:
+    case TERMREQ:
+	if (len > 0 && *p >= ' ' && *p < 0x7f) {
+	    printer(arg, " ");
+	    print_string((char *)p, len, printer, arg);
+	    p += len;
+	    len = 0;
+	}
+	break;
+    }
+
+    /* print the rest of the bytes in the packet */
+    for (; len > 0; --len) {
+	GETCHAR(code, p);
+	printer(arg, " %.2x", code);
+    }
+
+    return p - pstart;
+
+}
diff -uNr ppp/pppd/mplscp.h ppp-mpls/pppd/mplscp.h
--- ppp/pppd/mplscp.h	1969-12-31 18:00:00.000000000 -0600
+++ ppp-mpls/pppd/mplscp.h	2004-07-13 22:46:26.000000000 -0500
@@ -0,0 +1,8 @@
+
+/* MPLSCP - Serge.Krier@advalvas.be (C) 2001 */
+
+#define PPP_MPLSCP  0x8281
+#define PPP_MPLS_UC 0x0281
+#define PPP_MPLS_MC 0x0283
+
+extern struct protent mplscp_protent;

                 reply	other threads:[~2005-01-25  4:28 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20050125042805.GC13927@mindspring.com \
    --to=jleu@mindspring.com \
    --cc=linux-ppp@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.