aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/dccp/ccid.h18
-rw-r--r--net/dccp/probe.c7
-rw-r--r--net/dccp/proto.c10
3 files changed, 30 insertions, 5 deletions
diff --git a/net/dccp/ccid.h b/net/dccp/ccid.h
index 259f5469d7d0..803343aed004 100644
--- a/net/dccp/ccid.h
+++ b/net/dccp/ccid.h
@@ -116,6 +116,24 @@ extern struct ccid *ccid_hc_rx_new(unsigned char id, struct sock *sk,
116extern struct ccid *ccid_hc_tx_new(unsigned char id, struct sock *sk, 116extern struct ccid *ccid_hc_tx_new(unsigned char id, struct sock *sk,
117 gfp_t gfp); 117 gfp_t gfp);
118 118
119static inline int ccid_get_current_rx_ccid(struct dccp_sock *dp)
120{
121 struct ccid *ccid = dp->dccps_hc_rx_ccid;
122
123 if (ccid == NULL || ccid->ccid_ops == NULL)
124 return -1;
125 return ccid->ccid_ops->ccid_id;
126}
127
128static inline int ccid_get_current_tx_ccid(struct dccp_sock *dp)
129{
130 struct ccid *ccid = dp->dccps_hc_tx_ccid;
131
132 if (ccid == NULL || ccid->ccid_ops == NULL)
133 return -1;
134 return ccid->ccid_ops->ccid_id;
135}
136
119extern void ccid_hc_rx_delete(struct ccid *ccid, struct sock *sk); 137extern void ccid_hc_rx_delete(struct ccid *ccid, struct sock *sk);
120extern void ccid_hc_tx_delete(struct ccid *ccid, struct sock *sk); 138extern void ccid_hc_tx_delete(struct ccid *ccid, struct sock *sk);
121 139
diff --git a/net/dccp/probe.c b/net/dccp/probe.c
index 49ba8d5ec4b5..37731da41481 100644
--- a/net/dccp/probe.c
+++ b/net/dccp/probe.c
@@ -74,14 +74,11 @@ static void printl(const char *fmt, ...)
74static int jdccp_sendmsg(struct kiocb *iocb, struct sock *sk, 74static int jdccp_sendmsg(struct kiocb *iocb, struct sock *sk,
75 struct msghdr *msg, size_t size) 75 struct msghdr *msg, size_t size)
76{ 76{
77 const struct dccp_minisock *dmsk = dccp_msk(sk);
78 const struct inet_sock *inet = inet_sk(sk); 77 const struct inet_sock *inet = inet_sk(sk);
79 const struct ccid3_hc_tx_sock *hctx; 78 struct ccid3_hc_tx_sock *hctx = NULL;
80 79
81 if (dmsk->dccpms_tx_ccid == DCCPC_CCID3) 80 if (ccid_get_current_tx_ccid(dccp_sk(sk)) == DCCPC_CCID3)
82 hctx = ccid3_hc_tx_sk(sk); 81 hctx = ccid3_hc_tx_sk(sk);
83 else
84 hctx = NULL;
85 82
86 if (port == 0 || ntohs(inet->dport) == port || 83 if (port == 0 || ntohs(inet->dport) == port ||
87 ntohs(inet->sport) == port) { 84 ntohs(inet->sport) == port) {
diff --git a/net/dccp/proto.c b/net/dccp/proto.c
index 445884cf1c29..ea85c423cdbd 100644
--- a/net/dccp/proto.c
+++ b/net/dccp/proto.c
@@ -662,6 +662,16 @@ static int do_dccp_getsockopt(struct sock *sk, int level, int optname,
662 break; 662 break;
663 case DCCP_SOCKOPT_AVAILABLE_CCIDS: 663 case DCCP_SOCKOPT_AVAILABLE_CCIDS:
664 return ccid_getsockopt_builtin_ccids(sk, len, optval, optlen); 664 return ccid_getsockopt_builtin_ccids(sk, len, optval, optlen);
665 case DCCP_SOCKOPT_TX_CCID:
666 val = ccid_get_current_tx_ccid(dp);
667 if (val < 0)
668 return -ENOPROTOOPT;
669 break;
670 case DCCP_SOCKOPT_RX_CCID:
671 val = ccid_get_current_rx_ccid(dp);
672 if (val < 0)
673 return -ENOPROTOOPT;
674 break;
665 case DCCP_SOCKOPT_SERVER_TIMEWAIT: 675 case DCCP_SOCKOPT_SERVER_TIMEWAIT:
666 val = dp->dccps_server_timewait; 676 val = dp->dccps_server_timewait;
667 break; 677 break;