int netlink_information_fetch (struct sockaddr_nl *snl, struct nlmsghdr *h) { switch (h->nlmsg_type) { case RTM_NEWROUTE: return netlink_route_change (snl, h); break; case RTM_DELROUTE: return netlink_route_change (snl, h); break; case RTM_NEWLINK: return netlink_link_change (snl, h); break; case RTM_DELLINK: return netlink_link_change (snl, h); break; case RTM_NEWADDR: return netlink_interface_addr (snl, h); break; case RTM_DELADDR: return netlink_interface_addr (snl, h); break; default: zlog_warn ("Unknown netlink nlmsg_type %d\n", h->nlmsg_type); break; } return 0; }
static int netlink_information_fetch (struct sockaddr_nl *snl, struct nlmsghdr *h) { /* JF: Ignore messages that aren't from the kernel */ if ( snl->nl_pid != 0 ) { zlog ( NULL, LOG_ERR, "Ignoring message from pid %u", snl->nl_pid ); return 0; } switch (h->nlmsg_type) { case RTM_NEWLINK: return netlink_link_change (snl, h); break; case RTM_DELLINK: return netlink_link_change (snl, h); break; case RTM_NEWADDR: return netlink_interface_addr (snl, h); break; case RTM_DELADDR: return netlink_interface_addr (snl, h); break; case RTM_NEWROUTE: case RTM_DELROUTE: default: zlog_warn ("Unknown netlink nlmsg_type %d\n", h->nlmsg_type); break; } return 0; }
int scim_port_wake(scim_root_t _root) { int index; int netlink; int result = -1; char name[IFNAMSIZ]; scim_lane_t lane; scim_port_data_t port; if((netlink = netlink_open()) < 0) { fprintf(stderr, "%s: netlink_open: %m\n", __func__); return -1; } if(scim_port_list(port) < 0) { goto done; } for(scim_port_list_t list = port->list; **list; list++) { scim_port_item_t info = *list; snprintf(name, sizeof(name), "%s", info[_PORT_NAME]); if(strcmp(name, "lo") && strncmp(name + 3, "bone", 4) && strncmp(name + 3, "port", 4)) { continue; } if(!sscanf(info[_PORT_INDEX], "%d", &index)) { errno = EINVAL; fprintf(stderr, "%s: port->info[_PORT_INDEX]: %m\n", __func__); goto done; } if(name[2] && !strncmp(name + 3, "port", 4)) { if(isdigit(name[7])) { name[7] = '\0'; if(netlink_link_rename(netlink, name, index) < 0) { fprintf(stderr, "%s: netlink_link_rename %s to %s: %m\n", __func__, info[_PORT_NAME], name); goto done; } } for(lane = __lane; *lane->name && strncmp(lane->name, name, 3); lane++); if(*lane->name && lane->base) { uint32_t mask = ((uint32_t)0xffffffffU << lane->size) >> lane->size; uint32_t address = htonl(lane->base|(_root->task->cell->code + 1)); uint32_t broadcast = htonl(lane->base|mask); if(netlink_address_four_create(netlink, index, address, broadcast, lane->size, 0) < 0) { if(errno != EEXIST) { fprintf(stderr, "%s: netlink_address_four_create: %s, %08x: %m\n", __func__, name, address); goto done; } } } } netlink_link_change(netlink, index, IFF_UP, IFF_UP); }