Em Thu, Aug 28, 2008 at 07:44:51PM +0200, Gerrit Renker escreveu: > This provides function to query the current TX/RX CCID dynamically, without > reliance on the minisock value, using dynamic information available in the > currently loaded CCID module. > > This query function is then used to > (a) provide the getsockopt part for getting/setting CCIDs via sockopts; > (b) replace the current test for "which CCID is in use" in probe.c. > > Signed-off-by: Gerrit Renker <gerrit@xxxxxxxxxxxxxx> > Acked-by: Ian McDonald <ian.mcdonald@xxxxxxxxxxx> > --- > net/dccp/ccid.h | 9 +++++++++ > net/dccp/probe.c | 7 ++----- > net/dccp/proto.c | 6 ++++++ > 3 files changed, 17 insertions(+), 5 deletions(-) > > --- a/net/dccp/ccid.h > +++ b/net/dccp/ccid.h > @@ -116,6 +116,15 @@ extern struct ccid *ccid_hc_rx_new(unsigned char id, struct sock *sk, > extern struct ccid *ccid_hc_tx_new(unsigned char id, struct sock *sk, > gfp_t gfp); > > +static inline int ccid_get_current_id(struct dccp_sock *dp, bool rx) > +{ > + struct ccid *ccid = rx ? dp->dccps_hc_rx_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); > > --- a/net/dccp/probe.c > +++ b/net/dccp/probe.c > @@ -74,14 +74,11 @@ static void printl(const char *fmt, ...) > 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_id(dccp_sk(sk), false) == DCCPC_CCID3) The use of boolean here also hurts the brain, I guess we could have ccid_get_current_rx_id or something along these lines? > hctx = ccid3_hc_tx_sk(sk); > - else > - hctx = NULL; > > if (port == 0 || ntohs(inet->dport) == port || > ntohs(inet->sport) == port) { > --- a/net/dccp/proto.c > +++ b/net/dccp/proto.c > @@ -664,6 +664,12 @@ static int do_dccp_getsockopt(struct sock *sk, int level, int optname, > break; > case DCCP_SOCKOPT_AVAILABLE_CCIDS: > return ccid_getsockopt_builtin_ccids(sk, len, optval, optlen); > + case DCCP_SOCKOPT_TX_CCID: > + case DCCP_SOCKOPT_RX_CCID: > + val = ccid_get_current_id(dp, optname == DCCP_SOCKOPT_RX_CCID); > + if (val < 0) > + return -ENOPROTOOPT; > + break; > case DCCP_SOCKOPT_SERVER_TIMEWAIT: > val = dp->dccps_server_timewait; > break; > -- > 1.6.0.rc2 > > -- > To unsubscribe from this list: send the line "unsubscribe dccp" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe dccp" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html