mtcp_register_callback 3 2017-02-02 "Linux" "mOS Library Functions Manual"
NAME
mtcp_register_callback - register/de-register a callback function on a specified hook point
SYNOPSIS
#include <mos_api.h> "int mtcp_register_callback(mctx_t " mctx ", int " sockid ", event_t " event ", int " hook_point ", callback_t " cb );
DESCRIPTION
mtcp_register_callback () registers a callback handler, "cb", for a monitoring socket referred to by the "sockid" descriptor. A user can register the callback handler in any one of the three available hook points as shown below:

Hook points
Type:Description
MOS_HK_RCV:
Trigger point right after receiver side stack update.
MOS_HK_SND:
Trigger point right after sender side stack update
MOS_NULL:
Trigger point for connection-less IP traffic

A user can register for relevant built-in or custom user-defined events (see mtcp_define_event()) of interest. The "event" argument is a typedef'ed uint64_t integer. mOS provides the following built-in events that a user can employ:

Events
Type:Description
MOS_ON_PKT_IN:
Packet arrival.
MOS_ON_CONN_START:
Connection initiation (the first SYN packet).
MOS_ON_REXMIT:
TCP packet retransmission.
MOS_ON_TCP_STATE_CHANGE:
TCP state transition.
MOS_ON_CONN_END:
Connection termination.
MOS_ON_CONN_NEW_DATA:
New flow data.
MOS_ON_ORPHAN:
Out-of-flow (or non-TCP) packet arrival.
MOS_ON_ERROR:
Error report (e.g. receive buffer full (see
mtcp_peek())). T} .TE

All events, with the exception of MOS_ON_ORPHAN, can be used for stream monitoring sockets. The mOS stack internally manages the client and the server networking stacks as the ongoing traffic passes through the middlebox. A user-registered callback, "cb", is invoked whenever a relevant network event is detected by the underlying stack. The user is expected to define the callback handler and is expected to add monitoring application logic pertaining to the triggered event. The callback handler is a function pointer of type: "typedef void (*callback_t)(mctx_t " mctx ", int " sock ", int " side ", event_t " event ); The "side" variable informs the user exactly which flow of the connection is currently in context. This can either be MOS_SIDE_CLI (the client side) or MOS_SIDE_SVR (the server side). Callback functions generated from raw monitoring sockets (MOS_SOCK_MONITOR_RAW) only provide MOS_NULL as the value of the side argument, while the only available event for such sockets is MOS_ON_ORPHAN.

A user can dynamically de-register the event callback handler from any monitoring socket, during the life time of the connection, by calling mtcp_register_callback() with the "cb" argument set as NULL. A typical usage of mtcp_register_callback() is illustrated below:

/*************************************************/ monitor_filter_t ft = {0}; int s; // create a passive monitoring socket with its scope s = mtcp_socket(m, AF_INET, MOS_SOCK_MONITOR_STREAM, 0); ft.stream_syn_filter = "dst net 216.58 and dst port 80"; mtcp_bind_monitor_filter(m, s, &ft); // sets up an event handler for MOS_ON_REXMIT mtcp_register_callback(m, s, MOS_ON_REXMIT, MOS_HK_RCV, OnRexmitPkt); /*************************************************/ """""""""""""""""""""""""""""""""""""""""""""""""""""""""""

RETURN VALUE
Returns 0 on success; -1 on failure. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""".SH CONFORMING TO
""""POSIX.1-2001.
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
ERRORS

15 "EINVAL" The socket descriptor, "sockid" is invalid. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

AUTHORS
mOS development team <[email protected]> """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
SEE ALSO
mtcp_socket (), mtcp_bind_monitor_filter (), mtcp_register_callback () """""""""""""""""""""""""""""""""""""""""""""""""""""
COLOPHON
This page is part of mOS release 0.3 "docs" section. A description of the project, and information about reporting bugs, can be found at \%http://mos.kaist.edu/. """""""""""""""""""""""""""""""""""""""""""""""""""""