示例#1
0
int
update_kernel_addresses(int dump)
{
    int rc;

    if(nl_socket < 0) {
        log_msg(LOG_ERROR, "Netlink not initialized.\n");
        errno = EIO;
        return -1;
    }

    if(dump) {
        int i;
        int families[2] = { AF_INET6, AF_INET };
        free_array(&addresses, free);
        for(i = 0; i < 2; i++) {
            /* ask for routes */
            rc = netlink_send_dump_request(RTM_GETADDR, families[i]);
            if(rc < 0)
                return -1;
            rc = netlink_read_ack(nl_socket);
        }
    } else {
        rc = netlink_read_all(nl_socket);
    }

    return 0;
}
jint Java_edu_vu_isis_ammo_core_ethertracker_EthTrackSvc_initEthernetNative(JNIEnv *env,
		jobject clazz)
{
	int ret = -1;

	//LOGI("==>%s",__FUNCTION__);
	//	__android_log_print(ANDROID_LOG_INFO, LOG_TAG,
	//            "==>%s",__FUNCTION__);
	memset(&addr_msg, 0, sizeof(struct sockaddr_nl));
	addr_msg.nl_family = AF_NETLINK;
	memset(&addr_poll, 0, sizeof(struct sockaddr_nl));
	addr_poll.nl_family = AF_NETLINK;
	addr_poll.nl_pid = 0;//getpid();
	addr_poll.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR;

	/*
	 *Create connection to netlink socket
	 */
	nl_socket_msg = socket(AF_NETLINK,SOCK_RAW,NETLINK_ROUTE);
	if (nl_socket_msg <= 0) {
		//LOGE("Can not create netlink msg socket");

     	__android_log_print(
     						ANDROID_LOG_INFO, 
     						LOG_TAG,
							"Can not create netlink msg socket"
							); 
		goto error;
	}

	//	__android_log_print(ANDROID_LOG_INFO, LOG_TAG,
	//            "Got socket for msg"); 

	if (bind(nl_socket_msg, (struct sockaddr *)(&addr_msg),
				sizeof(struct sockaddr_nl))) {
     	__android_log_print(
     						ANDROID_LOG_INFO, 
     						LOG_TAG,
							"Can not bind to netlink msg socket"
							); 
		goto error;
	}
	__android_log_print(ANDROID_LOG_INFO, LOG_TAG,
			"Bound msg socket .... Getting poll socket"); 

	nl_socket_poll = socket(AF_NETLINK,SOCK_RAW,NETLINK_ROUTE);
	if (nl_socket_poll <= 0) {
     	__android_log_print(
     						ANDROID_LOG_INFO, 
     						LOG_TAG,
							"Can not create netlink poll socket"
							); 
		goto error;
	}

	//	__android_log_print(ANDROID_LOG_INFO, LOG_TAG,
	//            "Got Poll socket ... Trying to bind poll socket"); 

	errno = 0;
	if(bind(nl_socket_poll, (struct sockaddr *)(&addr_poll),
				sizeof(struct sockaddr_nl))) {
     	__android_log_print(
     						ANDROID_LOG_INFO, 
     						LOG_TAG,
							"Can not bind to netlink poll socket,%s",strerror(errno)
							); 

		goto error;
	}

	netlink_send_dump_request(nl_socket_poll, RTM_GETLINK | RTM_GETADDR, AF_PACKET);


	//LOGE("%s exited with success",__FUNCTION__);
	__android_log_print(ANDROID_LOG_INFO, LOG_TAG,
			"%s exited with success",__FUNCTION__);


	doQuery = 1;

	return 0;
error:
	//LOGE("%s exited with error",__FUNCTION__);
	__android_log_print(ANDROID_LOG_INFO, LOG_TAG,
			"%s exited with error",__FUNCTION__);
	if (nl_socket_msg >0)
		close(nl_socket_msg);
	if (nl_socket_poll >0)
		close(nl_socket_poll);
	return ret;

}