Lines Matching refs:chan

61 	channel_t *chan;  in channel_alloc()  local
63 chan = malloc(sizeof(channel_t)); in channel_alloc()
64 if (chan == NULL) { in channel_alloc()
69 memset(chan, 0, sizeof(channel_t)); in channel_alloc()
70 STAILQ_INIT(&chan->pktlist); in channel_alloc()
71 chan->state = CHANNEL_CLOSED; in channel_alloc()
72 LIST_INSERT_HEAD(&channel_list, chan, next); in channel_alloc()
76 return chan; in channel_alloc()
80 channel_open(channel_t *chan, int fd) in channel_open() argument
84 assert(chan->refcnt == 0); in channel_open()
85 assert(chan->state != CHANNEL_CLOSED); in channel_open()
87 if (chan->mtu > 0) { in channel_open()
88 chan->sendbuf = malloc(chan->mtu); in channel_open()
89 if (chan->sendbuf == NULL) { in channel_open()
101 event_set(&chan->rd_ev, fd, EV_READ | EV_PERSIST, channel_read, chan); in channel_open()
102 if (event_add(&chan->rd_ev, NULL) == -1) { in channel_open()
107 event_set(&chan->wr_ev, fd, EV_WRITE, channel_start, chan); in channel_open()
109 chan->refcnt++; in channel_open()
110 chan->fd = fd; in channel_open()
112 log_debug("(fd#%d)", chan->fd); in channel_open()
118 channel_close(channel_t *chan) in channel_close() argument
122 assert(chan->state != CHANNEL_CLOSED); in channel_close()
124 log_debug("(fd#%d)", chan->fd); in channel_close()
126 chan->state = CHANNEL_CLOSED; in channel_close()
127 event_del(&chan->rd_ev); in channel_close()
128 event_del(&chan->wr_ev); in channel_close()
129 close(chan->fd); in channel_close()
130 chan->refcnt--; in channel_close()
131 chan->tick = 0; in channel_close()
133 while ((ph = STAILQ_FIRST(&chan->pktlist)) != NULL) { in channel_close()
134 STAILQ_REMOVE_HEAD(&chan->pktlist, next); in channel_close()
136 chan->qlen--; in channel_close()
139 if (chan->pfh != NULL) { in channel_close()
140 pidfile_remove(chan->pfh); in channel_close()
141 chan->pfh = NULL; in channel_close()
144 if (chan->refcnt == 0) in channel_close()
145 channel_free(chan); in channel_close()
149 channel_free(channel_t *chan) in channel_free() argument
152 assert(chan->refcnt == 0); in channel_free()
153 assert(chan->state == CHANNEL_CLOSED); in channel_free()
154 assert(chan->qlen == 0); in channel_free()
155 assert(STAILQ_EMPTY(&chan->pktlist)); in channel_free()
157 LIST_REMOVE(chan, next); in channel_free()
158 free(chan->pfilter); in channel_free()
159 free(chan->mfilter); in channel_free()
160 free(chan->sendbuf); in channel_free()
161 free(chan); in channel_free()
174 channel_t *chan = arg; in channel_start() local
177 chan->oactive = true; in channel_start()
179 while (chan->qlen > 0) { in channel_start()
180 ph = STAILQ_FIRST(&chan->pktlist); in channel_start()
182 channel_timeout(chan, 10); in channel_start()
183 if (chan->send(chan, ph->data) == false) { in channel_start()
184 if (event_add(&chan->wr_ev, NULL) == -1) { in channel_start()
186 channel_close(chan); in channel_start()
191 STAILQ_REMOVE_HEAD(&chan->pktlist, next); in channel_start()
193 chan->qlen--; in channel_start()
196 channel_timeout(chan, 0); in channel_start()
197 chan->oactive = false; in channel_start()
203 channel_t *chan = arg; in channel_read() local
207 pkt = packet_alloc(chan); in channel_read()
209 channel_close(chan); in channel_read()
213 nr = read(fd, pkt->buf, chan->mru); in channel_read()
217 channel_close(chan); in channel_read()
223 channel_close(chan); in channel_read()
228 if (chan->recv(pkt) == true) in channel_read()
237 channel_t *chan; in channel_dispatch() local
246 LIST_FOREACH(chan, &channel_list, next) { in channel_dispatch()
247 if (chan == pkt->chan in channel_dispatch()
248 || chan->state != CHANNEL_OPEN) in channel_dispatch()
251 if (memcmp(pkt->dst, chan->raddr, ETHER_ADDR_LEN) == 0) { in channel_dispatch()
252 if (chan->qlen > CHANNEL_MAXQLEN) in channel_dispatch()
255 channel_put(chan, pkt); in channel_dispatch()
262 LIST_FOREACH(chan, &channel_list, next) { in channel_dispatch()
263 if (chan == pkt->chan in channel_dispatch()
264 || chan->state != CHANNEL_OPEN) in channel_dispatch()
267 if (chan->qlen > CHANNEL_MAXQLEN) { in channel_dispatch()
272 channel_put(chan, pkt); in channel_dispatch()
277 channel_put(channel_t *chan, packet_t *pkt) in channel_put() argument
285 chan->qlen++; in channel_put()
286 STAILQ_INSERT_TAIL(&chan->pktlist, ph, next); in channel_put()
288 if (!chan->oactive) in channel_put()
289 channel_start(chan->fd, EV_WRITE, chan); in channel_put()
297 channel_timeout(channel_t *chan, int to) in channel_timeout() argument
302 chan->tick = 0; in channel_timeout()
304 chan->tick = (channel_tick + to) % 60; in channel_timeout()
316 channel_t *chan, *next; in channel_watchdog() local
323 while ((chan = next) != NULL) { in channel_watchdog()
324 next = LIST_NEXT(chan, next); in channel_watchdog()
326 if (chan->tick == tick) in channel_watchdog()
327 channel_close(chan); in channel_watchdog()
328 else if (chan->tick != 0) in channel_watchdog()