net: if: Add operational state change time information
Make sure network interface contains information when the operational state was changed. After boot, the value is set to 0. Signed-off-by: Jukka Rissanen <jukka.rissanen@nordicsemi.no>
This commit is contained in:
parent
10deca2ef6
commit
262e777f3a
1 changed files with 45 additions and 0 deletions
|
@ -703,6 +703,17 @@ struct net_if_dev {
|
||||||
|
|
||||||
/** RFC 2863 operational status */
|
/** RFC 2863 operational status */
|
||||||
enum net_if_oper_state oper_state;
|
enum net_if_oper_state oper_state;
|
||||||
|
|
||||||
|
/** Last time the operational state was changed.
|
||||||
|
* This is used to determine how long the interface has been in the
|
||||||
|
* current operational state.
|
||||||
|
*
|
||||||
|
* This value is set to 0 when the interface is created, and then
|
||||||
|
* updated whenever the operational state changes.
|
||||||
|
*
|
||||||
|
* The value is in milliseconds since boot.
|
||||||
|
*/
|
||||||
|
int64_t oper_state_change_time;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -906,6 +917,12 @@ static inline enum net_if_oper_state net_if_oper_state_set(
|
||||||
iface->if_dev->oper_state = oper_state;
|
iface->if_dev->oper_state = oper_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
net_if_lock(iface);
|
||||||
|
|
||||||
|
iface->if_dev->oper_state_change_time = k_uptime_get();
|
||||||
|
|
||||||
|
net_if_unlock(iface);
|
||||||
|
|
||||||
return iface->if_dev->oper_state;
|
return iface->if_dev->oper_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -925,6 +942,34 @@ static inline enum net_if_oper_state net_if_oper_state(struct net_if *iface)
|
||||||
return iface->if_dev->oper_state;
|
return iface->if_dev->oper_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get an operational state change time of an interface
|
||||||
|
*
|
||||||
|
* @param iface Pointer to network interface
|
||||||
|
* @param change_time Pointer to store the change time. Time the operational
|
||||||
|
* state of an interface was last changed, in milliseconds since boot.
|
||||||
|
* If the interface operational state has not been changed yet,
|
||||||
|
* then the value is 0.
|
||||||
|
*
|
||||||
|
* @return 0 if ok, -EINVAL if operational state change time could not be
|
||||||
|
* retrieved (for example if iface or change_time is NULL).
|
||||||
|
*/
|
||||||
|
static inline int net_if_oper_state_change_time(struct net_if *iface,
|
||||||
|
int64_t *change_time)
|
||||||
|
{
|
||||||
|
if (iface == NULL || iface->if_dev == NULL || change_time == NULL) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
net_if_lock(iface);
|
||||||
|
|
||||||
|
*change_time = iface->if_dev->oper_state_change_time;
|
||||||
|
|
||||||
|
net_if_unlock(iface);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Try sending a packet through a net iface
|
* @brief Try sending a packet through a net iface
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue