Lines Matching refs:gwj

351 	struct cgw_job *gwj = (struct cgw_job *)data;  in can_can_gw_rcv()  local
374 gwj->deleted_frames++; in can_can_gw_rcv()
378 if (!(gwj->dst.dev->flags & IFF_UP)) { in can_can_gw_rcv()
379 gwj->dropped_frames++; in can_can_gw_rcv()
384 if (!(gwj->flags & CGW_FLAGS_CAN_IIF_TX_OK) && in can_can_gw_rcv()
385 can_skb_prv(skb)->ifindex == gwj->dst.dev->ifindex) in can_can_gw_rcv()
394 if (gwj->mod.modfunc[0]) in can_can_gw_rcv()
400 gwj->dropped_frames++; in can_can_gw_rcv()
408 if (gwj->limit_hops && cgw_hops(nskb) == 1) in can_can_gw_rcv()
409 cgw_hops(nskb) = max_hops - gwj->limit_hops + 1; in can_can_gw_rcv()
411 nskb->dev = gwj->dst.dev; in can_can_gw_rcv()
417 while (modidx < MAX_MODFUNCTIONS && gwj->mod.modfunc[modidx]) in can_can_gw_rcv()
418 (*gwj->mod.modfunc[modidx++])(cf, &gwj->mod); in can_can_gw_rcv()
422 if (gwj->mod.csumfunc.crc8) in can_can_gw_rcv()
423 (*gwj->mod.csumfunc.crc8)(cf, &gwj->mod.csum.crc8); in can_can_gw_rcv()
425 if (gwj->mod.csumfunc.xor) in can_can_gw_rcv()
426 (*gwj->mod.csumfunc.xor)(cf, &gwj->mod.csum.xor); in can_can_gw_rcv()
430 if (!(gwj->flags & CGW_FLAGS_CAN_SRC_TSTAMP)) in can_can_gw_rcv()
434 if (can_send(nskb, gwj->flags & CGW_FLAGS_CAN_ECHO)) in can_can_gw_rcv()
435 gwj->dropped_frames++; in can_can_gw_rcv()
437 gwj->handled_frames++; in can_can_gw_rcv()
440 static inline int cgw_register_filter(struct cgw_job *gwj) in cgw_register_filter() argument
442 return can_rx_register(gwj->src.dev, gwj->ccgw.filter.can_id, in cgw_register_filter()
443 gwj->ccgw.filter.can_mask, can_can_gw_rcv, in cgw_register_filter()
444 gwj, "gw"); in cgw_register_filter()
447 static inline void cgw_unregister_filter(struct cgw_job *gwj) in cgw_unregister_filter() argument
449 can_rx_unregister(gwj->src.dev, gwj->ccgw.filter.can_id, in cgw_unregister_filter()
450 gwj->ccgw.filter.can_mask, can_can_gw_rcv, gwj); in cgw_unregister_filter()
465 struct cgw_job *gwj = NULL; in cgw_notifier() local
470 hlist_for_each_entry_safe(gwj, nx, &cgw_list, list) { in cgw_notifier()
472 if (gwj->src.dev == dev || gwj->dst.dev == dev) { in cgw_notifier()
473 hlist_del(&gwj->list); in cgw_notifier()
474 cgw_unregister_filter(gwj); in cgw_notifier()
475 kmem_cache_free(cgw_cache, gwj); in cgw_notifier()
483 static int cgw_put_job(struct sk_buff *skb, struct cgw_job *gwj, int type, in cgw_put_job() argument
496 rtcan->gwtype = gwj->gwtype; in cgw_put_job()
497 rtcan->flags = gwj->flags; in cgw_put_job()
501 if (gwj->handled_frames) { in cgw_put_job()
502 if (nla_put_u32(skb, CGW_HANDLED, gwj->handled_frames) < 0) in cgw_put_job()
506 if (gwj->dropped_frames) { in cgw_put_job()
507 if (nla_put_u32(skb, CGW_DROPPED, gwj->dropped_frames) < 0) in cgw_put_job()
511 if (gwj->deleted_frames) { in cgw_put_job()
512 if (nla_put_u32(skb, CGW_DELETED, gwj->deleted_frames) < 0) in cgw_put_job()
518 if (gwj->limit_hops) { in cgw_put_job()
519 if (nla_put_u8(skb, CGW_LIM_HOPS, gwj->limit_hops) < 0) in cgw_put_job()
523 if (gwj->mod.modtype.and) { in cgw_put_job()
524 memcpy(&mb.cf, &gwj->mod.modframe.and, sizeof(mb.cf)); in cgw_put_job()
525 mb.modtype = gwj->mod.modtype.and; in cgw_put_job()
530 if (gwj->mod.modtype.or) { in cgw_put_job()
531 memcpy(&mb.cf, &gwj->mod.modframe.or, sizeof(mb.cf)); in cgw_put_job()
532 mb.modtype = gwj->mod.modtype.or; in cgw_put_job()
537 if (gwj->mod.modtype.xor) { in cgw_put_job()
538 memcpy(&mb.cf, &gwj->mod.modframe.xor, sizeof(mb.cf)); in cgw_put_job()
539 mb.modtype = gwj->mod.modtype.xor; in cgw_put_job()
544 if (gwj->mod.modtype.set) { in cgw_put_job()
545 memcpy(&mb.cf, &gwj->mod.modframe.set, sizeof(mb.cf)); in cgw_put_job()
546 mb.modtype = gwj->mod.modtype.set; in cgw_put_job()
551 if (gwj->mod.csumfunc.crc8) { in cgw_put_job()
553 &gwj->mod.csum.crc8) < 0) in cgw_put_job()
557 if (gwj->mod.csumfunc.xor) { in cgw_put_job()
559 &gwj->mod.csum.xor) < 0) in cgw_put_job()
563 if (gwj->gwtype == CGW_TYPE_CAN_CAN) { in cgw_put_job()
565 if (gwj->ccgw.filter.can_id || gwj->ccgw.filter.can_mask) { in cgw_put_job()
567 &gwj->ccgw.filter) < 0) in cgw_put_job()
571 if (nla_put_u32(skb, CGW_SRC_IF, gwj->ccgw.src_idx) < 0) in cgw_put_job()
574 if (nla_put_u32(skb, CGW_DST_IF, gwj->ccgw.dst_idx) < 0) in cgw_put_job()
589 struct cgw_job *gwj = NULL; in cgw_dump_jobs() local
594 hlist_for_each_entry_rcu(gwj, &cgw_list, list) { in cgw_dump_jobs()
598 if (cgw_put_job(skb, gwj, RTM_NEWROUTE, NETLINK_CB(cb->skb).portid, in cgw_dump_jobs()
804 struct cgw_job *gwj; in cgw_create_job() local
822 gwj = kmem_cache_alloc(cgw_cache, GFP_KERNEL); in cgw_create_job()
823 if (!gwj) in cgw_create_job()
826 gwj->handled_frames = 0; in cgw_create_job()
827 gwj->dropped_frames = 0; in cgw_create_job()
828 gwj->deleted_frames = 0; in cgw_create_job()
829 gwj->flags = r->flags; in cgw_create_job()
830 gwj->gwtype = r->gwtype; in cgw_create_job()
832 err = cgw_parse_attr(nlh, &gwj->mod, CGW_TYPE_CAN_CAN, &gwj->ccgw, in cgw_create_job()
840 if (!gwj->ccgw.src_idx || !gwj->ccgw.dst_idx) in cgw_create_job()
843 gwj->src.dev = __dev_get_by_index(&init_net, gwj->ccgw.src_idx); in cgw_create_job()
845 if (!gwj->src.dev) in cgw_create_job()
848 if (gwj->src.dev->type != ARPHRD_CAN) in cgw_create_job()
851 gwj->dst.dev = __dev_get_by_index(&init_net, gwj->ccgw.dst_idx); in cgw_create_job()
853 if (!gwj->dst.dev) in cgw_create_job()
856 if (gwj->dst.dev->type != ARPHRD_CAN) in cgw_create_job()
859 gwj->limit_hops = limhops; in cgw_create_job()
863 err = cgw_register_filter(gwj); in cgw_create_job()
865 hlist_add_head_rcu(&gwj->list, &cgw_list); in cgw_create_job()
868 kmem_cache_free(cgw_cache, gwj); in cgw_create_job()
875 struct cgw_job *gwj = NULL; in cgw_remove_all_jobs() local
880 hlist_for_each_entry_safe(gwj, nx, &cgw_list, list) { in cgw_remove_all_jobs()
881 hlist_del(&gwj->list); in cgw_remove_all_jobs()
882 cgw_unregister_filter(gwj); in cgw_remove_all_jobs()
883 kmem_cache_free(cgw_cache, gwj); in cgw_remove_all_jobs()
889 struct cgw_job *gwj = NULL; in cgw_remove_job() local
926 hlist_for_each_entry_safe(gwj, nx, &cgw_list, list) { in cgw_remove_job()
928 if (gwj->flags != r->flags) in cgw_remove_job()
931 if (gwj->limit_hops != limhops) in cgw_remove_job()
934 if (memcmp(&gwj->mod, &mod, sizeof(mod))) in cgw_remove_job()
938 if (memcmp(&gwj->ccgw, &ccgw, sizeof(ccgw))) in cgw_remove_job()
941 hlist_del(&gwj->list); in cgw_remove_job()
942 cgw_unregister_filter(gwj); in cgw_remove_job()
943 kmem_cache_free(cgw_cache, gwj); in cgw_remove_job()