Lines Matching refs:gwj

350 	struct cgw_job *gwj = (struct cgw_job *)data;  in can_can_gw_rcv()  local
373 gwj->deleted_frames++; in can_can_gw_rcv()
377 if (!(gwj->dst.dev->flags & IFF_UP)) { in can_can_gw_rcv()
378 gwj->dropped_frames++; in can_can_gw_rcv()
383 if (!(gwj->flags & CGW_FLAGS_CAN_IIF_TX_OK) && in can_can_gw_rcv()
384 can_skb_prv(skb)->ifindex == gwj->dst.dev->ifindex) in can_can_gw_rcv()
393 if (gwj->mod.modfunc[0]) in can_can_gw_rcv()
399 gwj->dropped_frames++; in can_can_gw_rcv()
407 if (gwj->limit_hops && cgw_hops(nskb) == 1) in can_can_gw_rcv()
408 cgw_hops(nskb) = max_hops - gwj->limit_hops + 1; in can_can_gw_rcv()
410 nskb->dev = gwj->dst.dev; in can_can_gw_rcv()
416 while (modidx < MAX_MODFUNCTIONS && gwj->mod.modfunc[modidx]) in can_can_gw_rcv()
417 (*gwj->mod.modfunc[modidx++])(cf, &gwj->mod); in can_can_gw_rcv()
421 if (gwj->mod.csumfunc.crc8) in can_can_gw_rcv()
422 (*gwj->mod.csumfunc.crc8)(cf, &gwj->mod.csum.crc8); in can_can_gw_rcv()
424 if (gwj->mod.csumfunc.xor) in can_can_gw_rcv()
425 (*gwj->mod.csumfunc.xor)(cf, &gwj->mod.csum.xor); in can_can_gw_rcv()
429 if (!(gwj->flags & CGW_FLAGS_CAN_SRC_TSTAMP)) in can_can_gw_rcv()
433 if (can_send(nskb, gwj->flags & CGW_FLAGS_CAN_ECHO)) in can_can_gw_rcv()
434 gwj->dropped_frames++; in can_can_gw_rcv()
436 gwj->handled_frames++; in can_can_gw_rcv()
439 static inline int cgw_register_filter(struct net *net, struct cgw_job *gwj) in cgw_register_filter() argument
441 return can_rx_register(net, gwj->src.dev, gwj->ccgw.filter.can_id, in cgw_register_filter()
442 gwj->ccgw.filter.can_mask, can_can_gw_rcv, in cgw_register_filter()
443 gwj, "gw", NULL); in cgw_register_filter()
446 static inline void cgw_unregister_filter(struct net *net, struct cgw_job *gwj) in cgw_unregister_filter() argument
448 can_rx_unregister(net, gwj->src.dev, gwj->ccgw.filter.can_id, in cgw_unregister_filter()
449 gwj->ccgw.filter.can_mask, can_can_gw_rcv, gwj); in cgw_unregister_filter()
463 struct cgw_job *gwj = NULL; in cgw_notifier() local
468 hlist_for_each_entry_safe(gwj, nx, &net->can.cgw_list, list) { in cgw_notifier()
470 if (gwj->src.dev == dev || gwj->dst.dev == dev) { in cgw_notifier()
471 hlist_del(&gwj->list); in cgw_notifier()
472 cgw_unregister_filter(net, gwj); in cgw_notifier()
473 kmem_cache_free(cgw_cache, gwj); in cgw_notifier()
481 static int cgw_put_job(struct sk_buff *skb, struct cgw_job *gwj, int type, in cgw_put_job() argument
494 rtcan->gwtype = gwj->gwtype; in cgw_put_job()
495 rtcan->flags = gwj->flags; in cgw_put_job()
499 if (gwj->handled_frames) { in cgw_put_job()
500 if (nla_put_u32(skb, CGW_HANDLED, gwj->handled_frames) < 0) in cgw_put_job()
504 if (gwj->dropped_frames) { in cgw_put_job()
505 if (nla_put_u32(skb, CGW_DROPPED, gwj->dropped_frames) < 0) in cgw_put_job()
509 if (gwj->deleted_frames) { in cgw_put_job()
510 if (nla_put_u32(skb, CGW_DELETED, gwj->deleted_frames) < 0) in cgw_put_job()
516 if (gwj->limit_hops) { in cgw_put_job()
517 if (nla_put_u8(skb, CGW_LIM_HOPS, gwj->limit_hops) < 0) in cgw_put_job()
521 if (gwj->mod.modtype.and) { in cgw_put_job()
522 memcpy(&mb.cf, &gwj->mod.modframe.and, sizeof(mb.cf)); in cgw_put_job()
523 mb.modtype = gwj->mod.modtype.and; in cgw_put_job()
528 if (gwj->mod.modtype.or) { in cgw_put_job()
529 memcpy(&mb.cf, &gwj->mod.modframe.or, sizeof(mb.cf)); in cgw_put_job()
530 mb.modtype = gwj->mod.modtype.or; in cgw_put_job()
535 if (gwj->mod.modtype.xor) { in cgw_put_job()
536 memcpy(&mb.cf, &gwj->mod.modframe.xor, sizeof(mb.cf)); in cgw_put_job()
537 mb.modtype = gwj->mod.modtype.xor; in cgw_put_job()
542 if (gwj->mod.modtype.set) { in cgw_put_job()
543 memcpy(&mb.cf, &gwj->mod.modframe.set, sizeof(mb.cf)); in cgw_put_job()
544 mb.modtype = gwj->mod.modtype.set; in cgw_put_job()
549 if (gwj->mod.uid) { in cgw_put_job()
550 if (nla_put_u32(skb, CGW_MOD_UID, gwj->mod.uid) < 0) in cgw_put_job()
554 if (gwj->mod.csumfunc.crc8) { in cgw_put_job()
556 &gwj->mod.csum.crc8) < 0) in cgw_put_job()
560 if (gwj->mod.csumfunc.xor) { in cgw_put_job()
562 &gwj->mod.csum.xor) < 0) in cgw_put_job()
566 if (gwj->gwtype == CGW_TYPE_CAN_CAN) { in cgw_put_job()
568 if (gwj->ccgw.filter.can_id || gwj->ccgw.filter.can_mask) { in cgw_put_job()
570 &gwj->ccgw.filter) < 0) in cgw_put_job()
574 if (nla_put_u32(skb, CGW_SRC_IF, gwj->ccgw.src_idx) < 0) in cgw_put_job()
577 if (nla_put_u32(skb, CGW_DST_IF, gwj->ccgw.dst_idx) < 0) in cgw_put_job()
593 struct cgw_job *gwj = NULL; in cgw_dump_jobs() local
598 hlist_for_each_entry_rcu(gwj, &net->can.cgw_list, list) { in cgw_dump_jobs()
602 if (cgw_put_job(skb, gwj, RTM_NEWROUTE, NETLINK_CB(cb->skb).portid, in cgw_dump_jobs()
815 struct cgw_job *gwj; in cgw_create_job() local
844 hlist_for_each_entry(gwj, &net->can.cgw_list, list) { in cgw_create_job()
846 if (gwj->mod.uid != mod.uid) in cgw_create_job()
850 if (memcmp(&gwj->ccgw, &ccgw, sizeof(ccgw))) in cgw_create_job()
855 memcpy(&gwj->mod, &mod, sizeof(mod)); in cgw_create_job()
865 gwj = kmem_cache_alloc(cgw_cache, GFP_KERNEL); in cgw_create_job()
866 if (!gwj) in cgw_create_job()
869 gwj->handled_frames = 0; in cgw_create_job()
870 gwj->dropped_frames = 0; in cgw_create_job()
871 gwj->deleted_frames = 0; in cgw_create_job()
872 gwj->flags = r->flags; in cgw_create_job()
873 gwj->gwtype = r->gwtype; in cgw_create_job()
874 gwj->limit_hops = limhops; in cgw_create_job()
877 memcpy(&gwj->mod, &mod, sizeof(mod)); in cgw_create_job()
878 memcpy(&gwj->ccgw, &ccgw, sizeof(ccgw)); in cgw_create_job()
882 gwj->src.dev = __dev_get_by_index(net, gwj->ccgw.src_idx); in cgw_create_job()
884 if (!gwj->src.dev) in cgw_create_job()
887 if (gwj->src.dev->type != ARPHRD_CAN) in cgw_create_job()
890 gwj->dst.dev = __dev_get_by_index(net, gwj->ccgw.dst_idx); in cgw_create_job()
892 if (!gwj->dst.dev) in cgw_create_job()
895 if (gwj->dst.dev->type != ARPHRD_CAN) in cgw_create_job()
900 err = cgw_register_filter(net, gwj); in cgw_create_job()
902 hlist_add_head_rcu(&gwj->list, &net->can.cgw_list); in cgw_create_job()
905 kmem_cache_free(cgw_cache, gwj); in cgw_create_job()
912 struct cgw_job *gwj = NULL; in cgw_remove_all_jobs() local
917 hlist_for_each_entry_safe(gwj, nx, &net->can.cgw_list, list) { in cgw_remove_all_jobs()
918 hlist_del(&gwj->list); in cgw_remove_all_jobs()
919 cgw_unregister_filter(net, gwj); in cgw_remove_all_jobs()
920 kmem_cache_free(cgw_cache, gwj); in cgw_remove_all_jobs()
928 struct cgw_job *gwj = NULL; in cgw_remove_job() local
965 hlist_for_each_entry_safe(gwj, nx, &net->can.cgw_list, list) { in cgw_remove_job()
967 if (gwj->flags != r->flags) in cgw_remove_job()
970 if (gwj->limit_hops != limhops) in cgw_remove_job()
974 if (gwj->mod.uid || mod.uid) { in cgw_remove_job()
975 if (gwj->mod.uid != mod.uid) in cgw_remove_job()
979 if (memcmp(&gwj->mod, &mod, sizeof(mod))) in cgw_remove_job()
984 if (memcmp(&gwj->ccgw, &ccgw, sizeof(ccgw))) in cgw_remove_job()
987 hlist_del(&gwj->list); in cgw_remove_job()
988 cgw_unregister_filter(net, gwj); in cgw_remove_job()
989 kmem_cache_free(cgw_cache, gwj); in cgw_remove_job()