Lines Matching full:app

147 static struct garp_attr *garp_attr_lookup(const struct garp_applicant *app,  in garp_attr_lookup()  argument
150 struct rb_node *parent = app->gid.rb_node; in garp_attr_lookup()
167 static struct garp_attr *garp_attr_create(struct garp_applicant *app, in garp_attr_create() argument
170 struct rb_node *parent = NULL, **p = &app->gid.rb_node; in garp_attr_create()
196 rb_insert_color(&attr->node, &app->gid); in garp_attr_create()
200 static void garp_attr_destroy(struct garp_applicant *app, struct garp_attr *attr) in garp_attr_destroy() argument
202 rb_erase(&attr->node, &app->gid); in garp_attr_destroy()
206 static void garp_attr_destroy_all(struct garp_applicant *app) in garp_attr_destroy_all() argument
211 for (node = rb_first(&app->gid); in garp_attr_destroy_all()
215 garp_attr_destroy(app, attr); in garp_attr_destroy_all()
219 static int garp_pdu_init(struct garp_applicant *app) in garp_pdu_init() argument
225 skb = alloc_skb(app->dev->mtu + LL_RESERVED_SPACE(app->dev), in garp_pdu_init()
230 skb->dev = app->dev; in garp_pdu_init()
232 skb_reserve(skb, LL_RESERVED_SPACE(app->dev) + LLC_RESERVE); in garp_pdu_init()
237 app->pdu = skb; in garp_pdu_init()
241 static int garp_pdu_append_end_mark(struct garp_applicant *app) in garp_pdu_append_end_mark() argument
243 if (skb_tailroom(app->pdu) < sizeof(u8)) in garp_pdu_append_end_mark()
245 __skb_put_u8(app->pdu, GARP_END_MARK); in garp_pdu_append_end_mark()
249 static void garp_pdu_queue(struct garp_applicant *app) in garp_pdu_queue() argument
251 if (!app->pdu) in garp_pdu_queue()
254 garp_pdu_append_end_mark(app); in garp_pdu_queue()
255 garp_pdu_append_end_mark(app); in garp_pdu_queue()
257 llc_pdu_header_init(app->pdu, LLC_PDU_TYPE_U, LLC_SAP_BSPAN, in garp_pdu_queue()
259 llc_pdu_init_as_ui_cmd(app->pdu); in garp_pdu_queue()
260 llc_mac_hdr_init(app->pdu, app->dev->dev_addr, in garp_pdu_queue()
261 app->app->proto.group_address); in garp_pdu_queue()
263 skb_queue_tail(&app->queue, app->pdu); in garp_pdu_queue()
264 app->pdu = NULL; in garp_pdu_queue()
267 static void garp_queue_xmit(struct garp_applicant *app) in garp_queue_xmit() argument
271 while ((skb = skb_dequeue(&app->queue))) in garp_queue_xmit()
275 static int garp_pdu_append_msg(struct garp_applicant *app, u8 attrtype) in garp_pdu_append_msg() argument
279 if (skb_tailroom(app->pdu) < sizeof(*gm)) in garp_pdu_append_msg()
281 gm = __skb_put(app->pdu, sizeof(*gm)); in garp_pdu_append_msg()
283 garp_cb(app->pdu)->cur_type = attrtype; in garp_pdu_append_msg()
287 static int garp_pdu_append_attr(struct garp_applicant *app, in garp_pdu_append_attr() argument
295 if (!app->pdu) { in garp_pdu_append_attr()
296 err = garp_pdu_init(app); in garp_pdu_append_attr()
301 if (garp_cb(app->pdu)->cur_type != attr->type) { in garp_pdu_append_attr()
302 if (garp_cb(app->pdu)->cur_type && in garp_pdu_append_attr()
303 garp_pdu_append_end_mark(app) < 0) in garp_pdu_append_attr()
305 if (garp_pdu_append_msg(app, attr->type) < 0) in garp_pdu_append_attr()
310 if (skb_tailroom(app->pdu) < len) in garp_pdu_append_attr()
312 ga = __skb_put(app->pdu, len); in garp_pdu_append_attr()
319 garp_pdu_queue(app); in garp_pdu_append_attr()
323 static void garp_attr_event(struct garp_applicant *app, in garp_attr_event() argument
338 if (garp_pdu_append_attr(app, attr, GARP_JOIN_IN) < 0) in garp_attr_event()
342 garp_pdu_append_attr(app, attr, GARP_LEAVE_EMPTY); in garp_attr_event()
345 garp_attr_destroy(app, attr); in garp_attr_event()
359 struct garp_applicant *app = rtnl_dereference(port->applicants[appl->type]); in garp_request_join() local
362 spin_lock_bh(&app->lock); in garp_request_join()
363 attr = garp_attr_create(app, data, len, type); in garp_request_join()
365 spin_unlock_bh(&app->lock); in garp_request_join()
368 garp_attr_event(app, attr, GARP_EVENT_REQ_JOIN); in garp_request_join()
369 spin_unlock_bh(&app->lock); in garp_request_join()
379 struct garp_applicant *app = rtnl_dereference(port->applicants[appl->type]); in garp_request_leave() local
382 spin_lock_bh(&app->lock); in garp_request_leave()
383 attr = garp_attr_lookup(app, data, len, type); in garp_request_leave()
385 spin_unlock_bh(&app->lock); in garp_request_leave()
388 garp_attr_event(app, attr, GARP_EVENT_REQ_LEAVE); in garp_request_leave()
389 spin_unlock_bh(&app->lock); in garp_request_leave()
393 static void garp_gid_event(struct garp_applicant *app, enum garp_event event) in garp_gid_event() argument
398 for (node = rb_first(&app->gid); in garp_gid_event()
402 garp_attr_event(app, attr, event); in garp_gid_event()
406 static void garp_join_timer_arm(struct garp_applicant *app) in garp_join_timer_arm() argument
411 mod_timer(&app->join_timer, jiffies + delay); in garp_join_timer_arm()
416 struct garp_applicant *app = from_timer(app, t, join_timer); in garp_join_timer() local
418 spin_lock(&app->lock); in garp_join_timer()
419 garp_gid_event(app, GARP_EVENT_TRANSMIT_PDU); in garp_join_timer()
420 garp_pdu_queue(app); in garp_join_timer()
421 spin_unlock(&app->lock); in garp_join_timer()
423 garp_queue_xmit(app); in garp_join_timer()
424 garp_join_timer_arm(app); in garp_join_timer()
438 static int garp_pdu_parse_attr(struct garp_applicant *app, struct sk_buff *skb, in garp_pdu_parse_attr() argument
457 if (attrtype > app->app->maxattr) in garp_pdu_parse_attr()
464 garp_gid_event(app, GARP_EVENT_R_LEAVE_EMPTY); in garp_pdu_parse_attr()
484 attr = garp_attr_lookup(app, ga->data, dlen, attrtype); in garp_pdu_parse_attr()
487 garp_attr_event(app, attr, event); in garp_pdu_parse_attr()
491 static int garp_pdu_parse_msg(struct garp_applicant *app, struct sk_buff *skb) in garp_pdu_parse_msg() argument
503 if (garp_pdu_parse_attr(app, skb, gm->attrtype) < 0) in garp_pdu_parse_msg()
516 struct garp_applicant *app; in garp_pdu_rcv() local
522 app = rcu_dereference(port->applicants[appl->type]); in garp_pdu_rcv()
523 if (!app) in garp_pdu_rcv()
533 spin_lock(&app->lock); in garp_pdu_rcv()
535 if (garp_pdu_parse_msg(app, skb) < 0) in garp_pdu_rcv()
540 spin_unlock(&app->lock); in garp_pdu_rcv()
571 struct garp_applicant *app; in garp_init_applicant() local
583 app = kzalloc(sizeof(*app), GFP_KERNEL); in garp_init_applicant()
584 if (!app) in garp_init_applicant()
591 app->dev = dev; in garp_init_applicant()
592 app->app = appl; in garp_init_applicant()
593 app->gid = RB_ROOT; in garp_init_applicant()
594 spin_lock_init(&app->lock); in garp_init_applicant()
595 skb_queue_head_init(&app->queue); in garp_init_applicant()
596 rcu_assign_pointer(dev->garp_port->applicants[appl->type], app); in garp_init_applicant()
597 timer_setup(&app->join_timer, garp_join_timer, 0); in garp_init_applicant()
598 garp_join_timer_arm(app); in garp_init_applicant()
602 kfree(app); in garp_init_applicant()
613 struct garp_applicant *app = rtnl_dereference(port->applicants[appl->type]); in garp_uninit_applicant() local
621 timer_shutdown_sync(&app->join_timer); in garp_uninit_applicant()
623 spin_lock_bh(&app->lock); in garp_uninit_applicant()
624 garp_gid_event(app, GARP_EVENT_TRANSMIT_PDU); in garp_uninit_applicant()
625 garp_attr_destroy_all(app); in garp_uninit_applicant()
626 garp_pdu_queue(app); in garp_uninit_applicant()
627 spin_unlock_bh(&app->lock); in garp_uninit_applicant()
629 garp_queue_xmit(app); in garp_uninit_applicant()
632 kfree_rcu(app, rcu); in garp_uninit_applicant()