Lines Matching refs:app
150 static struct garp_attr *garp_attr_lookup(const struct garp_applicant *app, in garp_attr_lookup() argument
153 struct rb_node *parent = app->gid.rb_node; in garp_attr_lookup()
170 static struct garp_attr *garp_attr_create(struct garp_applicant *app, in garp_attr_create() argument
173 struct rb_node *parent = NULL, **p = &app->gid.rb_node; in garp_attr_create()
199 rb_insert_color(&attr->node, &app->gid); in garp_attr_create()
203 static void garp_attr_destroy(struct garp_applicant *app, struct garp_attr *attr) in garp_attr_destroy() argument
205 rb_erase(&attr->node, &app->gid); in garp_attr_destroy()
209 static int garp_pdu_init(struct garp_applicant *app) in garp_pdu_init() argument
215 skb = alloc_skb(app->dev->mtu + LL_RESERVED_SPACE(app->dev), in garp_pdu_init()
220 skb->dev = app->dev; in garp_pdu_init()
222 skb_reserve(skb, LL_RESERVED_SPACE(app->dev) + LLC_RESERVE); in garp_pdu_init()
227 app->pdu = skb; in garp_pdu_init()
231 static int garp_pdu_append_end_mark(struct garp_applicant *app) in garp_pdu_append_end_mark() argument
233 if (skb_tailroom(app->pdu) < sizeof(u8)) in garp_pdu_append_end_mark()
235 *(u8 *)__skb_put(app->pdu, sizeof(u8)) = GARP_END_MARK; in garp_pdu_append_end_mark()
239 static void garp_pdu_queue(struct garp_applicant *app) in garp_pdu_queue() argument
241 if (!app->pdu) in garp_pdu_queue()
244 garp_pdu_append_end_mark(app); in garp_pdu_queue()
245 garp_pdu_append_end_mark(app); in garp_pdu_queue()
247 llc_pdu_header_init(app->pdu, LLC_PDU_TYPE_U, LLC_SAP_BSPAN, in garp_pdu_queue()
249 llc_pdu_init_as_ui_cmd(app->pdu); in garp_pdu_queue()
250 llc_mac_hdr_init(app->pdu, app->dev->dev_addr, in garp_pdu_queue()
251 app->app->proto.group_address); in garp_pdu_queue()
253 skb_queue_tail(&app->queue, app->pdu); in garp_pdu_queue()
254 app->pdu = NULL; in garp_pdu_queue()
257 static void garp_queue_xmit(struct garp_applicant *app) in garp_queue_xmit() argument
261 while ((skb = skb_dequeue(&app->queue))) in garp_queue_xmit()
265 static int garp_pdu_append_msg(struct garp_applicant *app, u8 attrtype) in garp_pdu_append_msg() argument
269 if (skb_tailroom(app->pdu) < sizeof(*gm)) in garp_pdu_append_msg()
271 gm = (struct garp_msg_hdr *)__skb_put(app->pdu, sizeof(*gm)); in garp_pdu_append_msg()
273 garp_cb(app->pdu)->cur_type = attrtype; in garp_pdu_append_msg()
277 static int garp_pdu_append_attr(struct garp_applicant *app, in garp_pdu_append_attr() argument
285 if (!app->pdu) { in garp_pdu_append_attr()
286 err = garp_pdu_init(app); in garp_pdu_append_attr()
291 if (garp_cb(app->pdu)->cur_type != attr->type) { in garp_pdu_append_attr()
292 if (garp_cb(app->pdu)->cur_type && in garp_pdu_append_attr()
293 garp_pdu_append_end_mark(app) < 0) in garp_pdu_append_attr()
295 if (garp_pdu_append_msg(app, attr->type) < 0) in garp_pdu_append_attr()
300 if (skb_tailroom(app->pdu) < len) in garp_pdu_append_attr()
302 ga = (struct garp_attr_hdr *)__skb_put(app->pdu, len); in garp_pdu_append_attr()
309 garp_pdu_queue(app); in garp_pdu_append_attr()
313 static void garp_attr_event(struct garp_applicant *app, in garp_attr_event() argument
328 if (garp_pdu_append_attr(app, attr, GARP_JOIN_IN) < 0) in garp_attr_event()
332 garp_pdu_append_attr(app, attr, GARP_LEAVE_EMPTY); in garp_attr_event()
335 garp_attr_destroy(app, attr); in garp_attr_event()
349 struct garp_applicant *app = rtnl_dereference(port->applicants[appl->type]); in garp_request_join() local
352 spin_lock_bh(&app->lock); in garp_request_join()
353 attr = garp_attr_create(app, data, len, type); in garp_request_join()
355 spin_unlock_bh(&app->lock); in garp_request_join()
358 garp_attr_event(app, attr, GARP_EVENT_REQ_JOIN); in garp_request_join()
359 spin_unlock_bh(&app->lock); in garp_request_join()
369 struct garp_applicant *app = rtnl_dereference(port->applicants[appl->type]); in garp_request_leave() local
372 spin_lock_bh(&app->lock); in garp_request_leave()
373 attr = garp_attr_lookup(app, data, len, type); in garp_request_leave()
375 spin_unlock_bh(&app->lock); in garp_request_leave()
378 garp_attr_event(app, attr, GARP_EVENT_REQ_LEAVE); in garp_request_leave()
379 spin_unlock_bh(&app->lock); in garp_request_leave()
383 static void garp_gid_event(struct garp_applicant *app, enum garp_event event) in garp_gid_event() argument
388 for (node = rb_first(&app->gid); in garp_gid_event()
392 garp_attr_event(app, attr, event); in garp_gid_event()
396 static void garp_join_timer_arm(struct garp_applicant *app) in garp_join_timer_arm() argument
401 mod_timer(&app->join_timer, jiffies + delay); in garp_join_timer_arm()
406 struct garp_applicant *app = (struct garp_applicant *)data; in garp_join_timer() local
408 spin_lock(&app->lock); in garp_join_timer()
409 garp_gid_event(app, GARP_EVENT_TRANSMIT_PDU); in garp_join_timer()
410 garp_pdu_queue(app); in garp_join_timer()
411 spin_unlock(&app->lock); in garp_join_timer()
413 garp_queue_xmit(app); in garp_join_timer()
414 garp_join_timer_arm(app); in garp_join_timer()
428 static int garp_pdu_parse_attr(struct garp_applicant *app, struct sk_buff *skb, in garp_pdu_parse_attr() argument
447 if (attrtype > app->app->maxattr) in garp_pdu_parse_attr()
454 garp_gid_event(app, GARP_EVENT_R_LEAVE_EMPTY); in garp_pdu_parse_attr()
474 attr = garp_attr_lookup(app, ga->data, dlen, attrtype); in garp_pdu_parse_attr()
477 garp_attr_event(app, attr, event); in garp_pdu_parse_attr()
481 static int garp_pdu_parse_msg(struct garp_applicant *app, struct sk_buff *skb) in garp_pdu_parse_msg() argument
493 if (garp_pdu_parse_attr(app, skb, gm->attrtype) < 0) in garp_pdu_parse_msg()
506 struct garp_applicant *app; in garp_pdu_rcv() local
512 app = rcu_dereference(port->applicants[appl->type]); in garp_pdu_rcv()
513 if (!app) in garp_pdu_rcv()
523 spin_lock(&app->lock); in garp_pdu_rcv()
525 if (garp_pdu_parse_msg(app, skb) < 0) in garp_pdu_rcv()
530 spin_unlock(&app->lock); in garp_pdu_rcv()
561 struct garp_applicant *app; in garp_init_applicant() local
573 app = kzalloc(sizeof(*app), GFP_KERNEL); in garp_init_applicant()
574 if (!app) in garp_init_applicant()
581 app->dev = dev; in garp_init_applicant()
582 app->app = appl; in garp_init_applicant()
583 app->gid = RB_ROOT; in garp_init_applicant()
584 spin_lock_init(&app->lock); in garp_init_applicant()
585 skb_queue_head_init(&app->queue); in garp_init_applicant()
586 rcu_assign_pointer(dev->garp_port->applicants[appl->type], app); in garp_init_applicant()
587 setup_timer(&app->join_timer, garp_join_timer, (unsigned long)app); in garp_init_applicant()
588 garp_join_timer_arm(app); in garp_init_applicant()
592 kfree(app); in garp_init_applicant()
603 struct garp_applicant *app = rtnl_dereference(port->applicants[appl->type]); in garp_uninit_applicant() local
611 del_timer_sync(&app->join_timer); in garp_uninit_applicant()
613 spin_lock_bh(&app->lock); in garp_uninit_applicant()
614 garp_gid_event(app, GARP_EVENT_TRANSMIT_PDU); in garp_uninit_applicant()
615 garp_pdu_queue(app); in garp_uninit_applicant()
616 spin_unlock_bh(&app->lock); in garp_uninit_applicant()
618 garp_queue_xmit(app); in garp_uninit_applicant()
621 kfree_rcu(app, rcu); in garp_uninit_applicant()