diff options
-rw-r--r-- | net/dccp/ccid.h | 18 | ||||
-rw-r--r-- | net/dccp/probe.c | 7 | ||||
-rw-r--r-- | net/dccp/proto.c | 10 |
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, | |||
116 | extern struct ccid *ccid_hc_tx_new(unsigned char id, struct sock *sk, | 116 | extern struct ccid *ccid_hc_tx_new(unsigned char id, struct sock *sk, |
117 | gfp_t gfp); | 117 | gfp_t gfp); |
118 | 118 | ||
119 | static 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 | |||
128 | static 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 | |||
119 | extern void ccid_hc_rx_delete(struct ccid *ccid, struct sock *sk); | 137 | extern void ccid_hc_rx_delete(struct ccid *ccid, struct sock *sk); |
120 | extern void ccid_hc_tx_delete(struct ccid *ccid, struct sock *sk); | 138 | extern 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, ...) | |||
74 | static int jdccp_sendmsg(struct kiocb *iocb, struct sock *sk, | 74 | static 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; |