summaryrefslogtreecommitdiffstats
path: root/net/dccp/feat.c
diff options
context:
space:
mode:
authorGerrit Renker <gerrit@erg.abdn.ac.uk>2008-11-12 00:47:26 -0800
committerDavid S. Miller <davem@davemloft.net>2008-11-12 00:47:26 -0800
commitd90ebcbfa7f5a8b4e20518c9f94c5c4e4cd3c2e5 (patch)
treeb1fb407c7ee1adbe8215311675d133a83a2d55b5 /net/dccp/feat.c
parente8ef967a54f401ac5e8637b7f7f8bddb006144c4 (diff)
downloadlinux-d90ebcbfa7f5a8b4e20518c9f94c5c4e4cd3c2e5.tar.gz
linux-d90ebcbfa7f5a8b4e20518c9f94c5c4e4cd3c2e5.tar.bz2
linux-d90ebcbfa7f5a8b4e20518c9f94c5c4e4cd3c2e5.zip
dccp: Query supported CCIDs
This provides a data structure to record which CCIDs are locally supported and three accessor functions: - a test function for internal use which is used to validate CCID requests made by the user; - a copy function so that the list can be used for feature-negotiation; - documented getsockopt() support so that the user can query capabilities. The data structure is a table which is filled in at compile-time with the list of available CCIDs (which in turn depends on the Kconfig choices). Using the copy function for cloning the list of supported CCIDs is useful for feature negotiation, since the negotiation is now with the full list of available CCIDs (e.g. {2, 3}) instead of the default value {2}. This means negotiation will not fail if the peer requests to use CCID3 instead of CCID2. Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk> Acked-by: Ian McDonald <ian.mcdonald@jandi.co.nz> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dccp/feat.c')
-rw-r--r--net/dccp/feat.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/net/dccp/feat.c b/net/dccp/feat.c
index 192d494a3816..f79fb5e33f5e 100644
--- a/net/dccp/feat.c
+++ b/net/dccp/feat.c
@@ -342,6 +342,10 @@ static int __feat_register_sp(struct list_head *fn, u8 feat, u8 is_local,
!dccp_feat_sp_list_ok(feat, sp_val, sp_len))
return -EINVAL;
+ /* Avoid negotiating alien CCIDs by only advertising supported ones */
+ if (feat == DCCPF_CCID && !ccid_support_check(sp_val, sp_len))
+ return -EOPNOTSUPP;
+
if (dccp_feat_clone_sp_val(&fval, sp_val, sp_len))
return -ENOMEM;