Lines Matching refs:f
1410 static unsigned int fanout_demux_hash(struct packet_fanout *f, in fanout_demux_hash() argument
1417 static unsigned int fanout_demux_lb(struct packet_fanout *f, in fanout_demux_lb() argument
1421 unsigned int val = atomic_inc_return(&f->rr_cur); in fanout_demux_lb()
1426 static unsigned int fanout_demux_cpu(struct packet_fanout *f, in fanout_demux_cpu() argument
1433 static unsigned int fanout_demux_rnd(struct packet_fanout *f, in fanout_demux_rnd() argument
1440 static unsigned int fanout_demux_rollover(struct packet_fanout *f, in fanout_demux_rollover() argument
1448 po = pkt_sk(rcu_dereference(f->arr[idx])); in fanout_demux_rollover()
1460 po_next = pkt_sk(rcu_dereference(f->arr[i])); in fanout_demux_rollover()
1480 static unsigned int fanout_demux_qm(struct packet_fanout *f, in fanout_demux_qm() argument
1487 static unsigned int fanout_demux_bpf(struct packet_fanout *f, in fanout_demux_bpf() argument
1495 prog = rcu_dereference(f->bpf_prog); in fanout_demux_bpf()
1503 static bool fanout_has_flag(struct packet_fanout *f, u16 flag) in fanout_has_flag() argument
1505 return f->flags & (flag >> 8); in fanout_has_flag()
1511 struct packet_fanout *f = pt->af_packet_priv; in packet_rcv_fanout() local
1512 unsigned int num = READ_ONCE(f->num_members); in packet_rcv_fanout()
1513 struct net *net = read_pnet(&f->net); in packet_rcv_fanout()
1522 if (fanout_has_flag(f, PACKET_FANOUT_FLAG_DEFRAG)) { in packet_rcv_fanout()
1527 switch (f->type) { in packet_rcv_fanout()
1530 idx = fanout_demux_hash(f, skb, num); in packet_rcv_fanout()
1533 idx = fanout_demux_lb(f, skb, num); in packet_rcv_fanout()
1536 idx = fanout_demux_cpu(f, skb, num); in packet_rcv_fanout()
1539 idx = fanout_demux_rnd(f, skb, num); in packet_rcv_fanout()
1542 idx = fanout_demux_qm(f, skb, num); in packet_rcv_fanout()
1545 idx = fanout_demux_rollover(f, skb, 0, false, num); in packet_rcv_fanout()
1549 idx = fanout_demux_bpf(f, skb, num); in packet_rcv_fanout()
1553 if (fanout_has_flag(f, PACKET_FANOUT_FLAG_ROLLOVER)) in packet_rcv_fanout()
1554 idx = fanout_demux_rollover(f, skb, idx, true, num); in packet_rcv_fanout()
1556 po = pkt_sk(rcu_dereference(f->arr[idx])); in packet_rcv_fanout()
1567 struct packet_fanout *f = po->fanout; in __fanout_link() local
1569 spin_lock(&f->lock); in __fanout_link()
1570 rcu_assign_pointer(f->arr[f->num_members], sk); in __fanout_link()
1572 f->num_members++; in __fanout_link()
1573 if (f->num_members == 1) in __fanout_link()
1574 dev_add_pack(&f->prot_hook); in __fanout_link()
1575 spin_unlock(&f->lock); in __fanout_link()
1580 struct packet_fanout *f = po->fanout; in __fanout_unlink() local
1583 spin_lock(&f->lock); in __fanout_unlink()
1584 for (i = 0; i < f->num_members; i++) { in __fanout_unlink()
1585 if (rcu_dereference_protected(f->arr[i], in __fanout_unlink()
1586 lockdep_is_held(&f->lock)) == sk) in __fanout_unlink()
1589 BUG_ON(i >= f->num_members); in __fanout_unlink()
1590 rcu_assign_pointer(f->arr[i], in __fanout_unlink()
1591 rcu_dereference_protected(f->arr[f->num_members - 1], in __fanout_unlink()
1592 lockdep_is_held(&f->lock))); in __fanout_unlink()
1593 f->num_members--; in __fanout_unlink()
1594 if (f->num_members == 0) in __fanout_unlink()
1595 __dev_remove_pack(&f->prot_hook); in __fanout_unlink()
1596 spin_unlock(&f->lock); in __fanout_unlink()
1607 static void fanout_init_data(struct packet_fanout *f) in fanout_init_data() argument
1609 switch (f->type) { in fanout_init_data()
1611 atomic_set(&f->rr_cur, 0); in fanout_init_data()
1615 RCU_INIT_POINTER(f->bpf_prog, NULL); in fanout_init_data()
1620 static void __fanout_set_data_bpf(struct packet_fanout *f, struct bpf_prog *new) in __fanout_set_data_bpf() argument
1624 spin_lock(&f->lock); in __fanout_set_data_bpf()
1625 old = rcu_dereference_protected(f->bpf_prog, lockdep_is_held(&f->lock)); in __fanout_set_data_bpf()
1626 rcu_assign_pointer(f->bpf_prog, new); in __fanout_set_data_bpf()
1627 spin_unlock(&f->lock); in __fanout_set_data_bpf()
1691 static void fanout_release_data(struct packet_fanout *f) in fanout_release_data() argument
1693 switch (f->type) { in fanout_release_data()
1696 __fanout_set_data_bpf(f, NULL); in fanout_release_data()
1702 struct packet_fanout *f; in __fanout_id_is_free() local
1704 list_for_each_entry(f, &fanout_list, list) { in __fanout_id_is_free()
1705 if (f->id == candidate_id && in __fanout_id_is_free()
1706 read_pnet(&f->net) == sock_net(sk)) { in __fanout_id_is_free()
1735 struct packet_fanout *f, *match; in fanout_add() local
1789 list_for_each_entry(f, &fanout_list, list) { in fanout_add()
1790 if (f->id == id && in fanout_add()
1791 read_pnet(&f->net) == sock_net(sk)) { in fanout_add()
1792 match = f; in fanout_add()
1875 struct packet_fanout *f; in fanout_release() local
1878 f = po->fanout; in fanout_release()
1879 if (f) { in fanout_release()
1882 if (refcount_dec_and_test(&f->sk_ref)) in fanout_release()
1883 list_del(&f->list); in fanout_release()
1885 f = NULL; in fanout_release()
1889 return f; in fanout_release()
3174 struct packet_fanout *f; in packet_release() local
3214 f = fanout_release(sk); in packet_release()
3219 if (f) { in packet_release()
3220 fanout_release_data(f); in packet_release()
3221 kvfree(f); in packet_release()