*/
 void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb,
                      unsigned char *ptr, unsigned char *optr, u16 hdrflags,
-                     int length, int (*payload_hook)(struct sk_buff *skb))
+                     int length)
 {
        struct l2tp_tunnel *tunnel = session->tunnel;
        int offset;
 
        __skb_pull(skb, offset);
 
-       /* If caller wants to process the payload before we queue the
-        * packet, do so now.
-        */
-       if (payload_hook)
-               if ((*payload_hook)(skb))
-                       goto discard;
-
        /* Prepare skb for adding to the session's reorder_q.  Hold
         * packets for max reorder_timeout or 1 second if not
         * reordering.
  * Returns 1 if the packet was not a good data packet and could not be
  * forwarded.  All such packets are passed up to userspace to deal with.
  */
-static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb,
-                             int (*payload_hook)(struct sk_buff *skb))
+static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb)
 {
        struct l2tp_session *session = NULL;
        unsigned char *ptr, *optr;
                goto error;
        }
 
-       l2tp_recv_common(session, skb, ptr, optr, hdrflags, length, payload_hook);
+       l2tp_recv_common(session, skb, ptr, optr, hdrflags, length);
        l2tp_session_dec_refcount(session);
 
        return 0;
        l2tp_dbg(tunnel, L2TP_MSG_DATA, "%s: received %d bytes\n",
                 tunnel->name, skb->len);
 
-       if (l2tp_udp_recv_core(tunnel, skb, tunnel->recv_payload_hook))
+       if (l2tp_udp_recv_core(tunnel, skb))
                goto pass_up;
 
        return 0;
 
        struct net              *l2tp_net;      /* the net we belong to */
 
        refcount_t              ref_count;
-       int (*recv_payload_hook)(struct sk_buff *skb);
        void (*old_sk_destruct)(struct sock *);
        struct sock             *sock;          /* Parent socket */
        int                     fd;             /* Parent fd, if tunnel socket
 void l2tp_session_free(struct l2tp_session *session);
 void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb,
                      unsigned char *ptr, unsigned char *optr, u16 hdrflags,
-                     int length, int (*payload_hook)(struct sk_buff *skb));
+                     int length);
 int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb);
 void l2tp_session_set_header_len(struct l2tp_session *session, int version);
 
 
                print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, ptr, length);
        }
 
-       l2tp_recv_common(session, skb, ptr, optr, 0, skb->len, tunnel->recv_payload_hook);
+       l2tp_recv_common(session, skb, ptr, optr, 0, skb->len);
        l2tp_session_dec_refcount(session);
 
        return 0;
 
                print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, ptr, length);
        }
 
-       l2tp_recv_common(session, skb, ptr, optr, 0, skb->len,
-                        tunnel->recv_payload_hook);
+       l2tp_recv_common(session, skb, ptr, optr, 0, skb->len);
        l2tp_session_dec_refcount(session);
 
        return 0;
 
  * Receive data handling
  *****************************************************************************/
 
-static int pppol2tp_recv_payload_hook(struct sk_buff *skb)
-{
-       /* Skip PPP header, if present.  In testing, Microsoft L2TP clients
-        * don't send the PPP header (PPP header compression enabled), but
-        * other clients can include the header. So we cope with both cases
-        * here. The PPP header is always FF03 when using L2TP.
-        *
-        * Note that skb->data[] isn't dereferenced from a u16 ptr here since
-        * the field may be unaligned.
-        */
-       if (!pskb_may_pull(skb, 2))
-               return 1;
-
-       if ((skb->data[0] == PPP_ALLSTATIONS) && (skb->data[1] == PPP_UI))
-               skb_pull(skb, 2);
-
-       return 0;
-}
-
 /* Receive message. This is the recvmsg for the PPPoL2TP socket.
  */
 static int pppol2tp_recvmsg(struct socket *sock, struct msghdr *msg,
        if (sk == NULL)
                goto no_sock;
 
+       /* If the first two bytes are 0xFF03, consider that it is the PPP's
+        * Address and Control fields and skip them. The L2TP module has always
+        * worked this way, although, in theory, the use of these fields should
+        * be negociated and handled at the PPP layer. These fields are
+        * constant: 0xFF is the All-Stations Address and 0x03 the Unnumbered
+        * Information command with Poll/Final bit set to zero (RFC 1662).
+        */
+       if (pskb_may_pull(skb, 2) && skb->data[0] == PPP_ALLSTATIONS &&
+           skb->data[1] == PPP_UI)
+               skb_pull(skb, 2);
+
        if (sk->sk_state & PPPOX_BOUND) {
                struct pppox_sock *po;
 
                        goto end;
        }
 
-       if (tunnel->recv_payload_hook == NULL)
-               tunnel->recv_payload_hook = pppol2tp_recv_payload_hook;
-
        if (tunnel->peer_tunnel_id == 0)
                tunnel->peer_tunnel_id = info.peer_tunnel_id;