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); }
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); }
int sin_signal_get_signum(struct sin_signal *ssign) { SIN_TYPE_ASSERT(ssign, _SIN_TYPE_SIGNAL); return (ssign->signum); }
void sin_signal_dtor(struct sin_signal *ssign) { SIN_TYPE_ASSERT(ssign, _SIN_TYPE_SIGNAL); free(ssign); }
void sin_pkt_dtor(struct sin_pkt *pkt) { SIN_TYPE_ASSERT(pkt, _SIN_TYPE_PKT); free(pkt->ts); free(pkt); }
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); }