|
@@ -24,6 +24,11 @@
|
|
|
static unsigned int mrp_join_time __read_mostly = 200;
|
|
|
module_param(mrp_join_time, uint, 0644);
|
|
|
MODULE_PARM_DESC(mrp_join_time, "Join time in ms (default 200ms)");
|
|
|
+
|
|
|
+static unsigned int mrp_periodic_time __read_mostly = 1000;
|
|
|
+module_param(mrp_periodic_time, uint, 0644);
|
|
|
+MODULE_PARM_DESC(mrp_periodic_time, "Periodic time in ms (default 1s)");
|
|
|
+
|
|
|
MODULE_LICENSE("GPL");
|
|
|
|
|
|
static const u8
|
|
@@ -595,6 +600,24 @@ static void mrp_join_timer(unsigned long data)
|
|
|
mrp_join_timer_arm(app);
|
|
|
}
|
|
|
|
|
|
+static void mrp_periodic_timer_arm(struct mrp_applicant *app)
|
|
|
+{
|
|
|
+ mod_timer(&app->periodic_timer,
|
|
|
+ jiffies + msecs_to_jiffies(mrp_periodic_time));
|
|
|
+}
|
|
|
+
|
|
|
+static void mrp_periodic_timer(unsigned long data)
|
|
|
+{
|
|
|
+ struct mrp_applicant *app = (struct mrp_applicant *)data;
|
|
|
+
|
|
|
+ spin_lock(&app->lock);
|
|
|
+ mrp_mad_event(app, MRP_EVENT_PERIODIC);
|
|
|
+ mrp_pdu_queue(app);
|
|
|
+ spin_unlock(&app->lock);
|
|
|
+
|
|
|
+ mrp_periodic_timer_arm(app);
|
|
|
+}
|
|
|
+
|
|
|
static int mrp_pdu_parse_end_mark(struct sk_buff *skb, int *offset)
|
|
|
{
|
|
|
__be16 endmark;
|
|
@@ -845,6 +868,9 @@ int mrp_init_applicant(struct net_device *dev, struct mrp_application *appl)
|
|
|
rcu_assign_pointer(dev->mrp_port->applicants[appl->type], app);
|
|
|
setup_timer(&app->join_timer, mrp_join_timer, (unsigned long)app);
|
|
|
mrp_join_timer_arm(app);
|
|
|
+ setup_timer(&app->periodic_timer, mrp_periodic_timer,
|
|
|
+ (unsigned long)app);
|
|
|
+ mrp_periodic_timer_arm(app);
|
|
|
return 0;
|
|
|
|
|
|
err3:
|
|
@@ -870,6 +896,7 @@ void mrp_uninit_applicant(struct net_device *dev, struct mrp_application *appl)
|
|
|
* all pending messages before the applicant is gone.
|
|
|
*/
|
|
|
del_timer_sync(&app->join_timer);
|
|
|
+ del_timer_sync(&app->periodic_timer);
|
|
|
|
|
|
spin_lock_bh(&app->lock);
|
|
|
mrp_mad_event(app, MRP_EVENT_TX);
|