This patch implement and documents the user interface for
sequence numbering.

Signed-off-by: Asbjørn Sloth Tønnesen <asbj...@asbjorn.st>
---
 ip/ipl2tp.c        | 23 +++++++++++++++++++++++
 man/man8/ip-l2tp.8 | 15 +++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/ip/ipl2tp.c b/ip/ipl2tp.c
index f5d4113..ab35023 100644
--- a/ip/ipl2tp.c
+++ b/ip/ipl2tp.c
@@ -246,6 +246,12 @@ static void print_session(struct l2tp_data *data)
                printf("  reorder timeout: %u\n", p->reorder_timeout);
        else
                printf("\n");
+       if (p->send_seq || p->recv_seq) {
+               printf("  sequence numbering:");
+               if (p->send_seq) printf(" send");
+               if (p->recv_seq) printf(" recv");
+               printf("\n");
+       }
 }
 
 static int get_response(struct nlmsghdr *n, void *arg)
@@ -482,6 +488,7 @@ static void usage(void)
        fprintf(stderr, "          session_id ID peer_session_id ID\n");
        fprintf(stderr, "          [ cookie HEXSTR ] [ peer_cookie HEXSTR ]\n");
        fprintf(stderr, "          [ offset OFFSET ] [ peer_offset OFFSET ]\n");
+       fprintf(stderr, "          [ seq { none | send | recv | both } ]\n");
        fprintf(stderr, "          [ l2spec_type L2SPEC ]\n");
        fprintf(stderr, "       ip l2tp del tunnel tunnel_id ID\n");
        fprintf(stderr, "       ip l2tp del session tunnel_id ID session_id 
ID\n");
@@ -652,6 +659,22 @@ static int parse_args(int argc, char **argv, int cmd, 
struct l2tp_parm *p)
                                fprintf(stderr, "Unknown layer2specific header 
type \"%s\"\n", *argv);
                                exit(-1);
                        }
+               } else if (strcmp(*argv, "seq") == 0) {
+                       NEXT_ARG();
+                       if (strcasecmp(*argv, "both") == 0) {
+                               p->recv_seq = 1;
+                               p->send_seq = 1;
+                       } else if (strcasecmp(*argv, "recv") == 0) {
+                               p->recv_seq = 1;
+                       } else if (strcasecmp(*argv, "send") == 0) {
+                               p->send_seq = 1;
+                       } else if (strcasecmp(*argv, "none") == 0) {
+                               p->recv_seq = 0;
+                               p->send_seq = 0;
+                       } else {
+                               fprintf(stderr, "Unknown seq value \"%s\"\n", 
*argv);
+                               exit(-1);
+                       }
                } else if (strcmp(*argv, "tunnel") == 0) {
                        p->tunnel = 1;
                } else if (strcmp(*argv, "session") == 0) {
diff --git a/man/man8/ip-l2tp.8 b/man/man8/ip-l2tp.8
index 991d097..d4e7270 100644
--- a/man/man8/ip-l2tp.8
+++ b/man/man8/ip-l2tp.8
@@ -51,6 +51,8 @@ ip-l2tp - L2TPv3 static unmanaged tunnel configuration
 .br
 .RB "[ " l2spec_type " { " none " | " default " } ]"
 .br
+.RB "[ " seq " { " none " | " send " | " recv " | " both " } ]"
+.br
 .RB "[ " offset
 .IR OFFSET
 .RB " ] [ " peer_offset
@@ -238,6 +240,19 @@ set the layer2specific header type of the session.
 Valid values are:
 .BR none ", " default "."
 .TP
+.BI seq " SEQ"
+controls sequence numbering to prevent or detect out of order packets.
+.B send
+puts a sequence number in the default layer2specific header of each
+outgoing packet.
+.B recv
+reorder packets if they are received out of order.
+Default is
+.BR none "."
+.br
+Valid values are:
+.BR none ", " send ", " recv ", " both "."
+.TP
 .BI offset " OFFSET"
 sets the byte offset from the L2TP header where user data starts in
 transmitted L2TP data packets. This is hardly ever used. If set, the
-- 
2.10.2

Reply via email to