Lines Matching full:app

237 static struct mrp_attr *mrp_attr_lookup(const struct mrp_applicant *app,  in mrp_attr_lookup()  argument
240 struct rb_node *parent = app->mad.rb_node; in mrp_attr_lookup()
257 static struct mrp_attr *mrp_attr_create(struct mrp_applicant *app, in mrp_attr_create() argument
260 struct rb_node *parent = NULL, **p = &app->mad.rb_node; in mrp_attr_create()
286 rb_insert_color(&attr->node, &app->mad); in mrp_attr_create()
290 static void mrp_attr_destroy(struct mrp_applicant *app, struct mrp_attr *attr) in mrp_attr_destroy() argument
292 rb_erase(&attr->node, &app->mad); in mrp_attr_destroy()
296 static void mrp_attr_destroy_all(struct mrp_applicant *app) in mrp_attr_destroy_all() argument
301 for (node = rb_first(&app->mad); in mrp_attr_destroy_all()
305 mrp_attr_destroy(app, attr); in mrp_attr_destroy_all()
309 static int mrp_pdu_init(struct mrp_applicant *app) in mrp_pdu_init() argument
314 skb = alloc_skb(app->dev->mtu + LL_RESERVED_SPACE(app->dev), in mrp_pdu_init()
319 skb->dev = app->dev; in mrp_pdu_init()
320 skb->protocol = app->app->pkttype.type; in mrp_pdu_init()
321 skb_reserve(skb, LL_RESERVED_SPACE(app->dev)); in mrp_pdu_init()
326 ph->version = app->app->version; in mrp_pdu_init()
328 app->pdu = skb; in mrp_pdu_init()
332 static int mrp_pdu_append_end_mark(struct mrp_applicant *app) in mrp_pdu_append_end_mark() argument
336 if (skb_tailroom(app->pdu) < sizeof(*endmark)) in mrp_pdu_append_end_mark()
338 endmark = __skb_put(app->pdu, sizeof(*endmark)); in mrp_pdu_append_end_mark()
343 static void mrp_pdu_queue(struct mrp_applicant *app) in mrp_pdu_queue() argument
345 if (!app->pdu) in mrp_pdu_queue()
348 if (mrp_cb(app->pdu)->mh) in mrp_pdu_queue()
349 mrp_pdu_append_end_mark(app); in mrp_pdu_queue()
350 mrp_pdu_append_end_mark(app); in mrp_pdu_queue()
352 dev_hard_header(app->pdu, app->dev, ntohs(app->app->pkttype.type), in mrp_pdu_queue()
353 app->app->group_address, app->dev->dev_addr, in mrp_pdu_queue()
354 app->pdu->len); in mrp_pdu_queue()
356 skb_queue_tail(&app->queue, app->pdu); in mrp_pdu_queue()
357 app->pdu = NULL; in mrp_pdu_queue()
360 static void mrp_queue_xmit(struct mrp_applicant *app) in mrp_queue_xmit() argument
364 while ((skb = skb_dequeue(&app->queue))) in mrp_queue_xmit()
368 static int mrp_pdu_append_msg_hdr(struct mrp_applicant *app, in mrp_pdu_append_msg_hdr() argument
373 if (mrp_cb(app->pdu)->mh) { in mrp_pdu_append_msg_hdr()
374 if (mrp_pdu_append_end_mark(app) < 0) in mrp_pdu_append_msg_hdr()
376 mrp_cb(app->pdu)->mh = NULL; in mrp_pdu_append_msg_hdr()
377 mrp_cb(app->pdu)->vah = NULL; in mrp_pdu_append_msg_hdr()
380 if (skb_tailroom(app->pdu) < sizeof(*mh)) in mrp_pdu_append_msg_hdr()
382 mh = __skb_put(app->pdu, sizeof(*mh)); in mrp_pdu_append_msg_hdr()
385 mrp_cb(app->pdu)->mh = mh; in mrp_pdu_append_msg_hdr()
389 static int mrp_pdu_append_vecattr_hdr(struct mrp_applicant *app, in mrp_pdu_append_vecattr_hdr() argument
394 if (skb_tailroom(app->pdu) < sizeof(*vah) + attrlen) in mrp_pdu_append_vecattr_hdr()
396 vah = __skb_put(app->pdu, sizeof(*vah) + attrlen); in mrp_pdu_append_vecattr_hdr()
399 mrp_cb(app->pdu)->vah = vah; in mrp_pdu_append_vecattr_hdr()
400 memcpy(mrp_cb(app->pdu)->attrvalue, firstattrvalue, attrlen); in mrp_pdu_append_vecattr_hdr()
404 static int mrp_pdu_append_vecattr_event(struct mrp_applicant *app, in mrp_pdu_append_vecattr_event() argument
412 if (!app->pdu) { in mrp_pdu_append_vecattr_event()
413 err = mrp_pdu_init(app); in mrp_pdu_append_vecattr_event()
422 if (!mrp_cb(app->pdu)->mh || in mrp_pdu_append_vecattr_event()
423 mrp_cb(app->pdu)->mh->attrtype != attr->type || in mrp_pdu_append_vecattr_event()
424 mrp_cb(app->pdu)->mh->attrlen != attr->len) { in mrp_pdu_append_vecattr_event()
425 if (mrp_pdu_append_msg_hdr(app, attr->type, attr->len) < 0) in mrp_pdu_append_vecattr_event()
433 if (!mrp_cb(app->pdu)->vah || in mrp_pdu_append_vecattr_event()
434 memcmp(mrp_cb(app->pdu)->attrvalue, attr->value, attr->len)) { in mrp_pdu_append_vecattr_event()
435 if (mrp_pdu_append_vecattr_hdr(app, attr->value, attr->len) < 0) in mrp_pdu_append_vecattr_event()
439 len = be16_to_cpu(get_unaligned(&mrp_cb(app->pdu)->vah->lenflags)); in mrp_pdu_append_vecattr_event()
446 if (skb_tailroom(app->pdu) < sizeof(u8)) in mrp_pdu_append_vecattr_event()
448 vaevents = __skb_put(app->pdu, sizeof(u8)); in mrp_pdu_append_vecattr_event()
450 vaevents = (u8 *)(skb_tail_pointer(app->pdu) - sizeof(u8)); in mrp_pdu_append_vecattr_event()
471 put_unaligned(cpu_to_be16(++len), &mrp_cb(app->pdu)->vah->lenflags); in mrp_pdu_append_vecattr_event()
472 mrp_attrvalue_inc(mrp_cb(app->pdu)->attrvalue, attr->len); in mrp_pdu_append_vecattr_event()
477 mrp_pdu_queue(app); in mrp_pdu_append_vecattr_event()
481 static void mrp_attr_event(struct mrp_applicant *app, in mrp_attr_event() argument
504 app, attr, MRP_VECATTR_EVENT_NEW) < 0) in mrp_attr_event()
509 app, attr, MRP_VECATTR_EVENT_JOIN_IN) < 0) in mrp_attr_event()
514 app, attr, MRP_VECATTR_EVENT_LV) < 0) in mrp_attr_event()
520 mrp_attr_destroy(app, attr); in mrp_attr_event()
535 struct mrp_applicant *app = rtnl_dereference( in mrp_request_join() local
543 spin_lock_bh(&app->lock); in mrp_request_join()
544 attr = mrp_attr_create(app, value, len, type); in mrp_request_join()
546 spin_unlock_bh(&app->lock); in mrp_request_join()
549 mrp_attr_event(app, attr, MRP_EVENT_JOIN); in mrp_request_join()
550 spin_unlock_bh(&app->lock); in mrp_request_join()
560 struct mrp_applicant *app = rtnl_dereference( in mrp_request_leave() local
568 spin_lock_bh(&app->lock); in mrp_request_leave()
569 attr = mrp_attr_lookup(app, value, len, type); in mrp_request_leave()
571 spin_unlock_bh(&app->lock); in mrp_request_leave()
574 mrp_attr_event(app, attr, MRP_EVENT_LV); in mrp_request_leave()
575 spin_unlock_bh(&app->lock); in mrp_request_leave()
579 static void mrp_mad_event(struct mrp_applicant *app, enum mrp_event event) in mrp_mad_event() argument
584 for (node = rb_first(&app->mad); in mrp_mad_event()
588 mrp_attr_event(app, attr, event); in mrp_mad_event()
592 static void mrp_join_timer_arm(struct mrp_applicant *app) in mrp_join_timer_arm() argument
597 mod_timer(&app->join_timer, jiffies + delay); in mrp_join_timer_arm()
602 struct mrp_applicant *app = from_timer(app, t, join_timer); in mrp_join_timer() local
604 spin_lock(&app->lock); in mrp_join_timer()
605 mrp_mad_event(app, MRP_EVENT_TX); in mrp_join_timer()
606 mrp_pdu_queue(app); in mrp_join_timer()
607 spin_unlock(&app->lock); in mrp_join_timer()
609 mrp_queue_xmit(app); in mrp_join_timer()
610 spin_lock(&app->lock); in mrp_join_timer()
611 if (likely(app->active)) in mrp_join_timer()
612 mrp_join_timer_arm(app); in mrp_join_timer()
613 spin_unlock(&app->lock); in mrp_join_timer()
616 static void mrp_periodic_timer_arm(struct mrp_applicant *app) in mrp_periodic_timer_arm() argument
618 mod_timer(&app->periodic_timer, in mrp_periodic_timer_arm()
624 struct mrp_applicant *app = from_timer(app, t, periodic_timer); in mrp_periodic_timer() local
626 spin_lock(&app->lock); in mrp_periodic_timer()
627 if (likely(app->active)) { in mrp_periodic_timer()
628 mrp_mad_event(app, MRP_EVENT_PERIODIC); in mrp_periodic_timer()
629 mrp_pdu_queue(app); in mrp_periodic_timer()
630 mrp_periodic_timer_arm(app); in mrp_periodic_timer()
632 spin_unlock(&app->lock); in mrp_periodic_timer()
648 static void mrp_pdu_parse_vecattr_event(struct mrp_applicant *app, in mrp_pdu_parse_vecattr_event() argument
655 attr = mrp_attr_lookup(app, mrp_cb(skb)->attrvalue, in mrp_pdu_parse_vecattr_event()
684 mrp_attr_event(app, attr, event); in mrp_pdu_parse_vecattr_event()
687 static int mrp_pdu_parse_vecattr(struct mrp_applicant *app, in mrp_pdu_parse_vecattr() argument
702 mrp_mad_event(app, MRP_EVENT_R_LA); in mrp_pdu_parse_vecattr()
736 mrp_pdu_parse_vecattr_event(app, skb, vaevent); in mrp_pdu_parse_vecattr()
746 mrp_pdu_parse_vecattr_event(app, skb, vaevent); in mrp_pdu_parse_vecattr()
755 mrp_pdu_parse_vecattr_event(app, skb, vaevent); in mrp_pdu_parse_vecattr()
760 static int mrp_pdu_parse_msg(struct mrp_applicant *app, struct sk_buff *skb, in mrp_pdu_parse_msg() argument
771 mrp_cb(skb)->mh->attrtype > app->app->maxattr || in mrp_pdu_parse_msg()
778 if (mrp_pdu_parse_vecattr(app, skb, offset) < 0) in mrp_pdu_parse_msg()
790 struct mrp_applicant *app; in mrp_rcv() local
806 app = rcu_dereference(port->applicants[appl->type]); in mrp_rcv()
807 if (unlikely(!app)) in mrp_rcv()
815 if (ph->version != app->app->version) in mrp_rcv()
818 spin_lock(&app->lock); in mrp_rcv()
822 if (mrp_pdu_parse_msg(app, skb, &offset) < 0) in mrp_rcv()
825 spin_unlock(&app->lock); in mrp_rcv()
857 struct mrp_applicant *app; in mrp_init_applicant() local
869 app = kzalloc(sizeof(*app), GFP_KERNEL); in mrp_init_applicant()
870 if (!app) in mrp_init_applicant()
877 app->dev = dev; in mrp_init_applicant()
878 app->app = appl; in mrp_init_applicant()
879 app->mad = RB_ROOT; in mrp_init_applicant()
880 app->active = true; in mrp_init_applicant()
881 spin_lock_init(&app->lock); in mrp_init_applicant()
882 skb_queue_head_init(&app->queue); in mrp_init_applicant()
883 rcu_assign_pointer(dev->mrp_port->applicants[appl->type], app); in mrp_init_applicant()
884 timer_setup(&app->join_timer, mrp_join_timer, 0); in mrp_init_applicant()
885 mrp_join_timer_arm(app); in mrp_init_applicant()
886 timer_setup(&app->periodic_timer, mrp_periodic_timer, 0); in mrp_init_applicant()
887 mrp_periodic_timer_arm(app); in mrp_init_applicant()
891 kfree(app); in mrp_init_applicant()
902 struct mrp_applicant *app = rtnl_dereference( in mrp_uninit_applicant() local
909 spin_lock_bh(&app->lock); in mrp_uninit_applicant()
910 app->active = false; in mrp_uninit_applicant()
911 spin_unlock_bh(&app->lock); in mrp_uninit_applicant()
915 timer_shutdown_sync(&app->join_timer); in mrp_uninit_applicant()
916 timer_shutdown_sync(&app->periodic_timer); in mrp_uninit_applicant()
918 spin_lock_bh(&app->lock); in mrp_uninit_applicant()
919 mrp_mad_event(app, MRP_EVENT_TX); in mrp_uninit_applicant()
920 mrp_attr_destroy_all(app); in mrp_uninit_applicant()
921 mrp_pdu_queue(app); in mrp_uninit_applicant()
922 spin_unlock_bh(&app->lock); in mrp_uninit_applicant()
924 mrp_queue_xmit(app); in mrp_uninit_applicant()
927 kfree_rcu(app, rcu); in mrp_uninit_applicant()