lagopus_result_t port_config(struct bridge *bridge, struct ofp_port_mod *port_mod, struct ofp_error *error) { struct port *port; struct ofp_port *ofp_port; uint32_t oldconfig, newconfig; if (port_mod->port_no != OFPP_CONTROLLER) { port = port_lookup(&bridge->ports, port_mod->port_no); if (port == NULL) { error->type = OFPET_PORT_MOD_FAILED; error->code = OFPPMFC_BAD_PORT; lagopus_msg_info("port config: %d: no such port (%d:%d)\n", port_mod->port_no, error->type, error->code); return LAGOPUS_RESULT_OFP_ERROR; } ofp_port = &port->ofp_port; if (port->interface == NULL) { error->type = OFPET_PORT_MOD_FAILED; error->code = OFPPMFC_BAD_HW_ADDR; lagopus_msg_info("port config: %d: do not assigned interface (%d:%d)\n", port_mod->port_no, error->type, error->code); return LAGOPUS_RESULT_OFP_ERROR; } } else { port = NULL; /* XXX shut out warning */ ofp_port = &bridge->controller_port; } /* XXX write lock for thread safe */ if ((port_mod->config & (uint32_t)~port_mod->mask) != 0) { error->type = OFPET_PORT_MOD_FAILED; error->code = OFPPMFC_BAD_CONFIG; lagopus_msg_info("port config: " "config(0x%x) and mask(0x%x) inconsistency (%d:%d)\n", port_mod->config, port_mod->mask, error->type, error->code); return LAGOPUS_RESULT_OFP_ERROR; } oldconfig = ofp_port->config; newconfig = oldconfig; newconfig &= (uint32_t)~port_mod->mask; newconfig |= port_mod->config; ofp_port->config = newconfig; /* advertise, depend on lower driver */ if ((oldconfig != newconfig || ofp_port->advertised != port_mod->advertise) && port_mod->port_no != OFPP_CONTROLLER) { ofp_port->advertised = port_mod->advertise; lagopus_change_physical_port(port); } /* XXX unlock */ return LAGOPUS_RESULT_OK; }
lagopus_result_t port_config(struct bridge *bridge, struct ofp_port_mod *port_mod, struct ofp_error *error) { struct port *port; struct ofp_port *ofp_port; uint32_t oldconfig, newconfig; if (port_mod->port_no != OFPP_CONTROLLER) { port = port_lookup(bridge->ports, port_mod->port_no); if (port == NULL) { ofp_error_set(error, OFPET_PORT_MOD_FAILED, OFPPMFC_BAD_PORT); return LAGOPUS_RESULT_OFP_ERROR; } ofp_port = &port->ofp_port; if (port->interface == NULL) { ofp_error_set(error, OFPET_PORT_MOD_FAILED, OFPPMFC_BAD_HW_ADDR); return LAGOPUS_RESULT_OFP_ERROR; } } else { port = NULL; /* XXX shut out warning */ ofp_port = &bridge->controller_port; } /* XXX write lock for thread safe */ if ((port_mod->config & (uint32_t)~port_mod->mask) != 0) { ofp_error_set(error, OFPET_PORT_MOD_FAILED, OFPPMFC_BAD_CONFIG); return LAGOPUS_RESULT_OFP_ERROR; } oldconfig = ofp_port->config; newconfig = oldconfig; newconfig &= (uint32_t)~port_mod->mask; newconfig |= port_mod->config; ofp_port->config = newconfig; /* advertise, depend on lower driver */ if ((oldconfig != newconfig || ofp_port->advertised != port_mod->advertise) && port_mod->port_no != OFPP_CONTROLLER) { ofp_port->advertised = port_mod->advertise; lagopus_change_physical_port(port); } /* XXX unlock */ return LAGOPUS_RESULT_OK; }