rxrpc: Use the UDP encap_rcv hook
[sfrench/cifs-2.6.git] / net / rxrpc / input.c
index c3114fa66c922884d6283321f8d8eb83c72fb8ab..1866aeef2284d5dd9ed755f3db6cb81a28111587 100644 (file)
@@ -1121,7 +1121,7 @@ int rxrpc_extract_header(struct rxrpc_skb_priv *sp, struct sk_buff *skb)
  * shut down and the local endpoint from going away, thus sk_user_data will not
  * be cleared until this function returns.
  */
-void rxrpc_input_packet(struct sock *udp_sk, struct sk_buff *skb)
+int rxrpc_input_packet(struct sock *udp_sk, struct sk_buff *skb)
 {
        struct rxrpc_connection *conn;
        struct rxrpc_channel *chan;
@@ -1135,6 +1135,13 @@ void rxrpc_input_packet(struct sock *udp_sk, struct sk_buff *skb)
 
        _enter("%p", udp_sk);
 
+       if (skb->tstamp == 0)
+               skb->tstamp = ktime_get_real();
+
+       rxrpc_new_skb(skb, rxrpc_skb_rx_received);
+
+       skb_pull(skb, sizeof(struct udphdr));
+
        /* The UDP protocol already released all skb resources;
         * we are free to add our own data there.
         */
@@ -1148,8 +1155,8 @@ void rxrpc_input_packet(struct sock *udp_sk, struct sk_buff *skb)
                static int lose;
                if ((lose++ & 7) == 7) {
                        trace_rxrpc_rx_lose(sp);
-                       rxrpc_lose_skb(skb, rxrpc_skb_rx_lost);
-                       return;
+                       rxrpc_free_skb(skb, rxrpc_skb_rx_lost);
+                       return 0;
                }
        }
 
@@ -1332,7 +1339,7 @@ discard:
        rxrpc_free_skb(skb, rxrpc_skb_rx_freed);
 out:
        trace_rxrpc_rx_done(0, 0);
-       return;
+       return 0;
 
 out_unlock:
        rcu_read_unlock();
@@ -1371,38 +1378,5 @@ reject_packet:
        trace_rxrpc_rx_done(skb->mark, skb->priority);
        rxrpc_reject_packet(local, skb);
        _leave(" [badmsg]");
-}
-
-void rxrpc_data_ready(struct sock *udp_sk)
-{
-       struct sk_buff *skb;
-       int ret;
-
-       for (;;) {
-               skb = skb_recv_udp(udp_sk, 0, 1, &ret);
-               if (!skb) {
-                       if (ret == -EAGAIN)
-                               return;
-
-                       /* If there was a transmission failure, we get an error
-                        * here that we need to ignore.
-                        */
-                       _debug("UDP socket error %d", ret);
-                       continue;
-               }
-
-               rxrpc_new_skb(skb, rxrpc_skb_rx_received);
-
-               /* we'll probably need to checksum it (didn't call sock_recvmsg) */
-               if (skb_checksum_complete(skb)) {
-                       rxrpc_free_skb(skb, rxrpc_skb_rx_freed);
-                       __UDP_INC_STATS(sock_net(udp_sk), UDP_MIB_INERRORS, 0);
-                       _debug("csum failed");
-                       continue;
-               }
-
-               __UDP_INC_STATS(sock_net(udp_sk), UDP_MIB_INDATAGRAMS, 0);
-
-               rxrpc_input_packet(udp_sk, skb);
-       }
+       return 0;
 }