]> Pileus Git - ~andy/linux/blobdiff - net/l2tp/l2tp_core.c
l2tp: do data sequence number handling in a separate func
[~andy/linux] / net / l2tp / l2tp_core.c
index 6984c3a353cd003bc91150485faeecefa078c763..5ca29659171da644b4020397265c6b07a4e94cfa 100644 (file)
@@ -542,6 +542,38 @@ static inline int l2tp_verify_udp_checksum(struct sock *sk,
        return __skb_checksum_complete(skb);
 }
 
+/* If packet has sequence numbers, queue it if acceptable. Returns 0 if
+ * acceptable, else non-zero.
+ */
+static int l2tp_recv_data_seq(struct l2tp_session *session, struct sk_buff *skb)
+{
+       if (session->reorder_timeout != 0) {
+               /* Packet reordering enabled. Add skb to session's
+                * reorder queue, in order of ns.
+                */
+               l2tp_recv_queue_skb(session, skb);
+       } else {
+               /* Packet reordering disabled. Discard out-of-sequence
+                * packets
+                */
+               if (L2TP_SKB_CB(skb)->ns != session->nr) {
+                       atomic_long_inc(&session->stats.rx_seq_discards);
+                       l2tp_dbg(session, L2TP_MSG_SEQ,
+                                "%s: oos pkt %u len %d discarded, waiting for %u, reorder_q_len=%d\n",
+                                session->name, L2TP_SKB_CB(skb)->ns,
+                                L2TP_SKB_CB(skb)->length, session->nr,
+                                skb_queue_len(&session->reorder_q));
+                       goto discard;
+               }
+               skb_queue_tail(&session->reorder_q, skb);
+       }
+
+       return 0;
+
+discard:
+       return 1;
+}
+
 /* Do receive processing of L2TP data frames. We handle both L2TPv2
  * and L2TPv3 data frames here.
  *
@@ -757,26 +789,8 @@ void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb,
         * enabled. Saved L2TP protocol info is stored in skb->sb[].
         */
        if (L2TP_SKB_CB(skb)->has_seq) {
-               if (session->reorder_timeout != 0) {
-                       /* Packet reordering enabled. Add skb to session's
-                        * reorder queue, in order of ns.
-                        */
-                       l2tp_recv_queue_skb(session, skb);
-               } else {
-                       /* Packet reordering disabled. Discard out-of-sequence
-                        * packets
-                        */
-                       if (L2TP_SKB_CB(skb)->ns != session->nr) {
-                               atomic_long_inc(&session->stats.rx_seq_discards);
-                               l2tp_dbg(session, L2TP_MSG_SEQ,
-                                        "%s: oos pkt %u len %d discarded, waiting for %u, reorder_q_len=%d\n",
-                                        session->name, L2TP_SKB_CB(skb)->ns,
-                                        L2TP_SKB_CB(skb)->length, session->nr,
-                                        skb_queue_len(&session->reorder_q));
-                               goto discard;
-                       }
-                       skb_queue_tail(&session->reorder_q, skb);
-               }
+               if (l2tp_recv_data_seq(session, skb))
+                       goto discard;
        } else {
                /* No sequence numbers. Add the skb to the tail of the
                 * reorder queue. This ensures that it will be