DES-SERT - A Simple and Extensible Routing Framework for Testbeds: M E S S A G E _ H A N D L I N G

# M E S S A G E _ H A N D L I N G

EXTERNAL / PUBLIC. More...

## Defines
#define | DESSERT_FLAG_SPARSE 0x1
| flag for dessert_msg.flags - message len is hlen+plen if not set buffer len is assumed as DESSERT_MAXFRAMELEN + DESSERT_MSGPROCLEN
#define | DESSERT_LFLAG_SRC_SELF 0x0002
| flag for dessert_msg_proc.lflags - l25 src is one of our interfaces
#define | DESSERT_LFLAG_DST_MULTICAST 0x0004
| flag for dessert_msg_proc.lflags - l25 dst is multicast address
#define | DESSERT_LFLAG_DST_SELF 0x0008
| flag for dessert_msg_proc.lflags - l25 dst is one of our interfaces
#define | DESSERT_LFLAG_DST_BROADCAST 0x0010
| flag for dessert_msg_proc.lflags - l25 dst is broadcast
#define | DESSERT_LFLAG_PREVHOP_SELF 0x0020
| flag for dessert_msg_proc.lflags - l2 src is one of our interfaces
#define | DESSERT_LFLAG_NEXTHOP_SELF 0x0040
| flag for dessert_msg_proc.lflags - l2 dst is one of our interfaces
#define | DESSERT_LFLAG_NEXTHOP_BROADCAST 0x0080
| flag for dessert_msg_proc.lflags - l2 dst is broadcast
#define | DESSERT_LFLAG_DST_SELF_OVERHEARD 0x0100
| flag for dessert_msg_proc.lflags - l25 dst is one of our interfaces, but we received the message not via the indented interface, e.g.
#define | DESSERT_LFLAG_NEXTHOP_SELF_OVERHEARD 0x0200
| flag for dessert_msg_proc.lflags - l2 dst is one of our interfaces, but we received the message not via the indented interface, e.g.
#define | DESSERT_EXTLEN (sizeof(struct dessert_ext) - DESSERT_MAXEXTDATALEN)
| length of dessert_ext header
#define | DESSERT_EXT_ANY 0x00
| dessert_ext type wildcard - any extension
#define | DESSERT_EXT_ETH 0x01
| dessert_ext type for ethernet header
#define | DESSERT_EXT_TRACE 0x02
| dessert_ext type for packet tracing
#define | DESSERT_EXT_USER 0x40
| first dessert_ext type for usage by the user
#define | DESSERT_MSG_TRACE_HOST (ETHER_ADDR_LEN)
| packet tracing flag - only record hosts
#define | DESSERT_MSG_TRACE_IFACE (3*ETHER_ADDR_LEN)
| packet tracing flag - record interfaces
#define | dessert_ext_getdatalen(ext) (ext->len - DESSERT_EXTLEN)
| Returns the length of a given extension.
## Functions
int | dessert_msg_new (dessert_msg_t **msgout)
| creates a new dessert_msg_t and initializes it.
int | dessert_msg_clone (dessert_msg_t **msgnew, const dessert_msg_t *msgold, uint8_t sparse)
| generates a copy of a dessert_msg
int | dessert_msg_check (const dessert_msg_t *msg, size_t len)
| checks whether a dessert_msg is consistent
void | dessert_msg_dump (const dessert_msg_t *msg, size_t len, char *buf, size_t blen)
| dump a dessert_msg_t to a string
void | dessert_msg_destroy (dessert_msg_t *msg)
| free a dessert_msg
int | dessert_msg_ethencap (const struct ether_header *eth, size_t eth_len, dessert_msg_t **msgout)
| creates a new dessert_msg from an ethernet frame.
int | dessert_msg_ethdecap (const dessert_msg_t *msg, struct ether_header **ethout)
| extracts an ethernet frame from a dessert_msg
struct ether_header * | dessert_msg_getl25ether (const dessert_msg_t *msg)
| get the ether_header sent as DESSERT_EXT_ETH in a dessert_msg
int | dessert_msg_proc_clone (dessert_msg_proc_t **procnew, const dessert_msg_proc_t *procold)
| generates a copy of a dessert_msg_proc
void | dessert_msg_proc_dump (const dessert_msg_t *msg, size_t len, const dessert_msg_proc_t *proc, char *buf, size_t blen)
| dump a dessert_msg_t to a string
void | dessert_msg_proc_destroy (dessert_msg_proc_t *proc)
| free a dessert_prc_msg
int | dessert_msg_addpayload (dessert_msg_t *msg, void **payload, int len)
| add or replace payload to a dessert_msg
int | dessert_msg_getpayload (dessert_msg_t *msg, void **payload)
| Retrieves a pointer to the payload of a dessert message msg.
int | dessert_msg_addext (dessert_msg_t *msg, dessert_ext_t **ext, uint8_t type, size_t len)
| add an extension record to a dessert_msg
int | dessert_msg_delext (dessert_msg_t *msg, dessert_ext_t *ext)
| remove an extension record from a dessert_msg
int | dessert_msg_resizeext (dessert_msg_t *msg, dessert_ext_t *ext, size_t new_len)
| Resizes a given extension record ext within in a dessert message msg to the new length new_len.
int | dessert_msg_getext (const dessert_msg_t *msg, dessert_ext_t **ext, uint8_t type, int index)
| get an specific or all extensions
int | dessert_msg_get_ext_count (const dessert_msg_t *msg, uint8_t type)
| get an specific or all extensions
int | dessert_msg_trace_initiate (dessert_msg_t *msg, int mode)
| add initial trace header to dessert message
int | dessert_msg_trace_dump (const dessert_msg_t *msg, char *buf, int blen)
| dump packet trace to string
int | dessert_msg_dump_cb (dessert_msg_t *msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id)
| dump a dessert_msg_t to debug log
int | dessert_msg_check_cb (dessert_msg_t *msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id)
| callback that checks whether a dessert_msg is consistent
int | dessert_msg_trace_cb (dessert_msg_t *msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id)
| check if the message carries a trace extension and add the current trace info if iface is NULL, the packet is ignored
int | dessert_msg_ifaceflags_cb (dessert_msg_t *msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *riface, dessert_frameid_t id)
| callback to set the local processing flags in dessert_msg_proc_t on an arriving dessert_msg_t

## Detailed Description

EXTERNAL / PUBLIC.

## Define Documentation

#define dessert_ext_getdatalen | ( | ext |  | ) | (ext->len - DESSERT_EXTLEN)

Returns the length of a given extension.

#define DESSERT_LFLAG_DST_SELF_OVERHEARD 0x0100

flag for dessert_msg_proc.lflags - l25 dst is one of our interfaces, but we received the message not via the indented interface, e.g.

we overheard it

#define DESSERT_LFLAG_NEXTHOP_SELF_OVERHEARD 0x0200

flag for dessert_msg_proc.lflags - l2 dst is one of our interfaces, but we received the message not via the indented interface, e.g.

we overheard it

## Function Documentation

int dessert_msg_addext | ( | dessert_msg_t * | msg,
|  | dessert_ext_t ** | ext,
|  | uint8_t | type,
|  | size_t | len |
| ) |  |  |

add an extension record to a dessert_msg

- *msg the message the extension should be added to
- **ext (out) the extension pointer to the reserved extension space
- type the type of the extension
- len the length of the ext data (without 2 byte extension header)
  Returns:
    DESSERT_OK on success,

Here is the caller graph for this function:

int dessert_msg_addpayload | ( | dessert_msg_t * | msg,
|  | void ** | payload,
|  | int | len |
| ) |  |  |

add or replace payload to a dessert_msg

- *msg the message the payload should be added to
- **payload (out) the pointer to place the payload
- len the length of the payload
  Returns:
    DESSERT_OK on success, DESSERT_ERR otherwise

Here is the caller graph for this function:

int dessert_msg_check | ( | const dessert_msg_t * | msg,
|  | size_t | len |
| ) |  |  |

checks whether a dessert_msg is consistent

- msg the message to be checked
- len the length of the buffer
  Returns:
    DESSERT_OK on success
    -1 of the message is too large for the buffer
    -2 if the message was not intended to this daemon
    -3 if some extension is not consistent DESCRIPTION:

Here is the caller graph for this function:

int dessert_msg_check_cb | ( | dessert_msg_t * | msg,
|  | size_t | len,
|  | dessert_msg_proc_t * | proc,
|  | const dessert_meshif_t * | iface,
|  | dessert_frameid_t | id |
| ) |  |  |

callback that checks whether a dessert_msg is consistent

- *msg dessert_msg_t frame received
- len length of ethernet frame received
- *iface interface received packet on
  Returns:
    DESSERT_MSG_KEEP if message is valid, DESSERT_MSG_DROP otherwise

int dessert_msg_clone | ( | dessert_msg_t ** | msgnew,
|  | const dessert_msg_t * | msgold,
|  | uint8_t | sparse |
| ) |  |  |

generates a copy of a dessert_msg

- **msgnew (out) pointer to return message address
- *msgold pointer to the message to clone
- sparse whether to allocate DESSERT_MAXFRAMELEN or only hlen+plen
  Returns:
    DESSERT_OK on success, -errno otherwise

Here is the caller graph for this function:

int dessert_msg_delext | ( | dessert_msg_t * | msg,
|  | dessert_ext_t * | ext |
| ) |  |  |

remove an extension record from a dessert_msg

- *msg the message the extension should be added to
- *ext (out) the extension pointer to the extension to be removed
  Returns:
    DESSERT_OK on success,

void dessert_msg_destroy | ( | dessert_msg_t * | msg | ) |

free a dessert_msg

- *msg message to free

Here is the caller graph for this function:

void dessert_msg_dump | ( | const dessert_msg_t * | msg,
|  | size_t | len,
|  | char * | buf,
|  | size_t | blen |
| ) |  |  |

dump a dessert_msg_t to a string

- *msg the message to be dumped
- len the length of the buffer
- *buf text output buffer
- blen text output buffer length

int dessert_msg_dump_cb | ( | dessert_msg_t * | msg,
|  | size_t | len,
|  | dessert_msg_proc_t * | proc,
|  | const dessert_meshif_t * | iface,
|  | dessert_frameid_t | id |
| ) |  |  |

dump a dessert_msg_t to debug log

- *msg dessert_msg_t frame received
- len length of ethernet frame received
- *iface interface received packet on ®return DESSERT_MSG_KEEP always

int dessert_msg_ethdecap | ( | const dessert_msg_t * | msg,
|  | struct ether_header ** | ethout |
| ) |  |  |

extracts an ethernet frame from a dessert_msg

- *msg pointer to dessert_msg message to decapsulate
- **ethout (out) pointer to return ethernet message
  Returns:
    eth_len on success, -1 otherwise

Here is the caller graph for this function:

int dessert_msg_ethencap | ( | const struct ether_header * | eth,
|  | size_t | eth_len,
|  | dessert_msg_t ** | msgout |
| ) |  |  |

creates a new dessert_msg from an ethernet frame.

- *eth ethernet frame to encapsulate
- len length of the ethernet frame
- **msgout (out) pointer to return message address
  Returns:
    DESSERT_OK on success, -errno otherwise

int dessert_msg_get_ext_count | ( | const dessert_msg_t * | msg,
|  | uint8_t | type |
| ) |  |  |

get an specific or all extensions

- *msg the message
- type type of the ext to retrieve - use DESSERT_EXT_ANY to get any ext
  Returns:
    0 if the message has no such extension,
    count of extensions of that type

int dessert_msg_getext | ( | const dessert_msg_t * | msg,
|  | dessert_ext_t ** | ext,
|  | uint8_t | type,
|  | int | index |
| ) |  |  |

get an specific or all extensions

- *msg the message
- **ext (out) pointer to extracted extension sets *ext=NULL if extension not found may be NULL in this case only count/existence matters
- type type of the ext to retrieve - use DESSERT_EXT_ANY to get any ext
- index the index of the extension of that type, starting with 0
  Returns:
    0 if the message has no such extension,
    count of extensions of that type if count > index
    -count of extensions of that type if count <= index

Here is the caller graph for this function:

struct ether_header* dessert_msg_getl25ether | ( | const dessert_msg_t * | msg | ) | `[read]`

get the ether_header sent as DESSERT_EXT_ETH in a dessert_msg

- *msg the message
  Returns:
    pointer to ether_header data, NULL if DESSERT_EXT_ETH not present

Here is the caller graph for this function:

int dessert_msg_getpayload | ( | dessert_msg_t * | msg,
|  | void ** | payload |
| ) |  |  |

Retrieves a pointer to the payload of a dessert message msg.

Parameters:

  `[in]` | *msg | the message the payload should be retrieved from
  `[out]` | **payload | the pointer to place the payload in

Returns:
  the length of the payload in bytes if any, 0 otherwise

int dessert_msg_ifaceflags_cb | ( | dessert_msg_t * | msg,
|  | size_t | len,
|  | dessert_msg_proc_t * | proc,
|  | const dessert_meshif_t * | riface,
|  | dessert_frameid_t | id |
| ) |  |  |

callback to set the local processing flags in dessert_msg_proc_t on an arriving dessert_msg_t

- *msg dessert_msg_t frame received
- len length of ethernet frame received
- *iface interface received packet on ®return DESSERT_MSG_KEEP or DESSERT_MSG_NEEDMSGPROC

int dessert_msg_new | ( | dessert_msg_t ** | msgout | ) |

creates a new dessert_msg_t and initializes it.

- **msgout (out) pointer to return message address
  Returns:
    0 on success, -errno on error

Here is the caller graph for this function:

int dessert_msg_proc_clone | ( | dessert_msg_proc_t ** | procnew,
|  | const dessert_msg_proc_t * | procold |
| ) |  |  |

generates a copy of a dessert_msg_proc

- **procnew (out) pointer to return message address
- *procold pointer to the message to clone
  Returns:
    DESSERT_OK on success, -errno otherwise

void dessert_msg_proc_destroy | ( | dessert_msg_proc_t * | proc | ) |

free a dessert_prc_msg

- *proc processing buffer to free

void dessert_msg_proc_dump | ( | const dessert_msg_t * | msg,
|  | size_t | len,
|  | const dessert_msg_proc_t * | proc,
|  | char * | buf,
|  | size_t | blen |
| ) |  |  |

dump a dessert_msg_t to a string

- *msg the message to be dumped
- len the length of the buffer
- *proc the processing buffer
- *buf text output buffer
- blen text output buffer length

Here is the caller graph for this function:

int dessert_msg_resizeext | ( | dessert_msg_t * | msg,
|  | dessert_ext_t * | ext,
|  | size_t | new_len |
| ) |  |  |

Resizes a given extension record ext within in a dessert message msg to the new length new_len.

Parameters:

  `[in]` | *msg | the message
  `[in]` | *ext | the extension record
  `[in]` | new_len | the new length of the extension record

Return values:

  | DESSERT_OK | on success

DESCRIPTION:

int dessert_msg_trace_cb | ( | dessert_msg_t * | msg,
|  | size_t | len,
|  | dessert_msg_proc_t * | proc,
|  | const dessert_meshif_t * | iface,
|  | dessert_frameid_t | id |
| ) |  |  |

check if the message carries a trace extension and add the current trace info if iface is NULL, the packet is ignored

- *msg dessert_msg_t frame received
- len length of ethernet frame received
- *iface interface received packet on ®return DESSERT_MSG_KEEP always

int dessert_msg_trace_dump | ( | const dessert_msg_t * | msg,
|  | char * | buf,
|  | int | blen |
| ) |  |  |

dump packet trace to string

- *msg dessert_msg_t message used for tracing
- *buf char buffer to place string use DESSERT_MSG_TRACE_HOST to only record default mac of hosts on the way use DESSERT_MSG_TRACE_IFACE to also trace input interface and last hop ®return length of the string - 0 if msg has no trace header

Here is the caller graph for this function:

int dessert_msg_trace_initiate | ( | dessert_msg_t * | msg,
|  | int | mode |
| ) |  |  |

add initial trace header to dessert message

- *msg dessert_msg_t message used for tracing
- mode trace mode use DESSERT_MSG_TRACE_HOST to only record default mac of hosts on the way use DESSERT_MSG_TRACE_IFACE to also trace input interface and last hop ®return DESSERT_OK on success