static int process_rcv_msg(struct teamd_context *ctx, int sock, char *rcv_msg) { struct usock_ops_priv usock_ops_priv; char *str; char *rest = rcv_msg; str = teamd_usock_msg_getline(&rest); if (!str) { teamd_log_dbg("usock: Incomplete message."); return 0; } if (strcmp(TEAMD_USOCK_REQUEST_PREFIX, str)) { teamd_log_dbg("usock: Unsupported message type."); return 0; } str = teamd_usock_msg_getline(&rest); if (!str) { teamd_log_dbg("usock: Incomplete message."); return 0; } if (!teamd_ctl_method_exists(str)) { teamd_log_dbg("usock: Unknown method \"%s\".", str); return 0; } usock_ops_priv.sock = sock; usock_ops_priv.rcv_msg_args = rest; teamd_log_dbg("usock: calling method \"%s\"", str); return teamd_ctl_method_call(ctx, str, &teamd_usock_ctl_method_ops, &usock_ops_priv); }
static int lw_ethtool_load_options(struct teamd_context *ctx, struct teamd_port *tdport, struct lw_ethtool_port_priv *ethtool_ppriv) { struct teamd_config_path_cookie *cpcookie = ethtool_ppriv->common.cpcookie; int err; int tmp; err = teamd_config_int_get(ctx, &tmp, "@.queue_id", cpcookie); if (!err) { if (tmp < 0) { teamd_log_err("\"delay_up\" must not be negative number."); return -EINVAL; } teamd_log_dbg("delay_up \"%d\".", tmp); ms_to_timespec(ðtool_ppriv->delay_up, tmp); } err = teamd_config_int_get(ctx, &tmp, "@.delay_down", cpcookie); if (!err) { if (tmp < 0) { teamd_log_err("\"delay_down\" must not be negative number."); return -EINVAL; } teamd_log_dbg("delay_down \"%d\".", tmp); ms_to_timespec(ðtool_ppriv->delay_down, tmp); } return 0; }
static int lw_psr_callback_periodic(struct teamd_context *ctx, int events, void *priv) { struct lw_common_port_priv *common_ppriv = priv; struct lw_psr_port_priv *psr_ppriv = priv; struct teamd_port *tdport = common_ppriv->tdport; bool link_up = common_ppriv->link_up; int err; if (psr_ppriv->reply_received) { link_up = true; psr_ppriv->missed = 0; } else { psr_ppriv->missed++; if (psr_ppriv->missed > psr_ppriv->missed_max && link_up) { teamd_log_dbg("%s: Missed %u replies (max %u).", tdport->ifname, psr_ppriv->missed, psr_ppriv->missed_max); link_up = false; } } err = teamd_link_watch_check_link_up(ctx, tdport, common_ppriv, link_up); if (err) return err; psr_ppriv->reply_received = false; return psr_ppriv->ops->send(psr_ppriv); }
static int lw_psr_load_options(struct teamd_context *ctx, struct teamd_port *tdport, struct lw_psr_port_priv *psr_ppriv) { struct teamd_config_path_cookie *cpcookie = psr_ppriv->common.cpcookie; int err; int tmp; err = teamd_config_int_get(ctx, &tmp, "@.interval", cpcookie); if (err) { teamd_log_err("Failed to get \"interval\" link-watch option."); return -EINVAL; } teamd_log_dbg("interval \"%d\".", tmp); ms_to_timespec(&psr_ppriv->interval, tmp); err = teamd_config_int_get(ctx, &tmp, "@.init_wait", cpcookie); if (!err) ms_to_timespec(&psr_ppriv->init_wait, tmp); /* if init_wait is set to 0, use default_init_wait */ if (err || !tmp) psr_ppriv->init_wait = lw_psr_default_init_wait; teamd_log_dbg("init_wait \"%d\".", timespec_to_ms(&psr_ppriv->init_wait)); err = teamd_config_int_get(ctx, &tmp, "@.missed_max", cpcookie); if (err) { teamd_log_err("Failed to get \"missed_max\" link-watch option."); return -EINVAL; } if (tmp < 0) { teamd_log_err("\"missed_max\" must not be negative number."); return -EINVAL; } teamd_log_dbg("missed_max \"%d\".", tmp); psr_ppriv->missed_max = tmp; return 0; }
static int teamd_usock_sock_open(struct teamd_context *ctx) { struct sockaddr_un addr; int sock; int err; err = teamd_make_rundir(); if (err) return err; sock = socket(AF_UNIX, SOCK_SEQPACKET, 0); if (sock == -1) { teamd_log_err("usock: Failed to create socket."); return -errno; } addr.sun_family = AF_UNIX; teamd_usock_get_sockpath(addr.sun_path, sizeof(addr.sun_path), ctx->team_devname); teamd_log_dbg("usock: Using sockpath \"%s\"", addr.sun_path); err = unlink(addr.sun_path); if (err == -1 && errno != ENOENT) { teamd_log_err("usock: Failed to remove socket file."); err = -errno; goto close_sock; } err = bind(sock, (struct sockaddr *) &addr, strlen(addr.sun_path) + sizeof(addr.sun_family)); if (err == -1) { teamd_log_err("usock: Failed to bind socket."); err = -errno; goto close_sock; } listen(sock, USOCK_MAX_CLIENT_COUNT); ctx->usock.sock = sock; ctx->usock.addr = addr; return 0; close_sock: close(sock); return err; }
static int lw_nsnap_load_options(struct teamd_context *ctx, struct teamd_port *tdport, struct lw_psr_port_priv *psr_ppriv) { struct lw_nsnap_port_priv *nsnap_ppriv = lw_nsnap_ppriv_get(psr_ppriv); struct teamd_config_path_cookie *cpcookie = psr_ppriv->common.cpcookie; const char *host; int err; err = teamd_config_string_get(ctx, &host, "@.target_host", cpcookie); if (err) { teamd_log_err("Failed to get \"target_host\" link-watch option."); return -EINVAL; } err = set_sockaddr_in6(&nsnap_ppriv->dst, host); if (err) return err; teamd_log_dbg("target address \"%s\".", str_sockaddr_in6(&nsnap_ppriv->dst)); return 0; }
static int lw_ap_load_options(struct teamd_context *ctx, struct teamd_port *tdport, struct lw_psr_port_priv *psr_ppriv) { struct lw_ap_port_priv *ap_ppriv = lw_ap_ppriv_get(psr_ppriv); struct teamd_config_path_cookie *cpcookie = psr_ppriv->common.cpcookie; const char *host; int tmp; int err; err = teamd_config_string_get(ctx, &host, "@.source_host", cpcookie); if (err) { teamd_log_err("Failed to get \"source_host\" link-watch option."); return -EINVAL; } err = set_in_addr(&ap_ppriv->src, host); if (err) return err; teamd_log_dbg("source address \"%s\".", str_in_addr(&ap_ppriv->src)); err = teamd_config_string_get(ctx, &host, "@.target_host", cpcookie); if (err) { teamd_log_err("Failed to get \"target_host\" link-watch option."); return -EINVAL; } err = set_in_addr(&ap_ppriv->dst, host); if (err) return err; teamd_log_dbg("target address \"%s\".", str_in_addr(&ap_ppriv->dst)); err = teamd_config_bool_get(ctx, &ap_ppriv->validate_active, "@.validate_active", cpcookie); if (err) ap_ppriv->validate_active = false; teamd_log_dbg("validate_active \"%d\".", ap_ppriv->validate_active); err = teamd_config_bool_get(ctx, &ap_ppriv->validate_inactive, "@.validate_inactive", cpcookie); if (err) ap_ppriv->validate_inactive = false; teamd_log_dbg("validate_inactive \"%d\".", ap_ppriv->validate_inactive); err = teamd_config_bool_get(ctx, &ap_ppriv->send_always, "@.send_always", cpcookie); if (err) ap_ppriv->send_always = false; teamd_log_dbg("send_always \"%d\".", ap_ppriv->send_always); err = teamd_config_int_get(ctx, &tmp, "@.vlanid", cpcookie); if (!err) { if (tmp < 0 || tmp >= 4096) { teamd_log_err("Wrong \"vlanid\" option value."); return -EINVAL; } ap_ppriv->vlanid_in_use = true; ap_ppriv->vlanid = tmp; teamd_log_dbg("vlan id \"%u\".", ap_ppriv->vlanid); } return 0; }