2 * Copyright (C) 2011-2015 Tobias Brunner
3 * Copyright (C) 2006 Martin Willi
4 * Hochschule fuer Technik Rapperswil
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 #include <threading/thread.h>
22 #include <threading/thread_value.h>
23 #include <threading/mutex.h>
24 #include <threading/rwlock.h>
27 * These operations allow us to speed up the log level checks on some platforms.
28 * In particular if acquiring the read lock is expensive even in the absence of
31 * Note that while holding the read/write lock the read does not have to be
32 * atomic as the write lock must be held to set the level.
34 #ifdef HAVE_GCC_ATOMIC_OPERATIONS
36 #define skip_level(ptr, level) (__atomic_load_n(ptr, __ATOMIC_RELAXED) < level)
37 #define set_level(ptr, val) __atomic_store_n(ptr, val, __ATOMIC_RELAXED)
39 #elif defined(HAVE_GCC_SYNC_OPERATIONS)
41 #define skip_level(ptr, level) (__sync_fetch_and_add(ptr, 0) < level)
42 #define set_level(ptr, val) __sync_bool_compare_and_swap(ptr, *ptr, val)
46 #define skip_level(ptr, level) FALSE
47 #define set_level(ptr, val) ({ *ptr = val; })
51 typedef struct private_bus_t private_bus_t
;
54 * Private data of a bus_t object.
56 struct private_bus_t
{
58 * Public part of a bus_t object.
63 * List of registered listeners as entry_t.
65 linked_list_t
*listeners
;
68 * List of registered loggers for each log group as log_entry_t.
69 * Loggers are ordered by descending log level.
70 * The extra list stores all loggers so we can properly unregister them.
72 linked_list_t
*loggers
[DBG_MAX
+ 1];
75 * Maximum log level of any registered logger for each log group.
76 * This allows to check quickly if a log message has to be logged at all.
78 level_t max_level
[DBG_MAX
+ 1];
81 * Same as max level, but for loggers using the vlog() method.
83 level_t max_vlevel
[DBG_MAX
+ 1];
86 * Mutex for the list of listeners, recursively.
91 * Read-write lock for the list of loggers.
96 * Thread local storage the threads IKE_SA
98 thread_value_t
*thread_sa
;
101 typedef struct entry_t entry_t
;
109 * registered listener interface
111 listener_t
*listener
;
114 * are we currently calling this listener
120 typedef struct log_entry_t log_entry_t
;
128 * registered logger interface
133 * registered log levels per group
135 level_t levels
[DBG_MAX
];
139 METHOD(bus_t
, add_listener
, void,
140 private_bus_t
*this, listener_t
*listener
)
145 .listener
= listener
,
148 this->mutex
->lock(this->mutex
);
149 this->listeners
->insert_last(this->listeners
, entry
);
150 this->mutex
->unlock(this->mutex
);
153 METHOD(bus_t
, remove_listener
, void,
154 private_bus_t
*this, listener_t
*listener
)
156 enumerator_t
*enumerator
;
159 this->mutex
->lock(this->mutex
);
160 enumerator
= this->listeners
->create_enumerator(this->listeners
);
161 while (enumerator
->enumerate(enumerator
, &entry
))
163 if (entry
->listener
== listener
)
165 this->listeners
->remove_at(this->listeners
, enumerator
);
170 enumerator
->destroy(enumerator
);
171 this->mutex
->unlock(this->mutex
);
175 * Register a logger on the given log group according to the requested level
177 static inline void register_logger(private_bus_t
*this, debug_t group
,
180 enumerator_t
*enumerator
;
181 linked_list_t
*loggers
;
182 log_entry_t
*current
;
185 loggers
= this->loggers
[group
];
186 level
= entry
->levels
[group
];
188 enumerator
= loggers
->create_enumerator(loggers
);
189 while (enumerator
->enumerate(enumerator
, (void**)¤t
))
191 if (current
->levels
[group
] <= level
)
196 loggers
->insert_before(loggers
, enumerator
, entry
);
197 enumerator
->destroy(enumerator
);
199 if (entry
->logger
->log
)
201 set_level(&this->max_level
[group
], max(this->max_level
[group
], level
));
203 if (entry
->logger
->vlog
)
205 set_level(&this->max_vlevel
[group
],
206 max(this->max_vlevel
[group
], level
));
211 * Unregister a logger from all log groups (destroys the log_entry_t)
213 static inline void unregister_logger(private_bus_t
*this, logger_t
*logger
)
215 enumerator_t
*enumerator
;
216 linked_list_t
*loggers
;
217 log_entry_t
*entry
, *found
= NULL
;
219 loggers
= this->loggers
[DBG_MAX
];
220 enumerator
= loggers
->create_enumerator(loggers
);
221 while (enumerator
->enumerate(enumerator
, &entry
))
223 if (entry
->logger
== logger
)
225 loggers
->remove_at(loggers
, enumerator
);
230 enumerator
->destroy(enumerator
);
234 level_t level
= LEVEL_SILENT
, vlevel
= LEVEL_SILENT
;
237 for (group
= 0; group
< DBG_MAX
; group
++)
239 if (found
->levels
[group
] > LEVEL_SILENT
)
241 loggers
= this->loggers
[group
];
242 loggers
->remove(loggers
, found
, NULL
);
244 if (loggers
->get_first(loggers
, (void**)&entry
) == SUCCESS
)
246 if (entry
->logger
->log
)
248 level
= entry
->levels
[group
];
250 if (entry
->logger
->vlog
)
252 vlevel
= entry
->levels
[group
];
255 set_level(&this->max_level
[group
], level
);
256 set_level(&this->max_vlevel
[group
], vlevel
);
263 METHOD(bus_t
, add_logger
, void,
264 private_bus_t
*this, logger_t
*logger
)
273 this->log_lock
->write_lock(this->log_lock
);
274 unregister_logger(this, logger
);
275 for (group
= 0; group
< DBG_MAX
; group
++)
277 entry
->levels
[group
] = logger
->get_level(logger
, group
);
278 if (entry
->levels
[group
] > LEVEL_SILENT
)
280 register_logger(this, group
, entry
);
283 this->loggers
[DBG_MAX
]->insert_last(this->loggers
[DBG_MAX
], entry
);
284 this->log_lock
->unlock(this->log_lock
);
287 METHOD(bus_t
, remove_logger
, void,
288 private_bus_t
*this, logger_t
*logger
)
290 this->log_lock
->write_lock(this->log_lock
);
291 unregister_logger(this, logger
);
292 this->log_lock
->unlock(this->log_lock
);
295 METHOD(bus_t
, set_sa
, void,
296 private_bus_t
*this, ike_sa_t
*ike_sa
)
298 this->thread_sa
->set(this->thread_sa
, ike_sa
);
301 METHOD(bus_t
, get_sa
, ike_sa_t
*,
304 return this->thread_sa
->get(this->thread_sa
);
308 * data associated to a signal, passed to callback
311 /** associated IKE_SA */
313 /** invoking thread */
321 /** argument list if message is a format string for vlog() */
326 * logger->log() invocation as a invoke_function callback
328 static void log_cb(log_entry_t
*entry
, log_data_t
*data
)
330 if (entry
->logger
->log
&& entry
->levels
[data
->group
] >= data
->level
)
332 entry
->logger
->log(entry
->logger
, data
->group
, data
->level
,
333 data
->thread
, data
->ike_sa
, data
->message
);
338 * logger->vlog() invocation as a invoke_function callback
340 static void vlog_cb(log_entry_t
*entry
, log_data_t
*data
)
342 if (entry
->logger
->vlog
&& entry
->levels
[data
->group
] >= data
->level
)
346 va_copy(copy
, data
->args
);
347 entry
->logger
->vlog(entry
->logger
, data
->group
, data
->level
,
348 data
->thread
, data
->ike_sa
, data
->message
, copy
);
353 METHOD(bus_t
, vlog
, void,
354 private_bus_t
*this, debug_t group
, level_t level
,
355 char* format
, va_list args
)
357 linked_list_t
*loggers
;
360 /* NOTE: This is not 100% thread-safe and done here only because it is
361 * performance critical. We therefore ignore the following two issues for
362 * this particular case: 1) We might miss some log messages if another
363 * thread concurrently increases the log level or registers a new logger.
364 * 2) We might have to acquire the read lock below even if it wouldn't be
365 * necessary anymore due to another thread concurrently unregistering a
366 * logger or reducing the level. */
367 if (skip_level(&this->max_level
[group
], level
) &&
368 skip_level(&this->max_vlevel
[group
], level
))
373 this->log_lock
->read_lock(this->log_lock
);
374 loggers
= this->loggers
[group
];
376 if (this->max_level
[group
] >= level
)
381 data
.ike_sa
= this->thread_sa
->get(this->thread_sa
);
382 data
.thread
= thread_current_id();
387 va_copy(data
.args
, args
);
388 len
= vsnprintf(data
.message
, sizeof(buf
), format
, data
.args
);
390 if (len
>= sizeof(buf
))
393 data
.message
= malloc(len
);
394 va_copy(data
.args
, args
);
395 len
= vsnprintf(data
.message
, len
, format
, data
.args
);
400 loggers
->invoke_function(loggers
, (linked_list_invoke_t
)log_cb
,
403 if (data
.message
!= buf
)
408 if (this->max_vlevel
[group
] >= level
)
410 data
.ike_sa
= this->thread_sa
->get(this->thread_sa
);
411 data
.thread
= thread_current_id();
414 data
.message
= format
;
416 va_copy(data
.args
, args
);
417 loggers
->invoke_function(loggers
, (linked_list_invoke_t
)vlog_cb
, &data
);
421 this->log_lock
->unlock(this->log_lock
);
424 METHOD(bus_t
, log_
, void,
425 private_bus_t
*this, debug_t group
, level_t level
, char* format
, ...)
429 va_start(args
, format
);
430 vlog(this, group
, level
, format
, args
);
435 * unregister a listener
437 static inline void unregister_listener(private_bus_t
*this, entry_t
*entry
,
438 enumerator_t
*enumerator
)
440 this->listeners
->remove_at(this->listeners
, enumerator
);
444 METHOD(bus_t
, alert
, void,
445 private_bus_t
*this, alert_t alert
, ...)
447 enumerator_t
*enumerator
;
453 ike_sa
= this->thread_sa
->get(this->thread_sa
);
455 this->mutex
->lock(this->mutex
);
456 enumerator
= this->listeners
->create_enumerator(this->listeners
);
457 while (enumerator
->enumerate(enumerator
, &entry
))
459 if (entry
->calling
|| !entry
->listener
->alert
)
464 va_start(args
, alert
);
465 keep
= entry
->listener
->alert(entry
->listener
, ike_sa
, alert
, args
);
470 unregister_listener(this, entry
, enumerator
);
473 enumerator
->destroy(enumerator
);
474 this->mutex
->unlock(this->mutex
);
477 METHOD(bus_t
, ike_state_change
, void,
478 private_bus_t
*this, ike_sa_t
*ike_sa
, ike_sa_state_t state
)
480 enumerator_t
*enumerator
;
484 this->mutex
->lock(this->mutex
);
485 enumerator
= this->listeners
->create_enumerator(this->listeners
);
486 while (enumerator
->enumerate(enumerator
, &entry
))
488 if (entry
->calling
|| !entry
->listener
->ike_state_change
)
493 keep
= entry
->listener
->ike_state_change(entry
->listener
, ike_sa
, state
);
497 unregister_listener(this, entry
, enumerator
);
500 enumerator
->destroy(enumerator
);
501 this->mutex
->unlock(this->mutex
);
504 METHOD(bus_t
, child_state_change
, void,
505 private_bus_t
*this, child_sa_t
*child_sa
, child_sa_state_t state
)
507 enumerator_t
*enumerator
;
512 ike_sa
= this->thread_sa
->get(this->thread_sa
);
514 this->mutex
->lock(this->mutex
);
515 enumerator
= this->listeners
->create_enumerator(this->listeners
);
516 while (enumerator
->enumerate(enumerator
, &entry
))
518 if (entry
->calling
|| !entry
->listener
->child_state_change
)
523 keep
= entry
->listener
->child_state_change(entry
->listener
, ike_sa
,
528 unregister_listener(this, entry
, enumerator
);
531 enumerator
->destroy(enumerator
);
532 this->mutex
->unlock(this->mutex
);
535 METHOD(bus_t
, message
, void,
536 private_bus_t
*this, message_t
*message
, bool incoming
, bool plain
)
538 enumerator_t
*enumerator
;
543 ike_sa
= this->thread_sa
->get(this->thread_sa
);
545 this->mutex
->lock(this->mutex
);
546 enumerator
= this->listeners
->create_enumerator(this->listeners
);
547 while (enumerator
->enumerate(enumerator
, &entry
))
549 if (entry
->calling
|| !entry
->listener
->message
)
554 keep
= entry
->listener
->message(entry
->listener
, ike_sa
,
555 message
, incoming
, plain
);
559 unregister_listener(this, entry
, enumerator
);
562 enumerator
->destroy(enumerator
);
563 this->mutex
->unlock(this->mutex
);
566 METHOD(bus_t
, ike_keys
, void,
567 private_bus_t
*this, ike_sa_t
*ike_sa
, diffie_hellman_t
*dh
,
568 chunk_t dh_other
, chunk_t nonce_i
, chunk_t nonce_r
,
569 ike_sa_t
*rekey
, shared_key_t
*shared
)
571 enumerator_t
*enumerator
;
575 this->mutex
->lock(this->mutex
);
576 enumerator
= this->listeners
->create_enumerator(this->listeners
);
577 while (enumerator
->enumerate(enumerator
, &entry
))
579 if (entry
->calling
|| !entry
->listener
->ike_keys
)
584 keep
= entry
->listener
->ike_keys(entry
->listener
, ike_sa
, dh
, dh_other
,
585 nonce_i
, nonce_r
, rekey
, shared
);
589 unregister_listener(this, entry
, enumerator
);
592 enumerator
->destroy(enumerator
);
593 this->mutex
->unlock(this->mutex
);
596 METHOD(bus_t
, child_keys
, void,
597 private_bus_t
*this, child_sa_t
*child_sa
, bool initiator
,
598 diffie_hellman_t
*dh
, chunk_t nonce_i
, chunk_t nonce_r
)
600 enumerator_t
*enumerator
;
605 ike_sa
= this->thread_sa
->get(this->thread_sa
);
607 this->mutex
->lock(this->mutex
);
608 enumerator
= this->listeners
->create_enumerator(this->listeners
);
609 while (enumerator
->enumerate(enumerator
, &entry
))
611 if (entry
->calling
|| !entry
->listener
->child_keys
)
616 keep
= entry
->listener
->child_keys(entry
->listener
, ike_sa
,
617 child_sa
, initiator
, dh
, nonce_i
, nonce_r
);
621 unregister_listener(this, entry
, enumerator
);
624 enumerator
->destroy(enumerator
);
625 this->mutex
->unlock(this->mutex
);
628 METHOD(bus_t
, child_updown
, void,
629 private_bus_t
*this, child_sa_t
*child_sa
, bool up
)
631 enumerator_t
*enumerator
;
636 ike_sa
= this->thread_sa
->get(this->thread_sa
);
638 this->mutex
->lock(this->mutex
);
639 enumerator
= this->listeners
->create_enumerator(this->listeners
);
640 while (enumerator
->enumerate(enumerator
, &entry
))
642 if (entry
->calling
|| !entry
->listener
->child_updown
)
647 keep
= entry
->listener
->child_updown(entry
->listener
,
648 ike_sa
, child_sa
, up
);
652 unregister_listener(this, entry
, enumerator
);
655 enumerator
->destroy(enumerator
);
656 this->mutex
->unlock(this->mutex
);
659 METHOD(bus_t
, child_rekey
, void,
660 private_bus_t
*this, child_sa_t
*old
, child_sa_t
*new)
662 enumerator_t
*enumerator
;
667 ike_sa
= this->thread_sa
->get(this->thread_sa
);
669 this->mutex
->lock(this->mutex
);
670 enumerator
= this->listeners
->create_enumerator(this->listeners
);
671 while (enumerator
->enumerate(enumerator
, &entry
))
673 if (entry
->calling
|| !entry
->listener
->child_rekey
)
678 keep
= entry
->listener
->child_rekey(entry
->listener
, ike_sa
,
683 unregister_listener(this, entry
, enumerator
);
686 enumerator
->destroy(enumerator
);
687 this->mutex
->unlock(this->mutex
);
690 METHOD(bus_t
, children_migrate
, void,
691 private_bus_t
*this, ike_sa_id_t
*new, u_int32_t unique
)
693 enumerator_t
*enumerator
;
698 ike_sa
= this->thread_sa
->get(this->thread_sa
);
700 this->mutex
->lock(this->mutex
);
701 enumerator
= this->listeners
->create_enumerator(this->listeners
);
702 while (enumerator
->enumerate(enumerator
, &entry
))
704 if (entry
->calling
|| !entry
->listener
->children_migrate
)
709 keep
= entry
->listener
->children_migrate(entry
->listener
, ike_sa
, new,
714 unregister_listener(this, entry
, enumerator
);
717 enumerator
->destroy(enumerator
);
718 this->mutex
->unlock(this->mutex
);
721 METHOD(bus_t
, ike_updown
, void,
722 private_bus_t
*this, ike_sa_t
*ike_sa
, bool up
)
724 enumerator_t
*enumerator
;
728 this->mutex
->lock(this->mutex
);
729 enumerator
= this->listeners
->create_enumerator(this->listeners
);
730 while (enumerator
->enumerate(enumerator
, &entry
))
732 if (entry
->calling
|| !entry
->listener
->ike_updown
)
737 keep
= entry
->listener
->ike_updown(entry
->listener
, ike_sa
, up
);
741 unregister_listener(this, entry
, enumerator
);
744 enumerator
->destroy(enumerator
);
745 this->mutex
->unlock(this->mutex
);
747 /* a down event for IKE_SA implicitly downs all CHILD_SAs */
750 enumerator_t
*enumerator
;
751 child_sa_t
*child_sa
;
753 enumerator
= ike_sa
->create_child_sa_enumerator(ike_sa
);
754 while (enumerator
->enumerate(enumerator
, (void**)&child_sa
))
756 child_updown(this, child_sa
, FALSE
);
758 enumerator
->destroy(enumerator
);
762 METHOD(bus_t
, ike_rekey
, void,
763 private_bus_t
*this, ike_sa_t
*old
, ike_sa_t
*new)
765 enumerator_t
*enumerator
;
769 this->mutex
->lock(this->mutex
);
770 enumerator
= this->listeners
->create_enumerator(this->listeners
);
771 while (enumerator
->enumerate(enumerator
, &entry
))
773 if (entry
->calling
|| !entry
->listener
->ike_rekey
)
778 keep
= entry
->listener
->ike_rekey(entry
->listener
, old
, new);
782 unregister_listener(this, entry
, enumerator
);
785 enumerator
->destroy(enumerator
);
786 this->mutex
->unlock(this->mutex
);
789 METHOD(bus_t
, ike_update
, void,
790 private_bus_t
*this, ike_sa_t
*ike_sa
, bool local
, host_t
*new)
792 enumerator_t
*enumerator
;
796 this->mutex
->lock(this->mutex
);
797 enumerator
= this->listeners
->create_enumerator(this->listeners
);
798 while (enumerator
->enumerate(enumerator
, &entry
))
800 if (entry
->calling
|| !entry
->listener
->ike_update
)
805 keep
= entry
->listener
->ike_update(entry
->listener
, ike_sa
, local
, new);
809 unregister_listener(this, entry
, enumerator
);
812 enumerator
->destroy(enumerator
);
813 this->mutex
->unlock(this->mutex
);
816 METHOD(bus_t
, ike_reestablish_pre
, void,
817 private_bus_t
*this, ike_sa_t
*old
, ike_sa_t
*new)
819 enumerator_t
*enumerator
;
823 this->mutex
->lock(this->mutex
);
824 enumerator
= this->listeners
->create_enumerator(this->listeners
);
825 while (enumerator
->enumerate(enumerator
, &entry
))
827 if (entry
->calling
|| !entry
->listener
->ike_reestablish_pre
)
832 keep
= entry
->listener
->ike_reestablish_pre(entry
->listener
, old
, new);
836 unregister_listener(this, entry
, enumerator
);
839 enumerator
->destroy(enumerator
);
840 this->mutex
->unlock(this->mutex
);
843 METHOD(bus_t
, ike_reestablish_post
, void,
844 private_bus_t
*this, ike_sa_t
*old
, ike_sa_t
*new, bool initiated
)
846 enumerator_t
*enumerator
;
850 this->mutex
->lock(this->mutex
);
851 enumerator
= this->listeners
->create_enumerator(this->listeners
);
852 while (enumerator
->enumerate(enumerator
, &entry
))
854 if (entry
->calling
|| !entry
->listener
->ike_reestablish_post
)
859 keep
= entry
->listener
->ike_reestablish_post(entry
->listener
, old
, new,
864 unregister_listener(this, entry
, enumerator
);
867 enumerator
->destroy(enumerator
);
868 this->mutex
->unlock(this->mutex
);
871 METHOD(bus_t
, authorize
, bool,
872 private_bus_t
*this, bool final
)
874 enumerator_t
*enumerator
;
877 bool keep
, success
= TRUE
;
879 ike_sa
= this->thread_sa
->get(this->thread_sa
);
881 this->mutex
->lock(this->mutex
);
882 enumerator
= this->listeners
->create_enumerator(this->listeners
);
883 while (enumerator
->enumerate(enumerator
, &entry
))
885 if (entry
->calling
|| !entry
->listener
->authorize
)
890 keep
= entry
->listener
->authorize(entry
->listener
, ike_sa
,
895 unregister_listener(this, entry
, enumerator
);
902 enumerator
->destroy(enumerator
);
903 this->mutex
->unlock(this->mutex
);
906 alert(this, ALERT_AUTHORIZATION_FAILED
);
911 METHOD(bus_t
, narrow
, void,
912 private_bus_t
*this, child_sa_t
*child_sa
, narrow_hook_t type
,
913 linked_list_t
*local
, linked_list_t
*remote
)
915 enumerator_t
*enumerator
;
920 ike_sa
= this->thread_sa
->get(this->thread_sa
);
922 this->mutex
->lock(this->mutex
);
923 enumerator
= this->listeners
->create_enumerator(this->listeners
);
924 while (enumerator
->enumerate(enumerator
, &entry
))
926 if (entry
->calling
|| !entry
->listener
->narrow
)
931 keep
= entry
->listener
->narrow(entry
->listener
, ike_sa
, child_sa
,
932 type
, local
, remote
);
936 unregister_listener(this, entry
, enumerator
);
939 enumerator
->destroy(enumerator
);
940 this->mutex
->unlock(this->mutex
);
943 METHOD(bus_t
, assign_vips
, void,
944 private_bus_t
*this, ike_sa_t
*ike_sa
, bool assign
)
946 enumerator_t
*enumerator
;
950 this->mutex
->lock(this->mutex
);
951 enumerator
= this->listeners
->create_enumerator(this->listeners
);
952 while (enumerator
->enumerate(enumerator
, &entry
))
954 if (entry
->calling
|| !entry
->listener
->assign_vips
)
959 keep
= entry
->listener
->assign_vips(entry
->listener
, ike_sa
, assign
);
963 unregister_listener(this, entry
, enumerator
);
966 enumerator
->destroy(enumerator
);
967 this->mutex
->unlock(this->mutex
);
970 METHOD(bus_t
, handle_vips
, void,
971 private_bus_t
*this, ike_sa_t
*ike_sa
, bool handle
)
973 enumerator_t
*enumerator
;
977 this->mutex
->lock(this->mutex
);
978 enumerator
= this->listeners
->create_enumerator(this->listeners
);
979 while (enumerator
->enumerate(enumerator
, &entry
))
981 if (entry
->calling
|| !entry
->listener
->handle_vips
)
986 keep
= entry
->listener
->handle_vips(entry
->listener
, ike_sa
, handle
);
990 unregister_listener(this, entry
, enumerator
);
993 enumerator
->destroy(enumerator
);
994 this->mutex
->unlock(this->mutex
);
998 * Credential manager hook function to forward bus alerts
1000 static void hook_creds(private_bus_t
*this, credential_hook_type_t type
,
1001 certificate_t
*cert
)
1005 case CRED_HOOK_EXPIRED
:
1006 return alert(this, ALERT_CERT_EXPIRED
, cert
);
1007 case CRED_HOOK_REVOKED
:
1008 return alert(this, ALERT_CERT_REVOKED
, cert
);
1009 case CRED_HOOK_VALIDATION_FAILED
:
1010 return alert(this, ALERT_CERT_VALIDATION_FAILED
, cert
);
1011 case CRED_HOOK_NO_ISSUER
:
1012 return alert(this, ALERT_CERT_NO_ISSUER
, cert
);
1013 case CRED_HOOK_UNTRUSTED_ROOT
:
1014 return alert(this, ALERT_CERT_UNTRUSTED_ROOT
, cert
);
1015 case CRED_HOOK_EXCEEDED_PATH_LEN
:
1016 return alert(this, ALERT_CERT_EXCEEDED_PATH_LEN
, cert
);
1017 case CRED_HOOK_POLICY_VIOLATION
:
1018 return alert(this, ALERT_CERT_POLICY_VIOLATION
, cert
);
1022 METHOD(bus_t
, destroy
, void,
1023 private_bus_t
*this)
1027 lib
->credmgr
->set_hook(lib
->credmgr
, NULL
, NULL
);
1028 for (group
= 0; group
< DBG_MAX
; group
++)
1030 this->loggers
[group
]->destroy(this->loggers
[group
]);
1032 this->loggers
[DBG_MAX
]->destroy_function(this->loggers
[DBG_MAX
],
1034 this->listeners
->destroy_function(this->listeners
, (void*)free
);
1035 this->thread_sa
->destroy(this->thread_sa
);
1036 this->log_lock
->destroy(this->log_lock
);
1037 this->mutex
->destroy(this->mutex
);
1042 * Described in header.
1046 private_bus_t
*this;
1051 .add_listener
= _add_listener
,
1052 .remove_listener
= _remove_listener
,
1053 .add_logger
= _add_logger
,
1054 .remove_logger
= _remove_logger
,
1060 .ike_state_change
= _ike_state_change
,
1061 .child_state_change
= _child_state_change
,
1062 .message
= _message
,
1063 .ike_keys
= _ike_keys
,
1064 .child_keys
= _child_keys
,
1065 .ike_updown
= _ike_updown
,
1066 .ike_rekey
= _ike_rekey
,
1067 .ike_update
= _ike_update
,
1068 .ike_reestablish_pre
= _ike_reestablish_pre
,
1069 .ike_reestablish_post
= _ike_reestablish_post
,
1070 .child_updown
= _child_updown
,
1071 .child_rekey
= _child_rekey
,
1072 .children_migrate
= _children_migrate
,
1073 .authorize
= _authorize
,
1075 .assign_vips
= _assign_vips
,
1076 .handle_vips
= _handle_vips
,
1077 .destroy
= _destroy
,
1079 .listeners
= linked_list_create(),
1080 .mutex
= mutex_create(MUTEX_TYPE_RECURSIVE
),
1081 .log_lock
= rwlock_create(RWLOCK_TYPE_DEFAULT
),
1082 .thread_sa
= thread_value_create(NULL
),
1085 for (group
= 0; group
<= DBG_MAX
; group
++)
1087 this->loggers
[group
] = linked_list_create();
1088 this->max_level
[group
] = LEVEL_SILENT
;
1089 this->max_vlevel
[group
] = LEVEL_SILENT
;
1092 lib
->credmgr
->set_hook(lib
->credmgr
, (credential_hook_t
)hook_creds
, this);
1094 return &this->public;