static int output_tap_filter_update(void *priv, struct registry_param *param, struct ptype *value) { struct output_tap_priv *p = priv; if (p->listener) proto_packet_listener_set_filter(p->listener, p->filter); return POM_OK; }
static int analyzer_docsis_event_listeners_notify(void *obj, struct event_reg *evt_reg, int has_listeners) { struct analyzer *analyzer = obj; struct analyzer_docsis_priv *priv = analyzer->priv; if (has_listeners) { // Check if we are already listening if (priv->pkt_listener) return POM_OK; if (!priv->filter) { priv->filter = filter_proto_build("docsis_mgmt", "type", PTYPE_OP_GT, "3"); if (!priv->filter) { pomlog(POMLOG_ERR "Error while building filter"); return POM_ERR; } } priv->pkt_listener = proto_packet_listener_register(proto_get("docsis_mgmt"), 0, obj, analyzer_docsis_pkt_process); if (!priv->pkt_listener) return POM_ERR; // Filter out useless broadcast docsis_mgmt packets proto_packet_listener_set_filter(priv->pkt_listener, priv->filter); } else { if (event_has_listener(priv->evt_cm_new) || event_has_listener(priv->evt_cm_reg_status)) return POM_OK; if (proto_packet_listener_unregister(priv->pkt_listener) != POM_OK) return POM_ERR; priv->pkt_listener = NULL; } return POM_OK; }