Lines Matching defs:lldp

23 #include "sd-lldp.h"
29 #include "lldp-internal.h"
30 #include "lldp-port.h"
31 #include "lldp-tlv.h"
105 static void lldp_mib_delete_objects(sd_lldp *lldp);
106 static void lldp_set_state(sd_lldp *lldp, LLDPAgentRXState state);
109 static int lldp_receive_frame(sd_lldp *lldp, tlv_packet *tlv) {
112 assert(lldp);
116 if (prioq_size(lldp->by_expiry) > 0) {
118 lldp_set_state(lldp, LLDP_AGENT_RX_DELETE_INFO);
120 lldp_mib_delete_objects(lldp);
123 r = lldp_mib_add_objects(lldp->by_expiry, lldp->neighbour_mib, tlv);
127 lldp_set_state(lldp, LLDP_AGENT_RX_UPDATE_INFO);
130 hashmap_size(lldp->neighbour_mib),
131 prioq_size(lldp->by_expiry));
133 lldp->statistics.stats_frames_in_total ++;
139 lldp_set_state(lldp, LLDP_AGENT_RX_WAIT_FOR_FRAME);
151 sd_lldp *lldp;
158 lldp = (sd_lldp *) port->userdata;
160 if (lldp->port->status == LLDP_PORT_STATUS_DISABLED) {
161 log_lldp("Port: %s is disabled. Dropping.", lldp->port->ifname);
165 lldp_set_state(lldp, LLDP_AGENT_RX_RX_FRAME);
350 return lldp_receive_frame(lldp, tlv);
353 lldp_set_state(lldp, LLDP_AGENT_RX_WAIT_FOR_FRAME);
356 lldp->statistics.stats_frames_discarded_total ++;
357 lldp->statistics.stats_frames_in_errors_total ++;
377 static void lldp_set_state(sd_lldp *lldp, LLDPAgentRXState state) {
379 assert(lldp);
382 lldp->rx_state = state;
384 lldp_run_state_machine(lldp);
387 static void lldp_run_state_machine(sd_lldp *lldp) {
388 if (!lldp->cb)
391 switch (lldp->rx_state) {
393 lldp->cb(lldp, SD_LLDP_EVENT_UPDATE_INFO, lldp->userdata);
405 static void lldp_mib_delete_objects(sd_lldp *lldp) {
412 if (prioq_size(lldp->by_expiry) <= 0)
415 p = prioq_peek(lldp->by_expiry);
427 lldp->statistics.stats_ageouts_total ++;
431 static void lldp_mib_objects_flush(sd_lldp *lldp) {
435 assert(lldp);
436 assert(lldp->neighbour_mib);
437 assert(lldp->by_expiry);
440 while ((c = hashmap_steal_first(lldp->neighbour_mib))) {
447 assert(hashmap_size(lldp->neighbour_mib) == 0);
448 assert(prioq_size(lldp->by_expiry) == 0);
451 int sd_lldp_save(sd_lldp *lldp, const char *lldp_file) {
463 assert(lldp);
472 HASHMAP_FOREACH(c, lldp->neighbour_mib, i) {
589 return log_error_errno(r, "Failed to save lldp data %s: %m", lldp_file);
592 int sd_lldp_start(sd_lldp *lldp) {
595 assert_return(lldp, -EINVAL);
596 assert_return(lldp->port, -EINVAL);
598 lldp->port->status = LLDP_PORT_STATUS_ENABLED;
600 lldp_set_state(lldp, LLDP_AGENT_RX_LLDP_INITIALIZE);
602 r = lldp_port_start(lldp->port);
605 lldp->port->ifname,
608 lldp_set_state(lldp, LLDP_AGENT_RX_WAIT_PORT_OPERATIONAL);
613 lldp_set_state(lldp, LLDP_AGENT_RX_WAIT_FOR_FRAME);
618 int sd_lldp_stop(sd_lldp *lldp) {
621 assert_return(lldp, -EINVAL);
622 assert_return(lldp->port, -EINVAL);
624 lldp->port->status = LLDP_PORT_STATUS_DISABLED;
626 r = lldp_port_stop(lldp->port);
630 lldp_mib_objects_flush(lldp);
635 int sd_lldp_attach_event(sd_lldp *lldp, sd_event *event, int priority) {
638 assert_return(lldp, -EINVAL);
639 assert_return(!lldp->port->event, -EBUSY);
642 lldp->port->event = sd_event_ref(event);
644 r = sd_event_default(&lldp->port->event);
649 lldp->port->event_priority = priority;
654 int sd_lldp_detach_event(sd_lldp *lldp) {
656 assert_return(lldp, -EINVAL);
658 lldp->port->event = sd_event_unref(lldp->port->event);
663 int sd_lldp_set_callback(sd_lldp *lldp, sd_lldp_cb_t cb, void *userdata) {
664 assert_return(lldp, -EINVAL);
666 lldp->cb = cb;
667 lldp->userdata = userdata;
672 sd_lldp* sd_lldp_unref(sd_lldp *lldp) {
674 if (!lldp)
678 lldp_mib_objects_flush(lldp);
680 lldp_port_free(lldp->port);
682 hashmap_free(lldp->neighbour_mib);
683 prioq_free(lldp->by_expiry);
685 free(lldp);
693 _cleanup_(sd_lldp_unrefp) sd_lldp *lldp = NULL;
701 lldp = new0(sd_lldp, 1);
702 if (!lldp)
705 r = lldp_port_new(ifindex, ifname, mac, lldp, &lldp->port);
709 lldp->neighbour_mib = hashmap_new(&chassis_id_hash_ops);
710 if (!lldp->neighbour_mib)
713 r = prioq_ensure_allocated(&lldp->by_expiry,
718 lldp->rx_state = LLDP_AGENT_RX_WAIT_PORT_OPERATIONAL;
720 *ret = lldp;
721 lldp = NULL;
726 int sd_lldp_get_packets(sd_lldp *lldp, sd_lldp_packet ***tlvs) {
732 assert_return(lldp, -EINVAL);
735 HASHMAP_FOREACH(c, lldp->neighbour_mib, iter) {
750 HASHMAP_FOREACH(c, lldp->neighbour_mib, iter) {