Lines Matching refs:app

148 static struct garp_attr *garp_attr_lookup(const struct garp_applicant *app,  in garp_attr_lookup()  argument
151 struct rb_node *parent = app->gid.rb_node; in garp_attr_lookup()
168 static struct garp_attr *garp_attr_create(struct garp_applicant *app, in garp_attr_create() argument
171 struct rb_node *parent = NULL, **p = &app->gid.rb_node; in garp_attr_create()
197 rb_insert_color(&attr->node, &app->gid); in garp_attr_create()
201 static void garp_attr_destroy(struct garp_applicant *app, struct garp_attr *attr) in garp_attr_destroy() argument
203 rb_erase(&attr->node, &app->gid); in garp_attr_destroy()
207 static void garp_attr_destroy_all(struct garp_applicant *app) in garp_attr_destroy_all() argument
212 for (node = rb_first(&app->gid); in garp_attr_destroy_all()
216 garp_attr_destroy(app, attr); in garp_attr_destroy_all()
220 static int garp_pdu_init(struct garp_applicant *app) in garp_pdu_init() argument
226 skb = alloc_skb(app->dev->mtu + LL_RESERVED_SPACE(app->dev), in garp_pdu_init()
231 skb->dev = app->dev; in garp_pdu_init()
233 skb_reserve(skb, LL_RESERVED_SPACE(app->dev) + LLC_RESERVE); in garp_pdu_init()
238 app->pdu = skb; in garp_pdu_init()
242 static int garp_pdu_append_end_mark(struct garp_applicant *app) in garp_pdu_append_end_mark() argument
244 if (skb_tailroom(app->pdu) < sizeof(u8)) in garp_pdu_append_end_mark()
246 __skb_put_u8(app->pdu, GARP_END_MARK); in garp_pdu_append_end_mark()
250 static void garp_pdu_queue(struct garp_applicant *app) in garp_pdu_queue() argument
252 if (!app->pdu) in garp_pdu_queue()
255 garp_pdu_append_end_mark(app); in garp_pdu_queue()
256 garp_pdu_append_end_mark(app); in garp_pdu_queue()
258 llc_pdu_header_init(app->pdu, LLC_PDU_TYPE_U, LLC_SAP_BSPAN, in garp_pdu_queue()
260 llc_pdu_init_as_ui_cmd(app->pdu); in garp_pdu_queue()
261 llc_mac_hdr_init(app->pdu, app->dev->dev_addr, in garp_pdu_queue()
262 app->app->proto.group_address); in garp_pdu_queue()
264 skb_queue_tail(&app->queue, app->pdu); in garp_pdu_queue()
265 app->pdu = NULL; in garp_pdu_queue()
268 static void garp_queue_xmit(struct garp_applicant *app) in garp_queue_xmit() argument
272 while ((skb = skb_dequeue(&app->queue))) in garp_queue_xmit()
276 static int garp_pdu_append_msg(struct garp_applicant *app, u8 attrtype) in garp_pdu_append_msg() argument
280 if (skb_tailroom(app->pdu) < sizeof(*gm)) in garp_pdu_append_msg()
282 gm = __skb_put(app->pdu, sizeof(*gm)); in garp_pdu_append_msg()
284 garp_cb(app->pdu)->cur_type = attrtype; in garp_pdu_append_msg()
288 static int garp_pdu_append_attr(struct garp_applicant *app, in garp_pdu_append_attr() argument
296 if (!app->pdu) { in garp_pdu_append_attr()
297 err = garp_pdu_init(app); in garp_pdu_append_attr()
302 if (garp_cb(app->pdu)->cur_type != attr->type) { in garp_pdu_append_attr()
303 if (garp_cb(app->pdu)->cur_type && in garp_pdu_append_attr()
304 garp_pdu_append_end_mark(app) < 0) in garp_pdu_append_attr()
306 if (garp_pdu_append_msg(app, attr->type) < 0) in garp_pdu_append_attr()
311 if (skb_tailroom(app->pdu) < len) in garp_pdu_append_attr()
313 ga = __skb_put(app->pdu, len); in garp_pdu_append_attr()
320 garp_pdu_queue(app); in garp_pdu_append_attr()
324 static void garp_attr_event(struct garp_applicant *app, in garp_attr_event() argument
339 if (garp_pdu_append_attr(app, attr, GARP_JOIN_IN) < 0) in garp_attr_event()
343 garp_pdu_append_attr(app, attr, GARP_LEAVE_EMPTY); in garp_attr_event()
346 garp_attr_destroy(app, attr); in garp_attr_event()
360 struct garp_applicant *app = rtnl_dereference(port->applicants[appl->type]); in garp_request_join() local
363 spin_lock_bh(&app->lock); in garp_request_join()
364 attr = garp_attr_create(app, data, len, type); in garp_request_join()
366 spin_unlock_bh(&app->lock); in garp_request_join()
369 garp_attr_event(app, attr, GARP_EVENT_REQ_JOIN); in garp_request_join()
370 spin_unlock_bh(&app->lock); in garp_request_join()
380 struct garp_applicant *app = rtnl_dereference(port->applicants[appl->type]); in garp_request_leave() local
383 spin_lock_bh(&app->lock); in garp_request_leave()
384 attr = garp_attr_lookup(app, data, len, type); in garp_request_leave()
386 spin_unlock_bh(&app->lock); in garp_request_leave()
389 garp_attr_event(app, attr, GARP_EVENT_REQ_LEAVE); in garp_request_leave()
390 spin_unlock_bh(&app->lock); in garp_request_leave()
394 static void garp_gid_event(struct garp_applicant *app, enum garp_event event) in garp_gid_event() argument
399 for (node = rb_first(&app->gid); in garp_gid_event()
403 garp_attr_event(app, attr, event); in garp_gid_event()
407 static void garp_join_timer_arm(struct garp_applicant *app) in garp_join_timer_arm() argument
412 mod_timer(&app->join_timer, jiffies + delay); in garp_join_timer_arm()
417 struct garp_applicant *app = from_timer(app, t, join_timer); in garp_join_timer() local
419 spin_lock(&app->lock); in garp_join_timer()
420 garp_gid_event(app, GARP_EVENT_TRANSMIT_PDU); in garp_join_timer()
421 garp_pdu_queue(app); in garp_join_timer()
422 spin_unlock(&app->lock); in garp_join_timer()
424 garp_queue_xmit(app); in garp_join_timer()
425 garp_join_timer_arm(app); in garp_join_timer()
439 static int garp_pdu_parse_attr(struct garp_applicant *app, struct sk_buff *skb, in garp_pdu_parse_attr() argument
458 if (attrtype > app->app->maxattr) in garp_pdu_parse_attr()
465 garp_gid_event(app, GARP_EVENT_R_LEAVE_EMPTY); in garp_pdu_parse_attr()
485 attr = garp_attr_lookup(app, ga->data, dlen, attrtype); in garp_pdu_parse_attr()
488 garp_attr_event(app, attr, event); in garp_pdu_parse_attr()
492 static int garp_pdu_parse_msg(struct garp_applicant *app, struct sk_buff *skb) in garp_pdu_parse_msg() argument
504 if (garp_pdu_parse_attr(app, skb, gm->attrtype) < 0) in garp_pdu_parse_msg()
517 struct garp_applicant *app; in garp_pdu_rcv() local
523 app = rcu_dereference(port->applicants[appl->type]); in garp_pdu_rcv()
524 if (!app) in garp_pdu_rcv()
534 spin_lock(&app->lock); in garp_pdu_rcv()
536 if (garp_pdu_parse_msg(app, skb) < 0) in garp_pdu_rcv()
541 spin_unlock(&app->lock); in garp_pdu_rcv()
572 struct garp_applicant *app; in garp_init_applicant() local
584 app = kzalloc(sizeof(*app), GFP_KERNEL); in garp_init_applicant()
585 if (!app) in garp_init_applicant()
592 app->dev = dev; in garp_init_applicant()
593 app->app = appl; in garp_init_applicant()
594 app->gid = RB_ROOT; in garp_init_applicant()
595 spin_lock_init(&app->lock); in garp_init_applicant()
596 skb_queue_head_init(&app->queue); in garp_init_applicant()
597 rcu_assign_pointer(dev->garp_port->applicants[appl->type], app); in garp_init_applicant()
598 timer_setup(&app->join_timer, garp_join_timer, 0); in garp_init_applicant()
599 garp_join_timer_arm(app); in garp_init_applicant()
603 kfree(app); in garp_init_applicant()
614 struct garp_applicant *app = rtnl_dereference(port->applicants[appl->type]); in garp_uninit_applicant() local
622 timer_shutdown_sync(&app->join_timer); in garp_uninit_applicant()
624 spin_lock_bh(&app->lock); in garp_uninit_applicant()
625 garp_gid_event(app, GARP_EVENT_TRANSMIT_PDU); in garp_uninit_applicant()
626 garp_attr_destroy_all(app); in garp_uninit_applicant()
627 garp_pdu_queue(app); in garp_uninit_applicant()
628 spin_unlock_bh(&app->lock); in garp_uninit_applicant()
630 garp_queue_xmit(app); in garp_uninit_applicant()
633 kfree_rcu(app, rcu); in garp_uninit_applicant()