Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: sctp: Convert timers to use timer_setup()

In preparation for unconditionally passing the struct timer_list pointer to
all timer callbacks, switch to using the new timer_setup() and from_timer()
to pass the timer pointer explicitly.

Cc: Vlad Yasevich <vyasevich@gmail.com>
Cc: Neil Horman <nhorman@tuxdriver.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: linux-sctp@vger.kernel.org
Cc: netdev@vger.kernel.org
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Kees Cook and committed by
David S. Miller
9c3b5751 a4cdd9ff

+66 -52
+5 -5
include/net/sctp/sm.h
··· 72 72 const union sctp_subtype type, 73 73 void *arg, 74 74 struct sctp_cmd_seq *commands); 75 - typedef void (sctp_timer_event_t) (unsigned long); 75 + typedef void (sctp_timer_event_t) (struct timer_list *); 76 76 struct sctp_sm_table_entry { 77 77 sctp_state_fn_t *fn; 78 78 const char *name; ··· 314 314 void *event_arg, gfp_t gfp); 315 315 316 316 /* 2nd level prototypes */ 317 - void sctp_generate_t3_rtx_event(unsigned long peer); 318 - void sctp_generate_heartbeat_event(unsigned long peer); 319 - void sctp_generate_reconf_event(unsigned long peer); 320 - void sctp_generate_proto_unreach_event(unsigned long peer); 317 + void sctp_generate_t3_rtx_event(struct timer_list *t); 318 + void sctp_generate_heartbeat_event(struct timer_list *t); 319 + void sctp_generate_reconf_event(struct timer_list *t); 320 + void sctp_generate_proto_unreach_event(struct timer_list *t); 321 321 322 322 void sctp_ootb_pkt_free(struct sctp_packet *packet); 323 323
+1 -2
net/sctp/associola.c
··· 149 149 150 150 /* Initializes the timers */ 151 151 for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i) 152 - setup_timer(&asoc->timers[i], sctp_timer_events[i], 153 - (unsigned long)asoc); 152 + timer_setup(&asoc->timers[i], sctp_timer_events[i], 0); 154 153 155 154 /* Pull default initialization values from the sock options. 156 155 * Note: This assumes that the values have already been
+3 -4
net/sctp/protocol.c
··· 622 622 INET_ECN_xmit(sk); 623 623 } 624 624 625 - static void sctp_addr_wq_timeout_handler(unsigned long arg) 625 + static void sctp_addr_wq_timeout_handler(struct timer_list *t) 626 626 { 627 - struct net *net = (struct net *)arg; 627 + struct net *net = from_timer(net, t, sctp.addr_wq_timer); 628 628 struct sctp_sockaddr_entry *addrw, *temp; 629 629 struct sctp_sock *sp; 630 630 ··· 1304 1304 INIT_LIST_HEAD(&net->sctp.auto_asconf_splist); 1305 1305 spin_lock_init(&net->sctp.addr_wq_lock); 1306 1306 net->sctp.addr_wq_timer.expires = 0; 1307 - setup_timer(&net->sctp.addr_wq_timer, sctp_addr_wq_timeout_handler, 1308 - (unsigned long)net); 1307 + timer_setup(&net->sctp.addr_wq_timer, sctp_addr_wq_timeout_handler, 0); 1309 1308 1310 1309 return 0; 1311 1310
+52 -33
net/sctp/sm_sideeffect.c
··· 243 243 /* When the T3-RTX timer expires, it calls this function to create the 244 244 * relevant state machine event. 245 245 */ 246 - void sctp_generate_t3_rtx_event(unsigned long peer) 246 + void sctp_generate_t3_rtx_event(struct timer_list *t) 247 247 { 248 - struct sctp_transport *transport = (struct sctp_transport *) peer; 248 + struct sctp_transport *transport = 249 + from_timer(transport, t, T3_rtx_timer); 249 250 struct sctp_association *asoc = transport->asoc; 250 251 struct sock *sk = asoc->base.sk; 251 252 struct net *net = sock_net(sk); ··· 320 319 sctp_association_put(asoc); 321 320 } 322 321 323 - static void sctp_generate_t1_cookie_event(unsigned long data) 322 + static void sctp_generate_t1_cookie_event(struct timer_list *t) 324 323 { 325 - struct sctp_association *asoc = (struct sctp_association *) data; 324 + struct sctp_association *asoc = 325 + from_timer(asoc, t, timers[SCTP_EVENT_TIMEOUT_T1_COOKIE]); 326 + 326 327 sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_T1_COOKIE); 327 328 } 328 329 329 - static void sctp_generate_t1_init_event(unsigned long data) 330 + static void sctp_generate_t1_init_event(struct timer_list *t) 330 331 { 331 - struct sctp_association *asoc = (struct sctp_association *) data; 332 + struct sctp_association *asoc = 333 + from_timer(asoc, t, timers[SCTP_EVENT_TIMEOUT_T1_INIT]); 334 + 332 335 sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_T1_INIT); 333 336 } 334 337 335 - static void sctp_generate_t2_shutdown_event(unsigned long data) 338 + static void sctp_generate_t2_shutdown_event(struct timer_list *t) 336 339 { 337 - struct sctp_association *asoc = (struct sctp_association *) data; 340 + struct sctp_association *asoc = 341 + from_timer(asoc, t, timers[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN]); 342 + 338 343 sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_T2_SHUTDOWN); 339 344 } 340 345 341 - static void sctp_generate_t4_rto_event(unsigned long data) 346 + static void sctp_generate_t4_rto_event(struct timer_list *t) 342 347 { 343 - struct sctp_association *asoc = (struct sctp_association *) data; 348 + struct sctp_association *asoc = 349 + from_timer(asoc, t, timers[SCTP_EVENT_TIMEOUT_T4_RTO]); 350 + 344 351 sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_T4_RTO); 345 352 } 346 353 347 - static void sctp_generate_t5_shutdown_guard_event(unsigned long data) 354 + static void sctp_generate_t5_shutdown_guard_event(struct timer_list *t) 348 355 { 349 - struct sctp_association *asoc = (struct sctp_association *)data; 356 + struct sctp_association *asoc = 357 + from_timer(asoc, t, 358 + timers[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD]); 359 + 350 360 sctp_generate_timeout_event(asoc, 351 361 SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD); 352 362 353 363 } /* sctp_generate_t5_shutdown_guard_event() */ 354 364 355 - static void sctp_generate_autoclose_event(unsigned long data) 365 + static void sctp_generate_autoclose_event(struct timer_list *t) 356 366 { 357 - struct sctp_association *asoc = (struct sctp_association *) data; 367 + struct sctp_association *asoc = 368 + from_timer(asoc, t, timers[SCTP_EVENT_TIMEOUT_AUTOCLOSE]); 369 + 358 370 sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_AUTOCLOSE); 359 371 } 360 372 361 373 /* Generate a heart beat event. If the sock is busy, reschedule. Make 362 374 * sure that the transport is still valid. 363 375 */ 364 - void sctp_generate_heartbeat_event(unsigned long data) 376 + void sctp_generate_heartbeat_event(struct timer_list *t) 365 377 { 366 - struct sctp_transport *transport = (struct sctp_transport *) data; 378 + struct sctp_transport *transport = from_timer(transport, t, hb_timer); 367 379 struct sctp_association *asoc = transport->asoc; 368 380 struct sock *sk = asoc->base.sk; 369 381 struct net *net = sock_net(sk); ··· 419 405 /* Handle the timeout of the ICMP protocol unreachable timer. Trigger 420 406 * the correct state machine transition that will close the association. 421 407 */ 422 - void sctp_generate_proto_unreach_event(unsigned long data) 408 + void sctp_generate_proto_unreach_event(struct timer_list *t) 423 409 { 424 - struct sctp_transport *transport = (struct sctp_transport *)data; 410 + struct sctp_transport *transport = 411 + from_timer(transport, t, proto_unreach_timer); 425 412 struct sctp_association *asoc = transport->asoc; 426 413 struct sock *sk = asoc->base.sk; 427 414 struct net *net = sock_net(sk); ··· 454 439 } 455 440 456 441 /* Handle the timeout of the RE-CONFIG timer. */ 457 - void sctp_generate_reconf_event(unsigned long data) 442 + void sctp_generate_reconf_event(struct timer_list *t) 458 443 { 459 - struct sctp_transport *transport = (struct sctp_transport *)data; 444 + struct sctp_transport *transport = 445 + from_timer(transport, t, reconf_timer); 460 446 struct sctp_association *asoc = transport->asoc; 461 447 struct sock *sk = asoc->base.sk; 462 448 struct net *net = sock_net(sk); ··· 487 471 } 488 472 489 473 /* Inject a SACK Timeout event into the state machine. */ 490 - static void sctp_generate_sack_event(unsigned long data) 474 + static void sctp_generate_sack_event(struct timer_list *t) 491 475 { 492 - struct sctp_association *asoc = (struct sctp_association *)data; 476 + struct sctp_association *asoc = 477 + from_timer(asoc, t, timers[SCTP_EVENT_TIMEOUT_SACK]); 478 + 493 479 sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_SACK); 494 480 } 495 481 496 482 sctp_timer_event_t *sctp_timer_events[SCTP_NUM_TIMEOUT_TYPES] = { 497 - NULL, 498 - sctp_generate_t1_cookie_event, 499 - sctp_generate_t1_init_event, 500 - sctp_generate_t2_shutdown_event, 501 - NULL, 502 - sctp_generate_t4_rto_event, 503 - sctp_generate_t5_shutdown_guard_event, 504 - NULL, 505 - NULL, 506 - sctp_generate_sack_event, 507 - sctp_generate_autoclose_event, 483 + [SCTP_EVENT_TIMEOUT_NONE] = NULL, 484 + [SCTP_EVENT_TIMEOUT_T1_COOKIE] = sctp_generate_t1_cookie_event, 485 + [SCTP_EVENT_TIMEOUT_T1_INIT] = sctp_generate_t1_init_event, 486 + [SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] = sctp_generate_t2_shutdown_event, 487 + [SCTP_EVENT_TIMEOUT_T3_RTX] = NULL, 488 + [SCTP_EVENT_TIMEOUT_T4_RTO] = sctp_generate_t4_rto_event, 489 + [SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD] = 490 + sctp_generate_t5_shutdown_guard_event, 491 + [SCTP_EVENT_TIMEOUT_HEARTBEAT] = NULL, 492 + [SCTP_EVENT_TIMEOUT_RECONF] = NULL, 493 + [SCTP_EVENT_TIMEOUT_SACK] = sctp_generate_sack_event, 494 + [SCTP_EVENT_TIMEOUT_AUTOCLOSE] = sctp_generate_autoclose_event, 508 495 }; 509 496 510 497
+5 -8
net/sctp/transport.c
··· 87 87 INIT_LIST_HEAD(&peer->send_ready); 88 88 INIT_LIST_HEAD(&peer->transports); 89 89 90 - setup_timer(&peer->T3_rtx_timer, sctp_generate_t3_rtx_event, 91 - (unsigned long)peer); 92 - setup_timer(&peer->hb_timer, sctp_generate_heartbeat_event, 93 - (unsigned long)peer); 94 - setup_timer(&peer->reconf_timer, sctp_generate_reconf_event, 95 - (unsigned long)peer); 96 - setup_timer(&peer->proto_unreach_timer, 97 - sctp_generate_proto_unreach_event, (unsigned long)peer); 90 + timer_setup(&peer->T3_rtx_timer, sctp_generate_t3_rtx_event, 0); 91 + timer_setup(&peer->hb_timer, sctp_generate_heartbeat_event, 0); 92 + timer_setup(&peer->reconf_timer, sctp_generate_reconf_event, 0); 93 + timer_setup(&peer->proto_unreach_timer, 94 + sctp_generate_proto_unreach_event, 0); 98 95 99 96 /* Initialize the 64-bit random nonce sent with heartbeat. */ 100 97 get_random_bytes(&peer->hb_nonce, sizeof(peer->hb_nonce));