Annotation of embedaddon/strongswan/src/libcharon/bus/bus.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2012-2016 Tobias Brunner
        !             3:  * Copyright (C) 2006-2009 Martin Willi
        !             4:  * HSR Hochschule fuer Technik Rapperswil
        !             5:  *
        !             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>.
        !            10:  *
        !            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
        !            14:  * for more details.
        !            15:  */
        !            16: 
        !            17: /**
        !            18:  * @defgroup bus bus
        !            19:  * @{ @ingroup libcharon
        !            20:  */
        !            21: 
        !            22: #ifndef BUS_H_
        !            23: #define BUS_H_
        !            24: 
        !            25: typedef enum alert_t alert_t;
        !            26: typedef enum narrow_hook_t narrow_hook_t;
        !            27: typedef struct bus_t bus_t;
        !            28: 
        !            29: #include <stdarg.h>
        !            30: 
        !            31: #include <utils/debug.h>
        !            32: #include <sa/ike_sa.h>
        !            33: #include <sa/child_sa.h>
        !            34: #include <processing/jobs/job.h>
        !            35: #include <bus/listeners/logger.h>
        !            36: #include <bus/listeners/listener.h>
        !            37: 
        !            38: /* undefine the definitions from libstrongswan */
        !            39: #undef DBG0
        !            40: #undef DBG1
        !            41: #undef DBG2
        !            42: #undef DBG3
        !            43: #undef DBG4
        !            44: 
        !            45: #ifndef DEBUG_LEVEL
        !            46: # define DEBUG_LEVEL 4
        !            47: #endif /* DEBUG_LEVEL */
        !            48: 
        !            49: #if DEBUG_LEVEL >= 0
        !            50: #define DBG0(group, format, ...) charon->bus->log(charon->bus, group, 0, format, ##__VA_ARGS__)
        !            51: #endif /* DEBUG_LEVEL >= 0 */
        !            52: #if DEBUG_LEVEL >= 1
        !            53: #define DBG1(group, format, ...) charon->bus->log(charon->bus, group, 1, format, ##__VA_ARGS__)
        !            54: #endif /* DEBUG_LEVEL >= 1 */
        !            55: #if DEBUG_LEVEL >= 2
        !            56: #define DBG2(group, format, ...) charon->bus->log(charon->bus, group, 2, format, ##__VA_ARGS__)
        !            57: #endif /* DEBUG_LEVEL >= 2 */
        !            58: #if DEBUG_LEVEL >= 3
        !            59: #define DBG3(group, format, ...) charon->bus->log(charon->bus, group, 3, format, ##__VA_ARGS__)
        !            60: #endif /* DEBUG_LEVEL >= 3 */
        !            61: #if DEBUG_LEVEL >= 4
        !            62: #define DBG4(group, format, ...) charon->bus->log(charon->bus, group, 4, format, ##__VA_ARGS__)
        !            63: #endif /* DEBUG_LEVEL >= 4 */
        !            64: 
        !            65: #ifndef DBG0
        !            66: # define DBG0(...) {}
        !            67: #endif /* DBG0 */
        !            68: #ifndef DBG1
        !            69: # define DBG1(...) {}
        !            70: #endif /* DBG1 */
        !            71: #ifndef DBG2
        !            72: # define DBG2(...) {}
        !            73: #endif /* DBG2 */
        !            74: #ifndef DBG3
        !            75: # define DBG3(...) {}
        !            76: #endif /* DBG3 */
        !            77: #ifndef DBG4
        !            78: # define DBG4(...) {}
        !            79: #endif /* DBG4 */
        !            80: 
        !            81: /**
        !            82:  * Kind of alerts to raise.
        !            83:  */
        !            84: enum alert_t {
        !            85:        /** a RADIUS server did not respond, no additional arguments */
        !            86:        ALERT_RADIUS_NOT_RESPONDING,
        !            87:        /** a shutdown signal has been received, argument is the signal (int) */
        !            88:        ALERT_SHUTDOWN_SIGNAL,
        !            89:        /** local peer authentication failed (by us or by peer), no arguments */
        !            90:        ALERT_LOCAL_AUTH_FAILED,
        !            91:        /** peer authentication failed, no arguments */
        !            92:        ALERT_PEER_AUTH_FAILED,
        !            93:        /** failed to resolve peer address, no arguments */
        !            94:        ALERT_PEER_ADDR_FAILED,
        !            95:        /** peer did not respond to initial message, current try (int, 0-based) */
        !            96:        ALERT_PEER_INIT_UNREACHABLE,
        !            97:        /** received IKE message with invalid SPI, argument is message_t* */
        !            98:        ALERT_INVALID_IKE_SPI,
        !            99:        /** received IKE message with invalid header, argument is message_t* */
        !           100:        ALERT_PARSE_ERROR_HEADER,
        !           101:        /** received IKE message with invalid body, argument is message_t*,
        !           102:         *  followed by a status_t result returned by message_t.parse_body(). */
        !           103:        ALERT_PARSE_ERROR_BODY,
        !           104:        /** sending a retransmit for a message, arguments are packet_t and number
        !           105:         * of the retransmit, if the message got fragmented only the first fragment
        !           106:         * is passed */
        !           107:        ALERT_RETRANSMIT_SEND,
        !           108:        /** received response for retransmitted request, argument is packet_t, if
        !           109:         * the message got fragmented only the first fragment is passed */
        !           110:        ALERT_RETRANSMIT_SEND_CLEARED,
        !           111:        /** sending retransmits timed out, argument is packet_t, if available and if
        !           112:         *  the message got fragmented only the first fragment is passed */
        !           113:        ALERT_RETRANSMIT_SEND_TIMEOUT,
        !           114:        /** received a retransmit for a message, argument is message_t */
        !           115:        ALERT_RETRANSMIT_RECEIVE,
        !           116:        /** received half-open timeout before IKE_SA established, no argument */
        !           117:        ALERT_HALF_OPEN_TIMEOUT,
        !           118:        /** IKE proposals do not match, argument is linked_list_t of proposal_t */
        !           119:        ALERT_PROPOSAL_MISMATCH_IKE,
        !           120:        /** CHILD proposals do not match, argument is linked_list_t of proposal_t */
        !           121:        ALERT_PROPOSAL_MISMATCH_CHILD,
        !           122:        /** traffic selectors do not match, arguments are two linked_list_t
        !           123:         *  containing traffic_selector_t for initiator and for responder */
        !           124:        ALERT_TS_MISMATCH,
        !           125:        /** traffic selectors have been narrowed by the peer, arguments are
        !           126:         *  an int (TRUE for local TS), a linked_list_t* (final TS list), and the
        !           127:         *  child_cfg_t*. */
        !           128:        ALERT_TS_NARROWED,
        !           129:        /** Installation of IPsec SAs failed, argument is child_sa_t */
        !           130:        ALERT_INSTALL_CHILD_SA_FAILED,
        !           131:        /** Installation of IPsec Policy failed, argument is child_sa_t */
        !           132:        ALERT_INSTALL_CHILD_POLICY_FAILED,
        !           133:        /** IKE_SA deleted because of "replace" unique policy, no argument */
        !           134:        ALERT_UNIQUE_REPLACE,
        !           135:        /** IKE_SA deleted because of "keep" unique policy, no argument */
        !           136:        ALERT_UNIQUE_KEEP,
        !           137:        /** IKE_SA kept on failed child SA establishment, argument is an int (!=0 if
        !           138:         * first child SA) */
        !           139:        ALERT_KEEP_ON_CHILD_SA_FAILURE,
        !           140:        /** allocating virtual IP failed, linked_list_t of host_t requested */
        !           141:        ALERT_VIP_FAILURE,
        !           142:        /** an authorize() hook failed, no argument */
        !           143:        ALERT_AUTHORIZATION_FAILED,
        !           144:        /** IKE_SA hit the hard lifetime limit before it could be rekeyed */
        !           145:        ALERT_IKE_SA_EXPIRED,
        !           146:        /** Certificate rejected; it has expired, certificate_t */
        !           147:        ALERT_CERT_EXPIRED,
        !           148:        /** Certificate rejected; it has been revoked, certificate_t */
        !           149:        ALERT_CERT_REVOKED,
        !           150:        /** Validating certificate status failed, certificate_t */
        !           151:        ALERT_CERT_VALIDATION_FAILED,
        !           152:        /** Certificate rejected; no trusted issuer found, certificate_t */
        !           153:        ALERT_CERT_NO_ISSUER,
        !           154:        /** Certificate rejected; root not trusted, certificate_t */
        !           155:        ALERT_CERT_UNTRUSTED_ROOT,
        !           156:        /** Certificate rejected; trustchain length exceeds limit, certificate_t */
        !           157:        ALERT_CERT_EXCEEDED_PATH_LEN,
        !           158:        /** Certificate rejected; other policy violation, certificate_t */
        !           159:        ALERT_CERT_POLICY_VIOLATION,
        !           160: };
        !           161: 
        !           162: /**
        !           163:  * Kind of narrow hook.
        !           164:  *
        !           165:  * There is a non-authenticated (IKE_AUTH) and a authenticated
        !           166:  * (CREATE_CHILD_SA) narrowing hook for the initiator. Only one of these
        !           167:  * hooks is invoked before the exchange.
        !           168:  * To verify the traffic selectors negotiated, each PRE hook has a POST
        !           169:  * counterpart that follows. POST hooks are invoked with an authenticated peer.
        !           170:  * It is usually not a good idea to narrow in the POST hooks,
        !           171:  * as the resulting traffic selector is not negotiated and results
        !           172:  * in non-matching policies.
        !           173:  */
        !           174: enum narrow_hook_t {
        !           175:        /** invoked as initiator before exchange, peer is not yet authenticated */
        !           176:        NARROW_INITIATOR_PRE_NOAUTH,
        !           177:        /** invoked as initiator before exchange, peer is authenticated */
        !           178:        NARROW_INITIATOR_PRE_AUTH,
        !           179:        /** invoked as responder during exchange, peer is authenticated */
        !           180:        NARROW_RESPONDER,
        !           181:        /** invoked as responder after exchange, peer is authenticated */
        !           182:        NARROW_RESPONDER_POST,
        !           183:        /** invoked as initiator after exchange, follows a INITIATOR_PRE_NOAUTH */
        !           184:        NARROW_INITIATOR_POST_NOAUTH,
        !           185:        /** invoked as initiator after exchange, follows a INITIATOR_PRE_AUTH */
        !           186:        NARROW_INITIATOR_POST_AUTH,
        !           187: };
        !           188: 
        !           189: /**
        !           190:  * The bus receives events and sends them to all registered listeners.
        !           191:  *
        !           192:  * Loggers are handled separately.
        !           193:  */
        !           194: struct bus_t {
        !           195: 
        !           196:        /**
        !           197:         * Register a listener to the bus.
        !           198:         *
        !           199:         * A registered listener receives all events which are sent to the bus.
        !           200:         * The listener is passive; the thread which emitted the event
        !           201:         * processes the listener routine.
        !           202:         *
        !           203:         * @param listener      listener to register.
        !           204:         */
        !           205:        void (*add_listener) (bus_t *this, listener_t *listener);
        !           206: 
        !           207:        /**
        !           208:         * Unregister a listener from the bus.
        !           209:         *
        !           210:         * @param listener      listener to unregister.
        !           211:         */
        !           212:        void (*remove_listener) (bus_t *this, listener_t *listener);
        !           213: 
        !           214:        /**
        !           215:         * Register a logger with the bus.
        !           216:         *
        !           217:         * The logger is passive; the thread which emitted the event
        !           218:         * processes the logger routine.  This routine may be called concurrently
        !           219:         * by multiple threads.  Recursive calls are not prevented, so logger that
        !           220:         * may cause recursive calls are responsible to avoid infinite loops.
        !           221:         *
        !           222:         * During registration get_level() is called for all log groups and the
        !           223:         * logger is registered to receive log messages for groups for which
        !           224:         * the requested log level is > LEVEL_SILENT and whose level is lower
        !           225:         * or equal than the requested level.
        !           226:         *
        !           227:         * To update the registered log levels call add_logger again with the
        !           228:         * same logger and return the new levels from get_level().
        !           229:         *
        !           230:         * @param logger        logger to register.
        !           231:         */
        !           232:        void (*add_logger) (bus_t *this, logger_t *logger);
        !           233: 
        !           234:        /**
        !           235:         * Unregister a logger from the bus.
        !           236:         *
        !           237:         * @param logger        logger to unregister.
        !           238:         */
        !           239:        void (*remove_logger) (bus_t *this, logger_t *logger);
        !           240: 
        !           241:        /**
        !           242:         * Set the IKE_SA the calling thread is using.
        !           243:         *
        !           244:         * To associate a received log message with an IKE_SA without passing it as
        !           245:         * parameter each time, the thread registers the currently used IKE_SA
        !           246:         * during check-out. Before check-in, the thread unregisters the IKE_SA.
        !           247:         * This IKE_SA is stored per-thread, so each thread has its own IKE_SA
        !           248:         * registered.
        !           249:         *
        !           250:         * @param ike_sa        ike_sa to register, or NULL to unregister
        !           251:         */
        !           252:        void (*set_sa) (bus_t *this, ike_sa_t *ike_sa);
        !           253: 
        !           254:        /**
        !           255:         * Get the IKE_SA the calling thread is currently using.
        !           256:         *
        !           257:         * If a thread currently does not know what IKE_SA it is processing,
        !           258:         * it can call get_sa() to look up the SA set during checkout via set_sa().
        !           259:         *
        !           260:         * @return                      registered ike_sa, NULL if none registered
        !           261:         */
        !           262:        ike_sa_t* (*get_sa)(bus_t *this);
        !           263: 
        !           264:        /**
        !           265:         * Send a log message to the bus.
        !           266:         *
        !           267:         * The format string specifies an additional informational or error
        !           268:         * message with a printf() like variable argument list.
        !           269:         * Use the DBG() macros.
        !           270:         *
        !           271:         * @param group         debugging group
        !           272:         * @param level         verbosity level of the signal
        !           273:         * @param format        printf() style format string
        !           274:         * @param ...           printf() style argument list
        !           275:         */
        !           276:        void (*log)(bus_t *this, debug_t group, level_t level, char* format, ...);
        !           277: 
        !           278:        /**
        !           279:         * Send a log message to the bus using va_list arguments.
        !           280:         *
        !           281:         * Same as bus_t.log(), but uses va_list argument list.
        !           282:         *
        !           283:         * @param group         kind of the signal (up, down, rekeyed, ...)
        !           284:         * @param level         verbosity level of the signal
        !           285:         * @param format        printf() style format string
        !           286:         * @param args          va_list arguments
        !           287:         */
        !           288:        void (*vlog)(bus_t *this, debug_t group, level_t level,
        !           289:                                 char* format, va_list args);
        !           290: 
        !           291:        /**
        !           292:         * Raise an alert over the bus.
        !           293:         *
        !           294:         * @param alert         kind of alert
        !           295:         * @param ...           alert specific arguments
        !           296:         */
        !           297:        void (*alert)(bus_t *this, alert_t alert, ...);
        !           298: 
        !           299:        /**
        !           300:         * Send a IKE_SA state change event to the bus.
        !           301:         *
        !           302:         * @param ike_sa        IKE_SA which changes its state
        !           303:         * @param state         new state IKE_SA changes to
        !           304:         */
        !           305:        void (*ike_state_change)(bus_t *this, ike_sa_t *ike_sa,
        !           306:                                                         ike_sa_state_t state);
        !           307:        /**
        !           308:         * Send a CHILD_SA state change event to the bus.
        !           309:         *
        !           310:         * @param child_sa      CHILD_SA which changes its state
        !           311:         * @param state         new state CHILD_SA changes to
        !           312:         */
        !           313:        void (*child_state_change)(bus_t *this, child_sa_t *child_sa,
        !           314:                                                           child_sa_state_t state);
        !           315:        /**
        !           316:         * Message send/receive hook.
        !           317:         *
        !           318:         * The hook is invoked twice for each message: Once with plain, parsed data
        !           319:         * and once encoded and encrypted.
        !           320:         *
        !           321:         * @param message       message to send/receive
        !           322:         * @param incoming      TRUE for incoming messages, FALSE for outgoing
        !           323:         * @param plain         TRUE if message is parsed and decrypted, FALSE it not
        !           324:         */
        !           325:        void (*message)(bus_t *this, message_t *message, bool incoming, bool plain);
        !           326: 
        !           327:        /**
        !           328:         * IKE_SA authorization hook.
        !           329:         *
        !           330:         * @param final         TRUE if this is the final invocation
        !           331:         * @return                      TRUE to establish IKE_SA, FALSE to send AUTH_FAILED
        !           332:         */
        !           333:        bool (*authorize)(bus_t *this, bool final);
        !           334: 
        !           335:        /**
        !           336:         * CHILD_SA traffic selector narrowing hook.
        !           337:         *
        !           338:         * @param child_sa      CHILD_SA set up with these traffic selectors
        !           339:         * @param type          type of hook getting invoked
        !           340:         * @param local         list of local traffic selectors to narrow
        !           341:         * @param remote        list of remote traffic selectors to narrow
        !           342:         */
        !           343:        void (*narrow)(bus_t *this, child_sa_t *child_sa, narrow_hook_t type,
        !           344:                                   linked_list_t *local, linked_list_t *remote);
        !           345: 
        !           346:        /**
        !           347:         * IKE_SA keymat hook.
        !           348:         *
        !           349:         * @param ike_sa        IKE_SA this keymat belongs to
        !           350:         * @param dh            diffie hellman shared secret
        !           351:         * @param dh_other      others DH public value (IKEv1 only)
        !           352:         * @param nonce_i       initiator's nonce
        !           353:         * @param nonce_r       responder's nonce
        !           354:         * @param rekey         IKE_SA we are rekeying, if any (IKEv2 only)
        !           355:         * @param shared        shared key used for key derivation (IKEv1-PSK only)
        !           356:         * @param method        auth method for key derivation (IKEv1-non-PSK only)
        !           357:         */
        !           358:        void (*ike_keys)(bus_t *this, ike_sa_t *ike_sa, diffie_hellman_t *dh,
        !           359:                                         chunk_t dh_other, chunk_t nonce_i, chunk_t nonce_r,
        !           360:                                         ike_sa_t *rekey, shared_key_t *shared,
        !           361:                                         auth_method_t method);
        !           362: 
        !           363:        /**
        !           364:         * IKE_SA derived keys hook.
        !           365:         *
        !           366:         * @param sk_ei         SK_ei, or Ka for IKEv1
        !           367:         * @param sk_er         SK_er
        !           368:         * @param sk_ai         SK_ai, or SKEYID_a for IKEv1
        !           369:         * @param sk_ar         SK_ar
        !           370:         */
        !           371:        void (*ike_derived_keys)(bus_t *this, chunk_t sk_ei, chunk_t sk_er,
        !           372:                                                         chunk_t sk_ai, chunk_t sk_ar);
        !           373: 
        !           374:        /**
        !           375:         * CHILD_SA keymat hook.
        !           376:         *
        !           377:         * @param child_sa      CHILD_SA this keymat is used for
        !           378:         * @param initiator     initiator of the CREATE_CHILD_SA exchange
        !           379:         * @param dh            diffie hellman shared secret
        !           380:         * @param nonce_i       initiator's nonce
        !           381:         * @param nonce_r       responder's nonce
        !           382:         */
        !           383:        void (*child_keys)(bus_t *this, child_sa_t *child_sa, bool initiator,
        !           384:                                           diffie_hellman_t *dh, chunk_t nonce_i, chunk_t nonce_r);
        !           385: 
        !           386:        /**
        !           387:         * CHILD_SA derived keys hook.
        !           388:         *
        !           389:         * @param child_sa      CHILD_SA these keys are used for
        !           390:         * @param initiator     initiator of the CREATE_CHILD_SA exchange
        !           391:         * @param encr_i        initiator's encryption key
        !           392:         * @param encr_o        responder's encryption key
        !           393:         * @param integ_i       initiator's integrity key
        !           394:         * @param integ_r       responder's integrity key
        !           395:         */
        !           396:        void (*child_derived_keys)(bus_t *this, child_sa_t *child_sa,
        !           397:                                                           bool initiator, chunk_t encr_i, chunk_t encr_r,
        !           398:                                                           chunk_t integ_i, chunk_t integ_r);
        !           399: 
        !           400:        /**
        !           401:         * IKE_SA up/down hook.
        !           402:         *
        !           403:         * @param ike_sa        IKE_SA coming up/going down
        !           404:         * @param up            TRUE for an up event, FALSE for a down event
        !           405:         */
        !           406:        void (*ike_updown)(bus_t *this, ike_sa_t *ike_sa, bool up);
        !           407: 
        !           408:        /**
        !           409:         * IKE_SA rekeying hook.
        !           410:         *
        !           411:         * @param old           rekeyed and obsolete IKE_SA
        !           412:         * @param new           new IKE_SA replacing old
        !           413:         */
        !           414:        void (*ike_rekey)(bus_t *this, ike_sa_t *old, ike_sa_t *new);
        !           415: 
        !           416:        /**
        !           417:         * IKE_SA peer endpoint update hook.
        !           418:         *
        !           419:         * @param ike_sa        updated IKE_SA, having old endpoints set
        !           420:         * @param local         TRUE if local endpoint gets updated, FALSE for remote
        !           421:         * @param new           new endpoint address and port
        !           422:         */
        !           423:        void (*ike_update)(bus_t *this, ike_sa_t *ike_sa, bool local, host_t *new);
        !           424: 
        !           425:        /**
        !           426:         * IKE_SA reestablishing hook (before resolving hosts).
        !           427:         *
        !           428:         * @param old           reestablished and obsolete IKE_SA
        !           429:         * @param new           new IKE_SA replacing old
        !           430:         */
        !           431:        void (*ike_reestablish_pre)(bus_t *this, ike_sa_t *old, ike_sa_t *new);
        !           432: 
        !           433:        /**
        !           434:         * IKE_SA reestablishing hook (after configuring and initiating the new
        !           435:         * IKE_SA).
        !           436:         *
        !           437:         * @param old           reestablished and obsolete IKE_SA
        !           438:         * @param new           new IKE_SA replacing old
        !           439:         * @param initiated     TRUE if initiated successfully, FALSE otherwise
        !           440:         */
        !           441:        void (*ike_reestablish_post)(bus_t *this, ike_sa_t *old, ike_sa_t *new,
        !           442:                                                                 bool initiated);
        !           443: 
        !           444:        /**
        !           445:         * CHILD_SA up/down hook.
        !           446:         *
        !           447:         * @param child_sa      CHILD_SA coming up/going down
        !           448:         * @param up            TRUE for an up event, FALSE for a down event
        !           449:         */
        !           450:        void (*child_updown)(bus_t *this, child_sa_t *child_sa, bool up);
        !           451: 
        !           452:        /**
        !           453:         * CHILD_SA rekeying hook.
        !           454:         *
        !           455:         * @param old           rekeyed and obsolete CHILD_SA
        !           456:         * @param new           new CHILD_SA replacing old
        !           457:         */
        !           458:        void (*child_rekey)(bus_t *this, child_sa_t *old, child_sa_t *new);
        !           459: 
        !           460:        /**
        !           461:         * CHILD_SA migration hook.
        !           462:         *
        !           463:         * @param new           ID of new SA when called for the old, NULL otherwise
        !           464:         * @param unique        unique ID of new SA when called for the old, 0 otherwise
        !           465:         */
        !           466:        void (*children_migrate)(bus_t *this, ike_sa_id_t *new, uint32_t unique);
        !           467: 
        !           468:        /**
        !           469:         * Virtual IP assignment hook.
        !           470:         *
        !           471:         * @param ike_sa        IKE_SA the VIPs are assigned to
        !           472:         * @param assign        TRUE if assigned to IKE_SA, FALSE if released
        !           473:         */
        !           474:        void (*assign_vips)(bus_t *this, ike_sa_t *ike_sa, bool assign);
        !           475: 
        !           476:        /**
        !           477:         * Virtual IP handler hook.
        !           478:         *
        !           479:         * @param ike_sa        IKE_SA the VIPs/attributes got handled on
        !           480:         * @param assign        TRUE after installing attributes, FALSE on release
        !           481:         */
        !           482:        void (*handle_vips)(bus_t *this, ike_sa_t *ike_sa, bool handle);
        !           483: 
        !           484:        /**
        !           485:         * Destroy the event bus.
        !           486:         */
        !           487:        void (*destroy) (bus_t *this);
        !           488: };
        !           489: 
        !           490: /**
        !           491:  * Create the event bus which forwards events to its listeners.
        !           492:  *
        !           493:  * @return             event bus instance
        !           494:  */
        !           495: bus_t *bus_create();
        !           496: 
        !           497: #endif /** BUS_H_ @}*/

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>