Skip to content

Commit 09dbc38

Browse files
Gerrit RenkerDavid S. Miller
authored andcommitted
[DCCP]: Miscellaneous code tidy-ups
This patch does not change code; it performs some trivial clean/tidy-ups: * removal of a `debug_prefix' string in favour of the already existing dccp_role(sk) * add documentation of structures and constants * separated out the cases for invalid packets (step 1 of the packet validation) * removing duplicate statements * combining declaration & initialisation Signed-off-by: Gerrit Renker <[email protected]> Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent c02fdc0 commit 09dbc38

File tree

7 files changed

+54
-63
lines changed

7 files changed

+54
-63
lines changed

include/linux/dccp.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ struct dccp_so_feat {
209209
#define DCCP_SOCKOPT_CCID_RX_INFO 128
210210
#define DCCP_SOCKOPT_CCID_TX_INFO 192
211211

212+
/* maximum number of services provided on the same listening port */
212213
#define DCCP_SERVICE_LIST_MAX_LEN 32
213214

214215
#ifdef __KERNEL__
@@ -355,6 +356,9 @@ static inline unsigned int dccp_hdr_len(const struct sk_buff *skb)
355356
* @dccpms_ccid - Congestion Control Id (CCID) (section 10)
356357
* @dccpms_send_ack_vector - Send Ack Vector Feature (section 11.5)
357358
* @dccpms_send_ndp_count - Send NDP Count Feature (7.7.2)
359+
* @dccpms_ack_ratio - Ack Ratio Feature (section 11.3)
360+
* @dccpms_pending - List of features being negotiated
361+
* @dccpms_conf -
358362
*/
359363
struct dccp_minisock {
360364
__u64 dccpms_sequence_window;
@@ -452,14 +456,26 @@ struct dccp_ackvec;
452456
* @dccps_gss - greatest sequence number sent
453457
* @dccps_gsr - greatest valid sequence number received
454458
* @dccps_gar - greatest valid ack number received on a non-Sync; initialized to %dccps_iss
459+
* @dccps_service - first (passive sock) or unique (active sock) service code
460+
* @dccps_service_list - second .. last service code on passive socket
455461
* @dccps_timestamp_time - time of latest TIMESTAMP option
456462
* @dccps_timestamp_echo - latest timestamp received on a TIMESTAMP option
457463
* @dccps_packet_size - Set thru setsockopt
458-
* @dccps_role - Role of this sock, one of %dccp_role
464+
* @dccps_l_ack_ratio -
465+
* @dccps_r_ack_ratio -
459466
* @dccps_pcslen - sender partial checksum coverage (via sockopt)
460467
* @dccps_pcrlen - receiver partial checksum coverage (via sockopt)
461468
* @dccps_ndp_count - number of Non Data Packets since last data packet
469+
* @dccps_mss_cache -
470+
* @dccps_minisock -
462471
* @dccps_hc_rx_ackvec - rx half connection ack vector
472+
* @dccps_hc_rx_ccid -
473+
* @dccps_hc_tx_ccid -
474+
* @dccps_options_received -
475+
* @dccps_epoch -
476+
* @dccps_role - Role of this sock, one of %dccp_role
477+
* @dccps_hc_rx_insert_options -
478+
* @dccps_hc_tx_insert_options -
463479
* @dccps_xmit_timer - timer for when CCID is not ready to send
464480
*/
465481
struct dccp_sock {

net/dccp/ackvec.c

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,6 @@ static void dccp_ackvec_insert_avr(struct dccp_ackvec *av,
6767
int dccp_insert_option_ackvec(struct sock *sk, struct sk_buff *skb)
6868
{
6969
struct dccp_sock *dp = dccp_sk(sk);
70-
#ifdef CONFIG_IP_DCCP_DEBUG
71-
const char *debug_prefix = dp->dccps_role == DCCP_ROLE_CLIENT ?
72-
"CLIENT tx: " : "server tx: ";
73-
#endif
7470
struct dccp_ackvec *av = dp->dccps_hc_rx_ackvec;
7571
int len = av->dccpav_vec_len + 2;
7672
struct timeval now;
@@ -129,9 +125,9 @@ int dccp_insert_option_ackvec(struct sock *sk, struct sk_buff *skb)
129125

130126
dccp_ackvec_insert_avr(av, avr);
131127

132-
dccp_pr_debug("%sACK Vector 0, len=%d, ack_seqno=%llu, "
128+
dccp_pr_debug("%s ACK Vector 0, len=%d, ack_seqno=%llu, "
133129
"ack_ackno=%llu\n",
134-
debug_prefix, avr->dccpavr_sent_len,
130+
dccp_role(sk), avr->dccpavr_sent_len,
135131
(unsigned long long)avr->dccpavr_ack_seqno,
136132
(unsigned long long)avr->dccpavr_ack_ackno);
137133
return 0;
@@ -380,14 +376,9 @@ void dccp_ackvec_check_rcv_ackno(struct dccp_ackvec *av, struct sock *sk,
380376
*/
381377
list_for_each_entry_reverse(avr, &av->dccpav_records, dccpavr_node) {
382378
if (ackno == avr->dccpavr_ack_seqno) {
383-
#ifdef CONFIG_IP_DCCP_DEBUG
384-
struct dccp_sock *dp = dccp_sk(sk);
385-
const char *debug_prefix = dp->dccps_role == DCCP_ROLE_CLIENT ?
386-
"CLIENT rx ack: " : "server rx ack: ";
387-
#endif
388-
dccp_pr_debug("%sACK packet 0, len=%d, ack_seqno=%llu, "
379+
dccp_pr_debug("%s ACK packet 0, len=%d, ack_seqno=%llu, "
389380
"ack_ackno=%llu, ACKED!\n",
390-
debug_prefix, 1,
381+
dccp_role(sk), 1,
391382
(unsigned long long)avr->dccpavr_ack_seqno,
392383
(unsigned long long)avr->dccpavr_ack_ackno);
393384
dccp_ackvec_throw_record(av, avr);
@@ -437,16 +428,10 @@ static void dccp_ackvec_check_rcv_ackvector(struct dccp_ackvec *av,
437428
if (between48(avr->dccpavr_ack_seqno, ackno_end_rl, ackno)) {
438429
const u8 state = *vector & DCCP_ACKVEC_STATE_MASK;
439430
if (state != DCCP_ACKVEC_STATE_NOT_RECEIVED) {
440-
#ifdef CONFIG_IP_DCCP_DEBUG
441-
struct dccp_sock *dp = dccp_sk(sk);
442-
const char *debug_prefix =
443-
dp->dccps_role == DCCP_ROLE_CLIENT ?
444-
"CLIENT rx ack: " : "server rx ack: ";
445-
#endif
446-
dccp_pr_debug("%sACK vector 0, len=%d, "
431+
dccp_pr_debug("%s ACK vector 0, len=%d, "
447432
"ack_seqno=%llu, ack_ackno=%llu, "
448433
"ACKED!\n",
449-
debug_prefix, len,
434+
dccp_role(sk), len,
450435
(unsigned long long)
451436
avr->dccpavr_ack_seqno,
452437
(unsigned long long)

net/dccp/ipv4.c

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ static void dccp_v4_ctl_send_reset(struct sk_buff *rxskb)
518518
sizeof(struct dccp_hdr_reset);
519519
struct sk_buff *skb;
520520
struct dst_entry *dst;
521-
u64 seqno;
521+
u64 seqno = 0;
522522

523523
/* Never send a reset in response to a reset. */
524524
if (rxdh->dccph_type == DCCP_PKT_RESET)
@@ -552,13 +552,11 @@ static void dccp_v4_ctl_send_reset(struct sk_buff *rxskb)
552552
DCCP_SKB_CB(rxskb)->dccpd_reset_code;
553553

554554
/* See "8.3.1. Abnormal Termination" in RFC 4340 */
555-
seqno = 0;
556555
if (DCCP_SKB_CB(rxskb)->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ)
557556
dccp_set_seqno(&seqno, DCCP_SKB_CB(rxskb)->dccpd_ack_seq + 1);
558557

559558
dccp_hdr_set_seq(dh, seqno);
560-
dccp_hdr_set_ack(dccp_hdr_ack_bits(skb),
561-
DCCP_SKB_CB(rxskb)->dccpd_seq);
559+
dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), DCCP_SKB_CB(rxskb)->dccpd_seq);
562560

563561
dccp_csum_outgoing(skb);
564562
dh->dccph_checksum = dccp_v4_csum_finish(skb, rxskb->nh.iph->saddr,
@@ -734,6 +732,11 @@ int dccp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)
734732

735733
EXPORT_SYMBOL_GPL(dccp_v4_do_rcv);
736734

735+
/**
736+
* dccp_invalid_packet - check for malformed packets
737+
* Implements RFC 4340, 8.5: Step 1: Check header basics
738+
* Packets that fail these checks are ignored and do not receive Resets.
739+
*/
737740
int dccp_invalid_packet(struct sk_buff *skb)
738741
{
739742
const struct dccp_hdr *dh;
@@ -742,49 +745,45 @@ int dccp_invalid_packet(struct sk_buff *skb)
742745
if (skb->pkt_type != PACKET_HOST)
743746
return 1;
744747

748+
/* If the packet is shorter than 12 bytes, drop packet and return */
745749
if (!pskb_may_pull(skb, sizeof(struct dccp_hdr))) {
746750
LIMIT_NETDEBUG(KERN_WARNING "DCCP: pskb_may_pull failed\n");
747751
return 1;
748752
}
749753

750754
dh = dccp_hdr(skb);
751755

752-
/* If the packet type is not understood, drop packet and return */
756+
/* If P.type is not understood, drop packet and return */
753757
if (dh->dccph_type >= DCCP_PKT_INVALID) {
754758
LIMIT_NETDEBUG(KERN_WARNING "DCCP: invalid packet type\n");
755759
return 1;
756760
}
757761

758762
/*
759-
* If P.Data Offset is too small for packet type, or too large for
760-
* packet, drop packet and return
763+
* If P.Data Offset is too small for packet type, drop packet and return
761764
*/
762765
if (dh->dccph_doff < dccp_hdr_len(skb) / sizeof(u32)) {
763766
LIMIT_NETDEBUG(KERN_WARNING "DCCP: P.Data Offset(%u) "
764-
"too small 1\n",
765-
dh->dccph_doff);
767+
"too small\n", dh->dccph_doff);
766768
return 1;
767769
}
768-
770+
/*
771+
* If P.Data Offset is too too large for packet, drop packet and return
772+
*/
769773
if (!pskb_may_pull(skb, dh->dccph_doff * sizeof(u32))) {
770774
LIMIT_NETDEBUG(KERN_WARNING "DCCP: P.Data Offset(%u) "
771-
"too small 2\n",
772-
dh->dccph_doff);
775+
"too large\n", dh->dccph_doff);
773776
return 1;
774777
}
775778

776-
dh = dccp_hdr(skb);
777-
778779
/*
779780
* If P.type is not Data, Ack, or DataAck and P.X == 0 (the packet
780781
* has short sequence numbers), drop packet and return
781782
*/
782-
if (dh->dccph_x == 0 &&
783-
dh->dccph_type != DCCP_PKT_DATA &&
784-
dh->dccph_type != DCCP_PKT_ACK &&
785-
dh->dccph_type != DCCP_PKT_DATAACK) {
786-
LIMIT_NETDEBUG(KERN_WARNING "DCCP: P.type (%s) not Data, Ack "
787-
"nor DataAck and P.X == 0\n",
783+
if (dh->dccph_type >= DCCP_PKT_DATA &&
784+
dh->dccph_type <= DCCP_PKT_DATAACK && dh->dccph_x == 0) {
785+
LIMIT_NETDEBUG(KERN_WARNING "DCCP: P.type (%s) not Data||Ack||"
786+
"DataAck, while P.X == 0\n",
788787
dccp_packet_name(dh->dccph_type));
789788
return 1;
790789
}

net/dccp/ipv6.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ static void dccp_v6_ctl_send_reset(struct sk_buff *rxskb)
318318
sizeof(struct dccp_hdr_reset);
319319
struct sk_buff *skb;
320320
struct flowi fl;
321-
u64 seqno;
321+
u64 seqno = 0;
322322

323323
if (rxdh->dccph_type == DCCP_PKT_RESET)
324324
return;
@@ -345,13 +345,11 @@ static void dccp_v6_ctl_send_reset(struct sk_buff *rxskb)
345345
DCCP_SKB_CB(rxskb)->dccpd_reset_code;
346346

347347
/* See "8.3.1. Abnormal Termination" in RFC 4340 */
348-
seqno = 0;
349348
if (DCCP_SKB_CB(rxskb)->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ)
350349
dccp_set_seqno(&seqno, DCCP_SKB_CB(rxskb)->dccpd_ack_seq + 1);
351350

352351
dccp_hdr_set_seq(dh, seqno);
353-
dccp_hdr_set_ack(dccp_hdr_ack_bits(skb),
354-
DCCP_SKB_CB(rxskb)->dccpd_seq);
352+
dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), DCCP_SKB_CB(rxskb)->dccpd_seq);
355353

356354
dccp_csum_outgoing(skb);
357355
dh->dccph_checksum = dccp_v6_csum_finish(skb, &rxskb->nh.ipv6h->saddr,

net/dccp/options.c

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,6 @@ static u32 dccp_decode_value_var(const unsigned char *bf, const u8 len)
6060
int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
6161
{
6262
struct dccp_sock *dp = dccp_sk(sk);
63-
#ifdef CONFIG_IP_DCCP_DEBUG
64-
const char *debug_prefix = dp->dccps_role == DCCP_ROLE_CLIENT ?
65-
"CLIENT rx opt: " : "server rx opt: ";
66-
#endif
6763
const struct dccp_hdr *dh = dccp_hdr(skb);
6864
const u8 pkt_type = DCCP_SKB_CB(skb)->dccpd_type;
6965
unsigned char *options = (unsigned char *)dh + dccp_hdr_len(skb);
@@ -119,7 +115,7 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
119115
goto out_invalid_option;
120116

121117
opt_recv->dccpor_ndp = dccp_decode_value_var(value, len);
122-
dccp_pr_debug("%sNDP count=%d\n", debug_prefix,
118+
dccp_pr_debug("%s rx opt: NDP count=%d\n", dccp_role(sk),
123119
opt_recv->dccpor_ndp);
124120
break;
125121
case DCCPO_CHANGE_L:
@@ -165,8 +161,8 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
165161
dp->dccps_timestamp_echo = opt_recv->dccpor_timestamp;
166162
dccp_timestamp(sk, &dp->dccps_timestamp_time);
167163

168-
dccp_pr_debug("%sTIMESTAMP=%u, ackno=%llu\n",
169-
debug_prefix, opt_recv->dccpor_timestamp,
164+
dccp_pr_debug("%s rx opt: TIMESTAMP=%u, ackno=%llu\n",
165+
dccp_role(sk), opt_recv->dccpor_timestamp,
170166
(unsigned long long)
171167
DCCP_SKB_CB(skb)->dccpd_ack_seq);
172168
break;
@@ -176,8 +172,8 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
176172

177173
opt_recv->dccpor_timestamp_echo = ntohl(*(__be32 *)value);
178174

179-
dccp_pr_debug("%sTIMESTAMP_ECHO=%u, len=%d, ackno=%llu, ",
180-
debug_prefix,
175+
dccp_pr_debug("%s rx opt: TIMESTAMP_ECHO=%u, len=%d, "
176+
"ackno=%llu, ", dccp_role(sk),
181177
opt_recv->dccpor_timestamp_echo,
182178
len + 2,
183179
(unsigned long long)
@@ -211,8 +207,8 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
211207
if (elapsed_time > opt_recv->dccpor_elapsed_time)
212208
opt_recv->dccpor_elapsed_time = elapsed_time;
213209

214-
dccp_pr_debug("%sELAPSED_TIME=%d\n", debug_prefix,
215-
elapsed_time);
210+
dccp_pr_debug("%s rx opt: ELAPSED_TIME=%d\n",
211+
dccp_role(sk), elapsed_time);
216212
break;
217213
/*
218214
* From RFC 4340, sec. 10.3:

net/dccp/output.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst,
333333
return NULL;
334334
}
335335

336+
/* Build and checksum header */
336337
dh = dccp_zeroed_hdr(skb, dccp_header_size);
337338

338339
dh->dccph_sport = inet_sk(sk)->sport;

net/dccp/proto.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -452,9 +452,8 @@ static int dccp_setsockopt_change(struct sock *sk, int type,
452452
static int do_dccp_setsockopt(struct sock *sk, int level, int optname,
453453
char __user *optval, int optlen)
454454
{
455-
struct dccp_sock *dp;
456-
int err;
457-
int val;
455+
struct dccp_sock *dp = dccp_sk(sk);
456+
int val, err = 0;
458457

459458
if (optlen < sizeof(int))
460459
return -EINVAL;
@@ -466,9 +465,6 @@ static int do_dccp_setsockopt(struct sock *sk, int level, int optname,
466465
return dccp_setsockopt_service(sk, val, optval, optlen);
467466

468467
lock_sock(sk);
469-
dp = dccp_sk(sk);
470-
err = 0;
471-
472468
switch (optname) {
473469
case DCCP_SOCKOPT_PACKET_SIZE:
474470
dp->dccps_packet_size = val;

0 commit comments

Comments
 (0)