Lines Matching refs:fl

60 #define for_each_fl_rcu(hash, fl)				\  argument
61 for (fl = rcu_dereference_bh(fl_ht[(hash)]); \
62 fl != NULL; \
63 fl = rcu_dereference_bh(fl->next))
64 #define for_each_fl_continue_rcu(fl) \ argument
65 for (fl = rcu_dereference_bh(fl->next); \
66 fl != NULL; \
67 fl = rcu_dereference_bh(fl->next))
76 struct ip6_flowlabel *fl; in __fl_lookup() local
78 for_each_fl_rcu(FL_HASH(label), fl) { in __fl_lookup()
79 if (fl->label == label && net_eq(fl->fl_net, net)) in __fl_lookup()
80 return fl; in __fl_lookup()
87 struct ip6_flowlabel *fl; in fl_lookup() local
90 fl = __fl_lookup(net, label); in fl_lookup()
91 if (fl && !atomic_inc_not_zero(&fl->users)) in fl_lookup()
92 fl = NULL; in fl_lookup()
94 return fl; in fl_lookup()
98 static void fl_free(struct ip6_flowlabel *fl) in fl_free() argument
100 if (fl) { in fl_free()
101 if (fl->share == IPV6_FL_S_PROCESS) in fl_free()
102 put_pid(fl->owner.pid); in fl_free()
103 kfree(fl->opt); in fl_free()
104 kfree_rcu(fl, rcu); in fl_free()
108 static void fl_release(struct ip6_flowlabel *fl) in fl_release() argument
112 fl->lastuse = jiffies; in fl_release()
113 if (atomic_dec_and_test(&fl->users)) { in fl_release()
114 unsigned long ttd = fl->lastuse + fl->linger; in fl_release()
115 if (time_after(ttd, fl->expires)) in fl_release()
116 fl->expires = ttd; in fl_release()
117 ttd = fl->expires; in fl_release()
118 if (fl->opt && fl->share == IPV6_FL_S_EXCL) { in fl_release()
119 struct ipv6_txoptions *opt = fl->opt; in fl_release()
120 fl->opt = NULL; in fl_release()
139 struct ip6_flowlabel *fl; in ip6_fl_gc() local
143 while ((fl = rcu_dereference_protected(*flp, in ip6_fl_gc()
145 if (atomic_read(&fl->users) == 0) { in ip6_fl_gc()
146 unsigned long ttd = fl->lastuse + fl->linger; in ip6_fl_gc()
147 if (time_after(ttd, fl->expires)) in ip6_fl_gc()
148 fl->expires = ttd; in ip6_fl_gc()
149 ttd = fl->expires; in ip6_fl_gc()
151 *flp = fl->next; in ip6_fl_gc()
152 fl_free(fl); in ip6_fl_gc()
159 flp = &fl->next; in ip6_fl_gc()
176 struct ip6_flowlabel *fl; in ip6_fl_purge() local
180 while ((fl = rcu_dereference_protected(*flp, in ip6_fl_purge()
182 if (net_eq(fl->fl_net, net) && in ip6_fl_purge()
183 atomic_read(&fl->users) == 0) { in ip6_fl_purge()
184 *flp = fl->next; in ip6_fl_purge()
185 fl_free(fl); in ip6_fl_purge()
189 flp = &fl->next; in ip6_fl_purge()
196 struct ip6_flowlabel *fl, __be32 label) in fl_intern()
200 fl->label = label & IPV6_FLOWLABEL_MASK; in fl_intern()
205 fl->label = htonl(prandom_u32())&IPV6_FLOWLABEL_MASK; in fl_intern()
206 if (fl->label) { in fl_intern()
207 lfl = __fl_lookup(net, fl->label); in fl_intern()
221 lfl = __fl_lookup(net, fl->label); in fl_intern()
229 fl->lastuse = jiffies; in fl_intern()
230 fl->next = fl_ht[FL_HASH(fl->label)]; in fl_intern()
231 rcu_assign_pointer(fl_ht[FL_HASH(fl->label)], fl); in fl_intern()
250 struct ip6_flowlabel *fl = sfl->fl; in fl6_sock_lookup() local
251 if (fl->label == label) { in fl6_sock_lookup()
252 fl->lastuse = jiffies; in fl6_sock_lookup()
253 atomic_inc(&fl->users); in fl6_sock_lookup()
255 return fl; in fl6_sock_lookup()
277 fl_release(sfl->fl); in fl6_free_socklist()
295 struct ip6_flowlabel *fl, in fl6_merge_options() argument
298 struct ipv6_txoptions *fl_opt = fl->opt; in fl6_merge_options()
331 static int fl6_renew(struct ip6_flowlabel *fl, unsigned long linger, unsigned long expires) in fl6_renew() argument
341 fl->lastuse = jiffies; in fl6_renew()
342 if (time_before(fl->linger, linger)) in fl6_renew()
343 fl->linger = linger; in fl6_renew()
344 if (time_before(expires, fl->linger)) in fl6_renew()
345 expires = fl->linger; in fl6_renew()
346 if (time_before(fl->expires, fl->lastuse + expires)) in fl6_renew()
347 fl->expires = fl->lastuse + expires; in fl6_renew()
357 struct ip6_flowlabel *fl = NULL; in fl_create() local
368 fl = kzalloc(sizeof(*fl), GFP_KERNEL); in fl_create()
369 if (!fl) in fl_create()
378 fl->opt = kmalloc(sizeof(*fl->opt) + olen, GFP_KERNEL); in fl_create()
379 if (!fl->opt) in fl_create()
382 memset(fl->opt, 0, sizeof(*fl->opt)); in fl_create()
383 fl->opt->tot_len = sizeof(*fl->opt) + olen; in fl_create()
385 if (copy_from_user(fl->opt+1, optval+CMSG_ALIGN(sizeof(*freq)), olen)) in fl_create()
389 msg.msg_control = (void *)(fl->opt+1); in fl_create()
392 err = ip6_datagram_send_ctl(net, sk, &msg, &flowi6, fl->opt, in fl_create()
397 if (fl->opt->opt_flen) in fl_create()
399 if (fl->opt->opt_nflen == 0) { in fl_create()
400 kfree(fl->opt); in fl_create()
401 fl->opt = NULL; in fl_create()
405 fl->fl_net = net; in fl_create()
406 fl->expires = jiffies; in fl_create()
407 err = fl6_renew(fl, freq->flr_linger, freq->flr_expires); in fl_create()
410 fl->share = freq->flr_share; in fl_create()
417 fl->dst = freq->flr_dst; in fl_create()
418 atomic_set(&fl->users, 1); in fl_create()
419 switch (fl->share) { in fl_create()
424 fl->owner.pid = get_task_pid(current, PIDTYPE_PID); in fl_create()
427 fl->owner.uid = current_euid(); in fl_create()
433 return fl; in fl_create()
436 fl_free(fl); in fl_create()
466 struct ip6_flowlabel *fl) in fl_link() argument
469 sfl->fl = fl; in fl_link()
494 if (sfl->fl->label == (np->flow_label & IPV6_FLOWLABEL_MASK)) { in ipv6_flowlabel_opt_get()
496 freq->flr_label = sfl->fl->label; in ipv6_flowlabel_opt_get()
497 freq->flr_dst = sfl->fl->dst; in ipv6_flowlabel_opt_get()
498 freq->flr_share = sfl->fl->share; in ipv6_flowlabel_opt_get()
499 freq->flr_expires = (sfl->fl->expires - jiffies) / HZ; in ipv6_flowlabel_opt_get()
500 freq->flr_linger = sfl->fl->linger / HZ; in ipv6_flowlabel_opt_get()
521 struct ip6_flowlabel *fl, *fl1 = NULL; in ipv6_flowlabel_opt() local
546 if (sfl->fl->label == freq.flr_label) { in ipv6_flowlabel_opt()
551 fl_release(sfl->fl); in ipv6_flowlabel_opt()
562 if (sfl->fl->label == freq.flr_label) { in ipv6_flowlabel_opt()
563 err = fl6_renew(sfl->fl, freq.flr_linger, freq.flr_expires); in ipv6_flowlabel_opt()
572 fl = fl_lookup(net, freq.flr_label); in ipv6_flowlabel_opt()
573 if (fl) { in ipv6_flowlabel_opt()
574 err = fl6_renew(fl, freq.flr_linger, freq.flr_expires); in ipv6_flowlabel_opt()
575 fl_release(fl); in ipv6_flowlabel_opt()
603 fl = fl_create(net, sk, &freq, optval, optlen, &err); in ipv6_flowlabel_opt()
604 if (!fl) in ipv6_flowlabel_opt()
612 if (sfl->fl->label == freq.flr_label) { in ipv6_flowlabel_opt()
617 fl1 = sfl->fl; in ipv6_flowlabel_opt()
633 fl1->share != fl->share || in ipv6_flowlabel_opt()
635 (fl1->owner.pid == fl->owner.pid)) || in ipv6_flowlabel_opt()
637 uid_eq(fl1->owner.uid, fl->owner.uid))) in ipv6_flowlabel_opt()
643 if (fl->linger > fl1->linger) in ipv6_flowlabel_opt()
644 fl1->linger = fl->linger; in ipv6_flowlabel_opt()
645 if ((long)(fl->expires - fl1->expires) > 0) in ipv6_flowlabel_opt()
646 fl1->expires = fl->expires; in ipv6_flowlabel_opt()
648 fl_free(fl); in ipv6_flowlabel_opt()
668 fl1 = fl_intern(net, fl, freq.flr_label); in ipv6_flowlabel_opt()
674 &fl->label, sizeof(fl->label))) { in ipv6_flowlabel_opt()
679 fl_link(np, sfl1, fl); in ipv6_flowlabel_opt()
687 fl_free(fl); in ipv6_flowlabel_opt()
704 struct ip6_flowlabel *fl = NULL; in ip6fl_get_first() local
709 for_each_fl_rcu(state->bucket, fl) { in ip6fl_get_first()
710 if (net_eq(fl->fl_net, net)) in ip6fl_get_first()
714 fl = NULL; in ip6fl_get_first()
716 return fl; in ip6fl_get_first()
719 static struct ip6_flowlabel *ip6fl_get_next(struct seq_file *seq, struct ip6_flowlabel *fl) in ip6fl_get_next() argument
724 for_each_fl_continue_rcu(fl) { in ip6fl_get_next()
725 if (net_eq(fl->fl_net, net)) in ip6fl_get_next()
731 for_each_fl_rcu(state->bucket, fl) { in ip6fl_get_next()
732 if (net_eq(fl->fl_net, net)) in ip6fl_get_next()
737 fl = NULL; in ip6fl_get_next()
740 return fl; in ip6fl_get_next()
745 struct ip6_flowlabel *fl = ip6fl_get_first(seq); in ip6fl_get_idx() local
746 if (fl) in ip6fl_get_idx()
747 while (pos && (fl = ip6fl_get_next(seq, fl)) != NULL) in ip6fl_get_idx()
749 return pos ? NULL : fl; in ip6fl_get_idx()
761 struct ip6_flowlabel *fl; in ip6fl_seq_next() local
764 fl = ip6fl_get_first(seq); in ip6fl_seq_next()
766 fl = ip6fl_get_next(seq, v); in ip6fl_seq_next()
768 return fl; in ip6fl_seq_next()
783 struct ip6_flowlabel *fl = v; in ip6fl_seq_show() local
786 (unsigned int)ntohl(fl->label), in ip6fl_seq_show()
787 fl->share, in ip6fl_seq_show()
788 ((fl->share == IPV6_FL_S_PROCESS) ? in ip6fl_seq_show()
789 pid_nr_ns(fl->owner.pid, state->pid_ns) : in ip6fl_seq_show()
790 ((fl->share == IPV6_FL_S_USER) ? in ip6fl_seq_show()
791 from_kuid_munged(seq_user_ns(seq), fl->owner.uid) : in ip6fl_seq_show()
793 atomic_read(&fl->users), in ip6fl_seq_show()
794 fl->linger/HZ, in ip6fl_seq_show()
795 (long)(fl->expires - jiffies)/HZ, in ip6fl_seq_show()
796 &fl->dst, in ip6fl_seq_show()
797 fl->opt ? fl->opt->opt_nflen : 0); in ip6fl_seq_show()