static void lw_psr_port_removed(struct teamd_context *ctx, struct teamd_port *tdport, void *priv, void *creator_priv) { struct lw_psr_port_priv *psr_ppriv = priv; teamd_loop_callback_del(ctx, LW_PERIODIC_CB_NAME, psr_ppriv); teamd_loop_callback_del(ctx, LW_SOCKET_CB_NAME, psr_ppriv); psr_ppriv->ops->sock_close(psr_ppriv); }
static void lw_ethtool_port_removed(struct teamd_context *ctx, struct teamd_port *tdport, void *priv, void *creator_priv) { teamd_event_watch_unregister(ctx, &lw_ethtool_port_watch_ops, priv); teamd_loop_callback_del(ctx, LW_ETHTOOL_DELAY_CB_NAME, priv); }
static int lw_ethtool_port_added(struct teamd_context *ctx, struct teamd_port *tdport, void *priv, void *creator_priv) { int err; err = lw_ethtool_load_options(ctx, tdport, priv); if (err) { teamd_log_err("Failed to load options."); return err; } err = teamd_loop_callback_timer_add(ctx, LW_ETHTOOL_DELAY_CB_NAME, priv, lw_ethtool_callback_delay); if (err) { teamd_log_err("Failed add delay callback timer"); return err; } err = teamd_event_watch_register(ctx, &lw_ethtool_port_watch_ops, priv); if (err) { teamd_log_err("Failed to register event watch."); goto delay_callback_del; } return 0; delay_callback_del: teamd_loop_callback_del(ctx, LW_ETHTOOL_DELAY_CB_NAME, priv); return err; }
void teamd_usock_fini(struct teamd_context *ctx) { if (!ctx->usock.enabled) return; acc_conn_destroy_all(ctx); teamd_loop_callback_del(ctx, USOCK_CB_NAME, ctx); teamd_usock_sock_close(ctx); }
static void acc_conn_destroy(struct teamd_context *ctx, struct usock_acc_conn *acc_conn) { teamd_loop_callback_del(ctx, USOCK_ACC_CONN_CB_NAME, acc_conn); close(acc_conn->sock); list_del(&acc_conn->list); free(acc_conn); }
static int lw_psr_port_added(struct teamd_context *ctx, struct teamd_port *tdport, void *priv, void *creator_priv) { struct lw_psr_port_priv *psr_ppriv = priv; int err; err = lw_psr_load_options(ctx, tdport, psr_ppriv); if (err) { teamd_log_err("Failed to load options."); return err; } err = psr_ppriv->ops->load_options(ctx, tdport, psr_ppriv); if (err) { teamd_log_err("Failed to load options."); return err; } err = psr_ppriv->ops->sock_open(psr_ppriv); if (err) { teamd_log_err("Failed to create socket."); return err; } err = teamd_loop_callback_fd_add(ctx, LW_SOCKET_CB_NAME, psr_ppriv, lw_psr_callback_socket, psr_ppriv->sock, TEAMD_LOOP_FD_EVENT_READ); if (err) { teamd_log_err("Failed add socket callback."); goto close_sock; } err = teamd_loop_callback_timer_add_set(ctx, LW_PERIODIC_CB_NAME, psr_ppriv, lw_psr_callback_periodic, &psr_ppriv->interval, &psr_ppriv->init_wait); if (err) { teamd_log_err("Failed add callback timer"); goto socket_callback_del; } err = team_set_port_user_linkup_enabled(ctx->th, tdport->ifindex, true); if (err) { teamd_log_err("%s: Failed to enable user linkup.", tdport->ifname); goto periodic_callback_del; } teamd_loop_callback_enable(ctx, LW_SOCKET_CB_NAME, psr_ppriv); teamd_loop_callback_enable(ctx, LW_PERIODIC_CB_NAME, psr_ppriv); return 0; periodic_callback_del: teamd_loop_callback_del(ctx, LW_PERIODIC_CB_NAME, psr_ppriv); socket_callback_del: teamd_loop_callback_del(ctx, LW_SOCKET_CB_NAME, psr_ppriv); close_sock: psr_ppriv->ops->sock_close(psr_ppriv); return err; }