mirror of
https://passt.top/passt
synced 2024-12-22 05:35:23 +00:00
flow: Helpers to log details of a flow
The details of a flow - endpoints, interfaces etc. - can be pretty important for debugging. We log this on flow state transitions, but it can also be useful to log this when we report specific conditions. Add some helper functions and macros to make it easy to do that. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
1166401c2f
commit
88bfa3801e
48
flow.c
48
flow.c
@ -283,28 +283,23 @@ void flow_log_(const struct flow_common *f, int pri, const char *fmt, ...)
|
|||||||
"Flow %u (%s): %s", flow_idx(f), type_or_state, msg);
|
"Flow %u (%s): %s", flow_idx(f), type_or_state, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** flow_log_details_() - Log the details of a flow
|
||||||
* flow_set_state() - Change flow's state
|
* @f: flow to log
|
||||||
* @f: Flow changing state
|
* @pri: Log priority
|
||||||
* @state: New state
|
* @state: State to log details according to
|
||||||
|
*
|
||||||
|
* Logs the details of the flow: endpoints, interfaces, type etc.
|
||||||
*/
|
*/
|
||||||
static void flow_set_state(struct flow_common *f, enum flow_state state)
|
void flow_log_details_(const struct flow_common *f, int pri,
|
||||||
|
enum flow_state state)
|
||||||
{
|
{
|
||||||
char estr0[INANY_ADDRSTRLEN], fstr0[INANY_ADDRSTRLEN];
|
char estr0[INANY_ADDRSTRLEN], fstr0[INANY_ADDRSTRLEN];
|
||||||
char estr1[INANY_ADDRSTRLEN], fstr1[INANY_ADDRSTRLEN];
|
char estr1[INANY_ADDRSTRLEN], fstr1[INANY_ADDRSTRLEN];
|
||||||
const struct flowside *ini = &f->side[INISIDE];
|
const struct flowside *ini = &f->side[INISIDE];
|
||||||
const struct flowside *tgt = &f->side[TGTSIDE];
|
const struct flowside *tgt = &f->side[TGTSIDE];
|
||||||
uint8_t oldstate = f->state;
|
|
||||||
|
|
||||||
ASSERT(state < FLOW_NUM_STATES);
|
if (state >= FLOW_STATE_TGT)
|
||||||
ASSERT(oldstate < FLOW_NUM_STATES);
|
flow_log_(f, pri,
|
||||||
|
|
||||||
f->state = state;
|
|
||||||
flow_log_(f, LOG_DEBUG, "%s -> %s", flow_state_str[oldstate],
|
|
||||||
FLOW_STATE(f));
|
|
||||||
|
|
||||||
if (MAX(state, oldstate) >= FLOW_STATE_TGT)
|
|
||||||
flow_log_(f, LOG_DEBUG,
|
|
||||||
"%s [%s]:%hu -> [%s]:%hu => %s [%s]:%hu -> [%s]:%hu",
|
"%s [%s]:%hu -> [%s]:%hu => %s [%s]:%hu -> [%s]:%hu",
|
||||||
pif_name(f->pif[INISIDE]),
|
pif_name(f->pif[INISIDE]),
|
||||||
inany_ntop(&ini->eaddr, estr0, sizeof(estr0)),
|
inany_ntop(&ini->eaddr, estr0, sizeof(estr0)),
|
||||||
@ -316,8 +311,8 @@ static void flow_set_state(struct flow_common *f, enum flow_state state)
|
|||||||
tgt->oport,
|
tgt->oport,
|
||||||
inany_ntop(&tgt->eaddr, estr1, sizeof(estr1)),
|
inany_ntop(&tgt->eaddr, estr1, sizeof(estr1)),
|
||||||
tgt->eport);
|
tgt->eport);
|
||||||
else if (MAX(state, oldstate) >= FLOW_STATE_INI)
|
else if (state >= FLOW_STATE_INI)
|
||||||
flow_log_(f, LOG_DEBUG, "%s [%s]:%hu -> [%s]:%hu => ?",
|
flow_log_(f, pri, "%s [%s]:%hu -> [%s]:%hu => ?",
|
||||||
pif_name(f->pif[INISIDE]),
|
pif_name(f->pif[INISIDE]),
|
||||||
inany_ntop(&ini->eaddr, estr0, sizeof(estr0)),
|
inany_ntop(&ini->eaddr, estr0, sizeof(estr0)),
|
||||||
ini->eport,
|
ini->eport,
|
||||||
@ -325,6 +320,25 @@ static void flow_set_state(struct flow_common *f, enum flow_state state)
|
|||||||
ini->oport);
|
ini->oport);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* flow_set_state() - Change flow's state
|
||||||
|
* @f: Flow changing state
|
||||||
|
* @state: New state
|
||||||
|
*/
|
||||||
|
static void flow_set_state(struct flow_common *f, enum flow_state state)
|
||||||
|
{
|
||||||
|
uint8_t oldstate = f->state;
|
||||||
|
|
||||||
|
ASSERT(state < FLOW_NUM_STATES);
|
||||||
|
ASSERT(oldstate < FLOW_NUM_STATES);
|
||||||
|
|
||||||
|
f->state = state;
|
||||||
|
flow_log_(f, LOG_DEBUG, "%s -> %s", flow_state_str[oldstate],
|
||||||
|
FLOW_STATE(f));
|
||||||
|
|
||||||
|
flow_log_details_(f, LOG_DEBUG, MAX(state, oldstate));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* flow_initiate_() - Move flow to INI, setting pif[INISIDE]
|
* flow_initiate_() - Move flow to INI, setting pif[INISIDE]
|
||||||
* @flow: Flow to change state
|
* @flow: Flow to change state
|
||||||
|
7
flow.h
7
flow.h
@ -264,4 +264,11 @@ void flow_log_(const struct flow_common *f, int pri, const char *fmt, ...)
|
|||||||
flow_dbg((f), __VA_ARGS__); \
|
flow_dbg((f), __VA_ARGS__); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
void flow_log_details_(const struct flow_common *f, int pri,
|
||||||
|
enum flow_state state);
|
||||||
|
#define flow_log_details(f_, pri) \
|
||||||
|
flow_log_details_(&((f_)->f), (pri), (f_)->f.state)
|
||||||
|
#define flow_dbg_details(f_) flow_log_details((f_), LOG_DEBUG)
|
||||||
|
#define flow_err_details(f_) flow_log_details((f_), LOG_ERR)
|
||||||
|
|
||||||
#endif /* FLOW_H */
|
#endif /* FLOW_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user