if (output == NULL) {
/* Ugly hack: we don't want to transmit a list of
- * chassis or a list of ports. We patch the chassis and
- * the port to avoid this. */
- TAILQ_ENTRY(lldpd_chassis) backup_c_entries;
+ * ports. We patch the port to avoid this. */
TAILQ_ENTRY(lldpd_port) backup_p_entries;
memcpy(&backup_p_entries, &neighbor->p_entries,
sizeof(backup_p_entries));
- memcpy(&backup_c_entries, &neighbor->p_chassis->c_entries,
- sizeof(backup_c_entries));
memset(&neighbor->p_entries, 0,
sizeof(backup_p_entries));
- memset(&neighbor->p_chassis->c_entries, 0,
- sizeof(backup_c_entries));
output_len = marshal_serialize(lldpd_neighbor_change,
&neigh, &output);
memcpy(&neighbor->p_entries, &backup_p_entries,
sizeof(backup_p_entries));
- memcpy(&neighbor->p_chassis->c_entries, &backup_c_entries,
- sizeof(backup_c_entries));
if (output_len <= 0) {
LLOG_WARNX("unable to serialize changed neighbor");
add_chassis(struct chassis_list *chassis_list,
struct lldpd_chassis *chassis)
{
- struct lldpd_chassis *one_chassis, *next_chassis;
- /* This is an odd function because we want to add the chassis and the
- * chained chassis which may not be referenced elsewhere. Serialization
- * will bring us useless chassis in the mix. */
- while (chassis) {
- TAILQ_FOREACH(one_chassis, chassis_list, c_entries) {
- if (one_chassis == chassis) return;
- }
- next_chassis = TAILQ_NEXT(chassis, c_entries);
- TAILQ_INSERT_TAIL(chassis_list,
- chassis, c_entries);
- chassis = next_chassis;
+ struct lldpd_chassis *one_chassis;
+ TAILQ_FOREACH(one_chassis, chassis_list, c_entries) {
+ if (one_chassis == chassis) return;
}
+ TAILQ_INSERT_TAIL(chassis_list,
+ chassis, c_entries);
}
static void
/* WARNING: any change to this structure should also be reflected into
`lldpd_copy_chassis()` which is not using marshaling. */
MARSHAL_BEGIN(lldpd_chassis)
-MARSHAL_TQE(lldpd_chassis, c_entries)
+MARSHAL_IGNORE(lldpd_chassis, c_entries.tqe_next)
+MARSHAL_IGNORE(lldpd_chassis, c_entries.tqe_prev)
MARSHAL_FSTR(lldpd_chassis, c_id, c_id_len)
MARSHAL_STR(lldpd_chassis, c_name)
MARSHAL_STR(lldpd_chassis, c_descr)