mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
[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>
This commit is contained in:
parent
1ab9dd0902
commit
00e4d116a7
4 changed files with 7 additions and 21 deletions
|
@ -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
|
DCCP_SOCKOPT_SERVICE sets the service. The specification mandates use of
|
||||||
specification. If you don't set it you will get EPROTO.
|
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
|
||||||
=====
|
=====
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue