Browse Source

[DCCP]: Allow default/fallback service code.

This has been discussed on dccp@vger and removes the necessity for applications
to supply service codes in each and every case.

If an application does not want to provide a service code, that's fine, it will
be given 0. Otherwise, service codes can be set via socket options as before.

This patch has been tested using various client/server configurations
(including listening on multiple service codes).

Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
Gerrit Renker 18 years ago
parent
commit
00e4d116a7
4 changed files with 7 additions and 21 deletions
  1. 5 3
      Documentation/networking/dccp.txt
  2. 1 5
      include/linux/dccp.h
  3. 0 3
      net/dccp/ipv4.c
  4. 1 10
      net/dccp/proto.c

+ 5 - 3
Documentation/networking/dccp.txt

@@ -1,7 +1,6 @@
 DCCP protocol
 DCCP protocol
 ============
 ============
 
 
-Last updated: 10 November 2005
 
 
 Contents
 Contents
 ========
 ========
@@ -42,8 +41,11 @@ Socket options
 DCCP_SOCKOPT_PACKET_SIZE is used for CCID3 to set default packet size for
 DCCP_SOCKOPT_PACKET_SIZE is used for CCID3 to set default packet size for
 calculations.
 calculations.
 
 
-DCCP_SOCKOPT_SERVICE sets the service. This is compulsory as per the
-specification. If you don't set it you will get EPROTO.
+DCCP_SOCKOPT_SERVICE sets the service. The specification mandates use of
+service codes (RFC 4340, sec. 8.1.2); if this socket option is not set,
+the socket will fall back to 0 (which means that no meaningful service code
+is present). Connecting sockets set at most one service option; for
+listening sockets, multiple service codes can be specified.
 
 
 Notes
 Notes
 =====
 =====

+ 1 - 5
include/linux/dccp.h

@@ -404,6 +404,7 @@ struct dccp_service_list {
 };
 };
 
 
 #define DCCP_SERVICE_INVALID_VALUE htonl((__u32)-1)
 #define DCCP_SERVICE_INVALID_VALUE htonl((__u32)-1)
+#define DCCP_SERVICE_CODE_IS_ABSENT 		 0
 
 
 static inline int dccp_list_has_service(const struct dccp_service_list *sl,
 static inline int dccp_list_has_service(const struct dccp_service_list *sl,
 					const __be32 service)
 					const __be32 service)
@@ -484,11 +485,6 @@ static inline struct dccp_minisock *dccp_msk(const struct sock *sk)
 	return (struct dccp_minisock *)&dccp_sk(sk)->dccps_minisock;
 	return (struct dccp_minisock *)&dccp_sk(sk)->dccps_minisock;
 }
 }
 
 
-static inline int dccp_service_not_initialized(const struct sock *sk)
-{
-	return dccp_sk(sk)->dccps_service == DCCP_SERVICE_INVALID_VALUE;
-}
-
 static inline const char *dccp_role(const struct sock *sk)
 static inline const char *dccp_role(const struct sock *sk)
 {
 {
 	switch (dccp_sk(sk)->dccps_role) {
 	switch (dccp_sk(sk)->dccps_role) {

+ 0 - 3
net/dccp/ipv4.c

@@ -56,9 +56,6 @@ int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
 
 
 	dp->dccps_role = DCCP_ROLE_CLIENT;
 	dp->dccps_role = DCCP_ROLE_CLIENT;
 
 
-	if (dccp_service_not_initialized(sk))
-		return -EPROTO;
-
 	if (addr_len < sizeof(struct sockaddr_in))
 	if (addr_len < sizeof(struct sockaddr_in))
 		return -EINVAL;
 		return -EINVAL;
 
 

+ 1 - 10
net/dccp/proto.c

@@ -217,7 +217,7 @@ int dccp_init_sock(struct sock *sk, const __u8 ctl_sock_initialized)
 	icsk->icsk_sync_mss	= dccp_sync_mss;
 	icsk->icsk_sync_mss	= dccp_sync_mss;
 	dp->dccps_mss_cache	= 536;
 	dp->dccps_mss_cache	= 536;
 	dp->dccps_role		= DCCP_ROLE_UNDEFINED;
 	dp->dccps_role		= DCCP_ROLE_UNDEFINED;
-	dp->dccps_service	= DCCP_SERVICE_INVALID_VALUE;
+	dp->dccps_service	= DCCP_SERVICE_CODE_IS_ABSENT;
 	dp->dccps_l_ack_ratio	= dp->dccps_r_ack_ratio = 1;
 	dp->dccps_l_ack_ratio	= dp->dccps_r_ack_ratio = 1;
 
 
 	return 0;
 	return 0;
@@ -267,12 +267,6 @@ static inline int dccp_listen_start(struct sock *sk)
 	struct dccp_sock *dp = dccp_sk(sk);
 	struct dccp_sock *dp = dccp_sk(sk);
 
 
 	dp->dccps_role = DCCP_ROLE_LISTEN;
 	dp->dccps_role = DCCP_ROLE_LISTEN;
-	/*
-	 * Apps need to use setsockopt(DCCP_SOCKOPT_SERVICE)
-	 * before calling listen()
-	 */
-	if (dccp_service_not_initialized(sk))
-		return -EPROTO;
 	return inet_csk_listen_start(sk, TCP_SYNQ_HSIZE);
 	return inet_csk_listen_start(sk, TCP_SYNQ_HSIZE);
 }
 }
 
 
@@ -540,9 +534,6 @@ static int dccp_getsockopt_service(struct sock *sk, int len,
 	int err = -ENOENT, slen = 0, total_len = sizeof(u32);
 	int err = -ENOENT, slen = 0, total_len = sizeof(u32);
 
 
 	lock_sock(sk);
 	lock_sock(sk);
-	if (dccp_service_not_initialized(sk))
-		goto out;
-
 	if ((sl = dp->dccps_service_list) != NULL) {
 	if ((sl = dp->dccps_service_list) != NULL) {
 		slen = sl->dccpsl_nr * sizeof(u32);
 		slen = sl->dccpsl_nr * sizeof(u32);
 		total_len += slen;
 		total_len += slen;