Example #1
0
/* Assigns a DP (uid) and its port to the given PCAP port. */
bool
pcap_drv_assign_dp_port(struct pcap_drv *drv, size_t drv_port_no, size_t dp_uid, of_port_no_t dp_port_no) {
    pthread_rwlock_wrlock(drv->ports_rwlock);

    if (drv->ports[drv_port_no] == NULL) {
        pthread_rwlock_unlock(drv->ports_rwlock);
        return false;
    }

    pthread_rwlock_unlock(drv->ports_rwlock);
    struct pcap_port *pcap_port = drv->ports[drv_port_no];

    pthread_rwlock_wrlock(pcap_port->rwlock);

    if (pcap_port->dp_port_no != OF_NO_PORT) {
        // dp port already assigned
        pthread_rwlock_unlock(pcap_port->rwlock);
        pthread_rwlock_unlock(drv->ports_rwlock);
        return false;
    }


    pcap_port->dp_uid = dp_uid;
    pcap_port->dp_port_no = dp_port_no;
    pcap_port->of_port->port_no = dp_port_no;
    pcap_port->of_stats->port_no = dp_port_no;

    pcap_port->pkt_mbox = mbox_new(drv->loop, pcap_port, event_loop_pkt_out_cb);

    ev_io_start(drv->loop, pcap_port->watcher);
    pthread_rwlock_unlock(pcap_port->rwlock);

    mbox_notify(drv->notifier); // needed for io watcher update on loop
    return true;
}
Example #2
0
/* Creates and spawns a new controller handler. */
struct ctrl * MALLOC_ATTR
ctrl_new(struct dp *dp) {
    struct ctrl *ctrl = malloc(sizeof(struct ctrl));
    ctrl->dp = dp;
    ctrl->logger = logger_mgr_get(LOGGER_NAME_CTRL, dp_get_uid(dp));

    struct ctrl_loop *ctrl_loop = malloc(sizeof(struct ctrl_loop));
    ctrl_loop->dp = dp;
    ctrl_loop->logger = logger_mgr_get(LOGGER_NAME_CTRL_IF, dp_get_uid(dp));

    size_t i;
    for (i=0; i<MAX_CONNS; i++) {
        ctrl_loop->conns[i] = NULL;
    }
    ctrl_loop->conns_num = 1; // "0" is used for broadcast

    ctrl->ctrl_loop = ctrl_loop;
    ctrl_loop->ctrl = ctrl;

    ctrl->thread = malloc(sizeof(pthread_t));
    ctrl->loop   = ev_loop_new(0/*flags*/);
    ctrl_loop->loop = ctrl->loop;

    ctrl->cmd_mbox = mbox_new(ctrl->loop, ctrl_loop, process_cmd);
    ctrl->msg_mbox = mbox_new(ctrl->loop, ctrl_loop, process_msg);

    ev_set_userdata(ctrl->loop, (void *)ctrl_loop);

    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

    int rc;
    if ((rc = pthread_create(ctrl->thread, &attr, event_loop, (void *)ctrl_loop)) != 0) {
        logger_log(ctrl->logger, LOG_ERR, "Unable to create thread (%d).", rc);
        //TODO free structures
        return NULL;
    }

    logger_log(ctrl->logger, LOG_INFO, "Initialized.");

    return ctrl;
}
Example #3
0
void
config_add_mbox (struct config *config, char *filename)
{
    struct mbox **p = &config->mailboxes;
    while (*p) {
	if (0 == strcmp ((*p)->filename, filename)) {
	    return;
	}
	p = &((*p)->next);
    }

    *p = mbox_new (config, filename);
}
Example #4
0
struct packetproc*
packetproc_new(struct dp *dp) {
    struct packetproc *packetproc = malloc(sizeof(struct packetproc));
    packetproc->dp     = dp;
    packetproc->logger = logger_mgr_get(LOGGER_NAME_PP);

    packetproc->pp_map                = NULL;
    packetproc->max_pp_num_global     = MAX_PP_NUM_GLOBAL;
    packetproc->current_pp_num_global = 0;

    packetproc->pp_shared_data = NULL;

    struct packetproc_loop *packetproc_loop = malloc(sizeof(struct packetproc_loop));
    packetproc_loop->dp                     = dp;
    packetproc_loop->logger                 = logger_mgr_get(LOGGER_NAME_PP_LOOP);

    packetproc->packetproc_loop = packetproc_loop;
    packetproc_loop->packetproc = packetproc;

    packetproc->thread    = malloc(sizeof(pthread_t));
    packetproc->loop      = ev_loop_new(0/*flags*/);
    packetproc_loop->loop = packetproc->loop;
    packetproc->msg_mbox   = mbox_new(packetproc->loop, packetproc_loop, process_msg);
    
    packetproc->mutex = malloc(sizeof(pthread_mutex_t));
    pthread_mutex_init(packetproc->mutex, NULL);

    /* Initialize basic packet processor structures and
     * call #ppName#_packetproc_init for every pp type */
    init_packetprocessors(packetproc);

    ev_set_userdata(packetproc->loop, (void *)packetproc_loop);

    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

    int rc;
    if ((rc = pthread_create(packetproc->thread, &attr, event_loop, (void *)packetproc_loop)) != 0) {
        logger_log(packetproc->logger, LOG_ERR, "Unable to create thread (%d).", rc);
        //TODO free structures
        return NULL;
    }

    logger_log(packetproc->logger, LOG_INFO, "Initialized.");

    return packetproc;
}
Example #5
0
/* Static initializer for the driver. */
struct pcap_drv * MALLOC_ATTR
pcap_drv_init(struct port_drv *drv) {
    struct pcap_drv *pcap_drv = malloc(sizeof(struct pcap_drv));
    pcap_drv->drv = drv;
    pcap_drv->logger = logger_mgr_get(LOGGER_NAME_PORT_DRV_PCAP);

    pcap_drv->ports_map = NULL;
    size_t i;
    for (i=0; i<MAX_PORTS; i++) {
        pcap_drv->ports[i] = NULL;
    }
    pcap_drv->ports_num = 0;

    pcap_drv->ports_rwlock = malloc(sizeof(pthread_rwlock_t));
    pthread_rwlock_init(pcap_drv->ports_rwlock, NULL);

    struct pcap_drv_loop *pcap_drv_loop = malloc(sizeof(struct pcap_drv_loop));
    pcap_drv_loop->logger = logger_mgr_get(LOGGER_NAME_PORT_DRV_PCAP_IF);

    pcap_drv->pcap_drv_loop = pcap_drv_loop;
    pcap_drv_loop->pcap_drv = pcap_drv;

    pcap_drv->thread = malloc(sizeof(pthread_t));
    pcap_drv->loop = ev_loop_new(0/*flags*/);
    pcap_drv_loop->loop = pcap_drv->loop;

    ev_set_userdata(pcap_drv->loop, (void *)pcap_drv_loop);

    pcap_drv->notifier = mbox_new(pcap_drv->loop, NULL, NULL);

    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

    int rc;
    if ((rc = pthread_create(pcap_drv->thread, &attr, event_loop, (void *)pcap_drv_loop)) != 0) {
        logger_log(pcap_drv->logger, LOG_ERR, "Unable to create thread (%d).", rc);
        //TODO: free structures
        return NULL;
    }

    logger_log(pcap_drv->logger, LOG_INFO, "PCAP initialized.");

    return pcap_drv;
}
Example #6
0
int main (int argc, char **argv)
{
    mbox_err_t err;
    mbox_t *mbox;
    mbox_mail_t *mail;

    assert(argc > 1);
    err = mbox_new(argv[1], &mbox);
    if (err) {
        fprintf(stderr, "Mbox error: %s\n", mbox_strerr(err));
        exit(1);
    }

    printf("Starting to get milk\n");
    while ((mail = mbox_next_mail (mbox)) != NULL) {
        const dlist_t *trace;
        diter_t *iter;

        printf("Is to [%s]\n", mbox_mail_getattr(mail, "To"));
        printf("Mail trace:\n");
        trace = mbox_mail_gettrace(mail);
        iter = dlist_iter_new((dlist_t **)&trace);
        while (diter_hasnext(iter)) {
            printf("\t%s\n", (char *)diter_next(iter));
        }
        dlist_iter_free(iter);
        printf("FOLLOWING TEXT\n");
        printf("%s\n", mbox_mail_getbody(mail));
        printf("END OF TEXT\n");
        mbox_mail_free(mail);
    }
    printf("LOL WUT?\n");

    mbox_free(mbox);

    exit(0);
}