extern struct ccid *ccid_hc_tx_new(unsigned char id, struct sock *sk,
                                   gfp_t gfp);
 
+static inline int ccid_get_current_rx_ccid(struct dccp_sock *dp)
+{
+       struct ccid *ccid = dp->dccps_hc_rx_ccid;
+
+       if (ccid == NULL || ccid->ccid_ops == NULL)
+               return -1;
+       return ccid->ccid_ops->ccid_id;
+}
+
+static inline int ccid_get_current_tx_ccid(struct dccp_sock *dp)
+{
+       struct ccid *ccid = dp->dccps_hc_tx_ccid;
+
+       if (ccid == NULL || ccid->ccid_ops == NULL)
+               return -1;
+       return ccid->ccid_ops->ccid_id;
+}
+
 extern void ccid_hc_rx_delete(struct ccid *ccid, struct sock *sk);
 extern void ccid_hc_tx_delete(struct ccid *ccid, struct sock *sk);
 
 
 static int jdccp_sendmsg(struct kiocb *iocb, struct sock *sk,
                         struct msghdr *msg, size_t size)
 {
-       const struct dccp_minisock *dmsk = dccp_msk(sk);
        const struct inet_sock *inet = inet_sk(sk);
-       const struct ccid3_hc_tx_sock *hctx;
+       struct ccid3_hc_tx_sock *hctx = NULL;
 
-       if (dmsk->dccpms_tx_ccid == DCCPC_CCID3)
+       if (ccid_get_current_tx_ccid(dccp_sk(sk)) == DCCPC_CCID3)
                hctx = ccid3_hc_tx_sk(sk);
-       else
-               hctx = NULL;
 
        if (port == 0 || ntohs(inet->dport) == port ||
            ntohs(inet->sport) == port) {
 
                break;
        case DCCP_SOCKOPT_AVAILABLE_CCIDS:
                return ccid_getsockopt_builtin_ccids(sk, len, optval, optlen);
+       case DCCP_SOCKOPT_TX_CCID:
+               val = ccid_get_current_tx_ccid(dp);
+               if (val < 0)
+                       return -ENOPROTOOPT;
+               break;
+       case DCCP_SOCKOPT_RX_CCID:
+               val = ccid_get_current_rx_ccid(dp);
+               if (val < 0)
+                       return -ENOPROTOOPT;
+               break;
        case DCCP_SOCKOPT_SERVER_TIMEWAIT:
                val = dp->dccps_server_timewait;
                break;