diff options
Diffstat (limited to 'metis/ccnx/forwarder/metis/processor/metis_Tap.h')
-rw-r--r-- | metis/ccnx/forwarder/metis/processor/metis_Tap.h | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/metis/ccnx/forwarder/metis/processor/metis_Tap.h b/metis/ccnx/forwarder/metis/processor/metis_Tap.h new file mode 100644 index 00000000..052f9556 --- /dev/null +++ b/metis/ccnx/forwarder/metis/processor/metis_Tap.h @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * The MetisForwarder supports a Tap that will inspect all messages passing through the + * forwarder. See metisForwarder_AddTap() and metisForwarder_RemoveTap(). + * + * + * Example: + * @code + * { + * struct testTap_s { + * bool callOnReceive; + * unsigned onReceiveCount; + * } testTap; + * + * static bool + * testTap_IsTapOnReceive(const MetisTap *tap) + * { + * struct testTap_s *mytap = (struct testTap_s *) tap->context; + * return mytap->callOnReceive; + * } + * + * static void + * testTap_TapOnReceive(MetisTap *tap, const MetisMessage *message) + * { + * struct testTap_s *mytap = (struct testTap_s *) tap->context; + * mytap->onReceiveCount++; + * mytap->lastMessage = message; + * } + * + * MetisTap testTapTemplate = { + * .context = &testTap, + * .isTapOnReceive = &testTap_IsTapOnReceive, + * .isTapOnSend = NULL, + * .isTapOnDrop = NULL, + * .tapOnReceive = &testTap_TapOnReceive, + * .tapOnSend = NULL, + * .tapOnDrop = NULL + * }; + * + * } + * @endcode + * + */ + +#ifndef Metis_metis_Tap_h +#define Metis_metis_Tap_h + +struct metis_tap; + + +typedef struct metis_tap MetisTap; + +/** + * Defines callbacks for message taps + * + * Each of the taps (tapOnReceive, tapOnSend, tapOnDrop) may be NULL. + * if a tap is not null, then the correspnoding isX function must be non-null. The isX functions + * allow turning on/off particular calls depending on user preference. + */ +struct metis_tap { + + /** + * A user-defined parameter + */ + void *context; + + /** + * Determines if the tapOnReceive() function should be called + * + * If *tapOnReceive is non-null, this function must be defined too. + * + * @param [in] MetisTap The tap structure + * + * @return true call the tap function + * @return false Do not call the tap function. + */ + bool (*isTapOnReceive)(const MetisTap *tap); + + /** + * Determines if the tapOnSend() function should be called + * + * If *tapOnSend is non-null, this function must be defined too. + * + * @param [in] MetisTap The tap structure + * + * @return true call the tap function + * @return false Do not call the tap function. + */ + bool (*isTapOnSend)(const MetisTap *tap); + + /** + * Determines if the tapOnDrop() function should be called + * + * If *tapOnDrop is non-null, this function must be defined too. + * + * @param [in] MetisTap The tap structure + * + * @return true call the tap function + * @return false Do not call the tap function. + */ + bool (*isTapOnDrop)(const MetisTap *tap); + + /** + * Called for each message entering the message processor. May be NULL. + * + * @param [in] MetisTap The tap structure + */ + void (*tapOnReceive)(MetisTap *tap, const MetisMessage *message); + + /** + * Called for each message forwarded by the message processor. May be NULL. + * + * @param [in] MetisTap The tap structure + */ + void (*tapOnSend)(MetisTap *tap, const MetisMessage *message); + + /** + * Called for each message dropped by the message processor. May be NULL. + * + * @param [in] MetisTap The tap structure + */ + void (*tapOnDrop)(MetisTap *tap, const MetisMessage *message); +}; + + +#endif // Metis_metis_Tap_h |