/* Round an int up to the next multiple of 4.  */
 #define WORD_ROUND(s) (((s)+3)&~3)
 
-/* Compare two timevals.  */
-#define tv_lt(s, t) \
-   (s.tv_sec < t.tv_sec || (s.tv_sec == t.tv_sec && s.tv_usec < t.tv_usec))
-
-/* Add tv1 to tv2. */
-#define TIMEVAL_ADD(tv1, tv2) \
-({ \
-        suseconds_t usecs = (tv2).tv_usec + (tv1).tv_usec; \
-        time_t secs = (tv2).tv_sec + (tv1).tv_sec; \
-\
-        if (usecs >= 1000000) { \
-                usecs -= 1000000; \
-                secs++; \
-        } \
-        (tv2).tv_sec = secs; \
-        (tv2).tv_usec = usecs; \
-})
-
 /* External references. */
 
 extern struct proto sctp_prot;
 
 #ifndef __sctp_structs_h__
 #define __sctp_structs_h__
 
-#include <linux/time.h>                /* We get struct timespec.    */
+#include <linux/ktime.h>
 #include <linux/socket.h>      /* linux/in.h needs this!!    */
 #include <linux/in.h>          /* We get struct sockaddr_in. */
 #include <linux/in6.h>         /* We get struct in6_addr     */
        __u32 peer_ttag;
 
        /* When does this cookie expire? */
-       struct timeval expiration;
+       ktime_t expiration;
 
        /* Number of inbound/outbound streams which are set
         * and negotiated during the INIT process.
        sctp_state_t state;
 
        /* The cookie life I award for any cookie.  */
-       struct timeval cookie_life;
+       ktime_t cookie_life;
 
        /* Overall     : The overall association error count.
         * Error Count : [Clear this any time I get something.]
 
        sctp_bind_addr_init(&asoc->base.bind_addr, ep->base.bind_addr.port);
 
        asoc->state = SCTP_STATE_CLOSED;
-
-       /* Set these values from the socket values, a conversion between
-        * millsecons to seconds/microseconds must also be done.
-        */
-       asoc->cookie_life.tv_sec = sp->assocparams.sasoc_cookie_life / 1000;
-       asoc->cookie_life.tv_usec = (sp->assocparams.sasoc_cookie_life % 1000)
-                                       * 1000;
+       asoc->cookie_life = ms_to_ktime(sp->assocparams.sasoc_cookie_life);
        asoc->frag_point = 0;
        asoc->user_frag = sp->user_frag;
 
 
        cookie->c.adaptation_ind = asoc->peer.adaptation_ind;
 
        /* Set an expiration time for the cookie.  */
-       do_gettimeofday(&cookie->c.expiration);
-       TIMEVAL_ADD(asoc->cookie_life, cookie->c.expiration);
+       cookie->c.expiration = ktime_add(asoc->cookie_life,
+                                        ktime_get());
 
        /* Copy the peer's init packet.  */
        memcpy(&cookie->c.peer_init[0], init_chunk->chunk_hdr,
        unsigned int len;
        sctp_scope_t scope;
        struct sk_buff *skb = chunk->skb;
-       struct timeval tv;
+       ktime_t kt;
        struct hash_desc desc;
 
        /* Header size is static data prior to the actual cookie, including
         * down the new association establishment instead of every packet.
         */
        if (sock_flag(ep->base.sk, SOCK_TIMESTAMP))
-               skb_get_timestamp(skb, &tv);
+               kt = skb_get_ktime(skb);
        else
-               do_gettimeofday(&tv);
+               kt = ktime_get();
 
-       if (!asoc && tv_lt(bear_cookie->expiration, tv)) {
+       if (!asoc && ktime_compare(bear_cookie->expiration, kt) < 0) {
                /*
                 * Section 3.3.10.3 Stale Cookie Error (3)
                 *
                len = ntohs(chunk->chunk_hdr->length);
                *errp = sctp_make_op_error_space(asoc, chunk, len);
                if (*errp) {
-                       suseconds_t usecs = (tv.tv_sec -
-                               bear_cookie->expiration.tv_sec) * 1000000L +
-                               tv.tv_usec - bear_cookie->expiration.tv_usec;
+                       suseconds_t usecs = ktime_to_us(ktime_sub(kt, bear_cookie->expiration));
                        __be32 n = htonl(usecs);
 
                        sctp_init_cause(*errp, SCTP_ERROR_STALE_COOKIE,
                /* Suggested Cookie Life span increment's unit is msec,
                 * (1/1000sec).
                 */
-               asoc->cookie_life.tv_sec += stale / 1000;
-               asoc->cookie_life.tv_usec += (stale % 1000) * 1000;
+               asoc->cookie_life = ktime_add_ms(asoc->cookie_life, stale);
                break;
 
        case SCTP_PARAM_HOST_NAME_ADDRESS:
 
                        asoc->max_retrans = assocparams.sasoc_asocmaxrxt;
                }
 
-               if (assocparams.sasoc_cookie_life != 0) {
-                       asoc->cookie_life.tv_sec =
-                                       assocparams.sasoc_cookie_life / 1000;
-                       asoc->cookie_life.tv_usec =
-                                       (assocparams.sasoc_cookie_life % 1000)
-                                       * 1000;
-               }
+               if (assocparams.sasoc_cookie_life != 0)
+                       asoc->cookie_life = ms_to_ktime(assocparams.sasoc_cookie_life);
        } else {
                /* Set the values to the endpoint */
                struct sctp_sock *sp = sctp_sk(sk);
                assocparams.sasoc_asocmaxrxt = asoc->max_retrans;
                assocparams.sasoc_peer_rwnd = asoc->peer.rwnd;
                assocparams.sasoc_local_rwnd = asoc->a_rwnd;
-               assocparams.sasoc_cookie_life = (asoc->cookie_life.tv_sec
-                                               * 1000) +
-                                               (asoc->cookie_life.tv_usec
-                                               / 1000);
+               assocparams.sasoc_cookie_life = ktime_to_ms(asoc->cookie_life);
 
                list_for_each(pos, &asoc->peer.transport_addr_list) {
                        cnt ++;