コード例 #1
0
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;
}
コード例 #2
0
ファイル: rt_netlink.c プロジェクト: rgmabs19357/HA
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;
}
コード例 #3
0
ファイル: scim_port.c プロジェクト: lojix/scim
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);
	}