Ejemplo n.º 1
0
int
sin_bind(void *s, const struct sockaddr *addr, socklen_t addrlen, int *e)
{
    struct sin_socket *ssp;
    struct sin_addr *saddr;

    ssp = (struct sin_socket *)s;
    if (ssp->src == NULL) {
        ssp->src = malloc(sizeof(struct sin_addr) + addrlen);
        if (ssp->src == NULL) {
            _SET_ERR(e, ENOMEM);
            return (-1);
        }
        SIN_TYPE_SET(ssp->src, _SIN_TYPE_ADDR);
        ssp->src->addr = (struct sockaddr *)((char *)ssp->src + 
          sizeof(struct sin_addr));
    } else if (addrlen > ssp->src->addrlen) {
        SIN_TYPE_ASSERT(ssp->src, _SIN_TYPE_ADDR);
        saddr = realloc(ssp->src, sizeof(struct sin_addr) + addrlen);
        if (saddr == NULL) {
            _SET_ERR(e, ENOMEM);
            return (-1);
        }
        ssp->src = saddr;
    }
    memcpy(ssp->src->addr, addr, addrlen);
    ssp->src->addrlen = addrlen;

    return (0);
}
Ejemplo n.º 2
0
void
sin_destroy(void *p)
{
    struct sin_stance *sip;
    int i;

    sip = (struct sin_stance *)p;
    SIN_TYPE_ASSERT(sip, _SIN_TYPE_SINSTANCE);

    sin_rx_thread_dtor(sip->hst.rx_thread);
    sin_pkt_sorter_dtor(sip->hst.rx_sort);
    for (i = 0; i < sip->nrings; i++) {
        sin_rx_thread_dtor(sip->phy[i].rx_thread);
        sin_pkt_sorter_dtor(sip->phy[i].rx_sort);
    }
    sin_tx_thread_dtor(sip->hst.tx_thread);
    for (i = 0; i < sip->nrings; i++) {
        sin_tx_thread_dtor(sip->phy[i].tx_thread);
    }
    sin_pkt_zone_dtor(sip->hst.rx_zone);
    sin_pkt_zone_dtor(sip->hst.tx_zone);
    close(sip->hst.queue_fd);
    for (i = 0; i < sip->nrings; i++) {
        sin_pkt_zone_dtor(sip->phy[i].rx_zone);
        sin_pkt_zone_dtor(sip->phy[i].tx_zone);
        close(sip->phy[i].queue_fd);
    }
    free(sip->phy);
    close(sip->netmap_fd);
    free(sip);
}
Ejemplo n.º 3
0
int
sin_signal_get_signum(struct sin_signal *ssign)
{

    SIN_TYPE_ASSERT(ssign, _SIN_TYPE_SIGNAL);
    return (ssign->signum);
}
Ejemplo n.º 4
0
void
sin_signal_dtor(struct sin_signal *ssign)
{

    SIN_TYPE_ASSERT(ssign, _SIN_TYPE_SIGNAL);
    free(ssign);
}
Ejemplo n.º 5
0
void
sin_pkt_dtor(struct sin_pkt *pkt)
{

    SIN_TYPE_ASSERT(pkt, _SIN_TYPE_PKT);
    free(pkt->ts);
    free(pkt);
}
Ejemplo n.º 6
0
int
sin_close(void *s)
{
    struct sin_socket *ssp;

    ssp = (struct sin_socket *)s;
    SIN_TYPE_ASSERT(ssp, _SIN_TYPE_SOCKET);

    if (ssp->src != NULL) {
        SIN_TYPE_ASSERT(ssp->src, _SIN_TYPE_ADDR);
        ssp->src->t.sin_type = ~ssp->src->t.sin_type;
        free(ssp->src);
    }
    if (ssp->dst != NULL) {
        SIN_TYPE_ASSERT(ssp->dst, _SIN_TYPE_ADDR);
        ssp->dst->t.sin_type = ~ssp->dst->t.sin_type;
        free(ssp->dst);
    }

    ssp->t.sin_type = ~ssp->t.sin_type;
    free(ssp);

    return (0);
}