diff --git a/headers/private/net/net_stack.h b/headers/private/net/net_stack.h index a3868f4bfc..5fbd693fd6 100644 --- a/headers/private/net/net_stack.h +++ b/headers/private/net/net_stack.h @@ -93,6 +93,8 @@ struct net_stack_module_info { // timer void (*init_timer)(struct net_timer *timer, net_timer_func hook, void *data); void (*set_timer)(struct net_timer *timer, bigtime_t delay); + bool (*cancel_timer)(struct net_timer *timer); + bool (*is_timer_active)(struct net_timer *timer); }; #endif // NET_STACK_H diff --git a/src/add-ons/kernel/network/stack/stack.cpp b/src/add-ons/kernel/network/stack/stack.cpp index 7d4a9296d3..5e4e2e51fc 100644 --- a/src/add-ons/kernel/network/stack/stack.cpp +++ b/src/add-ons/kernel/network/stack/stack.cpp @@ -923,6 +923,8 @@ static net_stack_module_info sNetStackModule = { init_timer, set_timer, + cancel_timer, + is_timer_active, }; static module_info sNetStarterModule = { diff --git a/src/add-ons/kernel/network/stack/utility.cpp b/src/add-ons/kernel/network/stack/utility.cpp index fbb79781e7..a25f439016 100644 --- a/src/add-ons/kernel/network/stack/utility.cpp +++ b/src/add-ons/kernel/network/stack/utility.cpp @@ -320,6 +320,28 @@ set_timer(net_timer *timer, bigtime_t delay) } +bool +cancel_timer(struct net_timer *timer) +{ + BenaphoreLocker locker(sTimerLock); + + if (timer->due <= 0) + return false; + + // this timer is scheduled, cancel it + list_remove_item(&sTimers, timer); + timer->due = 0; + return true; +} + + +bool +is_timer_active(net_timer *timer) +{ + return timer->due > 0; +} + + status_t init_timers(void) { diff --git a/src/add-ons/kernel/network/stack/utility.h b/src/add-ons/kernel/network/stack/utility.h index 1044852dad..0f71c7a8e7 100644 --- a/src/add-ons/kernel/network/stack/utility.h +++ b/src/add-ons/kernel/network/stack/utility.h @@ -30,6 +30,8 @@ status_t clear_fifo(net_fifo *fifo); // timer void init_timer(net_timer *timer, net_timer_func hook, void *data); void set_timer(net_timer *timer, bigtime_t delay); +bool cancel_timer(struct net_timer *timer); +bool is_timer_active(net_timer *timer); status_t init_timers(void); void uninit_timers(void); diff --git a/src/tests/kits/net/tcp_tester.cpp b/src/tests/kits/net/tcp_tester.cpp index b33783176e..9563d5306d 100644 --- a/src/tests/kits/net/tcp_tester.cpp +++ b/src/tests/kits/net/tcp_tester.cpp @@ -186,6 +186,8 @@ static net_stack_module_info gNetStackModule = { init_timer, set_timer, + cancel_timer, + is_timer_active, };