Lines Matching refs:chan

60 	channel_t *chan;
62 chan = malloc(sizeof(channel_t));
63 if (chan == NULL) {
68 memset(chan, 0, sizeof(channel_t));
69 STAILQ_INIT(&chan->pktlist);
70 chan->state = CHANNEL_CLOSED;
71 LIST_INSERT_HEAD(&channel_list, chan, next);
75 return chan;
79 channel_open(channel_t *chan, int fd)
83 assert(chan->refcnt == 0);
84 assert(chan->state != CHANNEL_CLOSED);
86 if (chan->mtu > 0) {
87 chan->sendbuf = malloc(chan->mtu);
88 if (chan->sendbuf == NULL) {
100 event_set(&chan->rd_ev, fd, EV_READ | EV_PERSIST, channel_read, chan);
101 if (event_add(&chan->rd_ev, NULL) == -1) {
106 event_set(&chan->wr_ev, fd, EV_WRITE, channel_start, chan);
108 chan->refcnt++;
109 chan->fd = fd;
111 log_debug("(fd#%d)", chan->fd);
117 channel_close(channel_t *chan)
121 assert(chan->state != CHANNEL_CLOSED);
123 log_debug("(fd#%d)", chan->fd);
125 chan->state = CHANNEL_CLOSED;
126 event_del(&chan->rd_ev);
127 event_del(&chan->wr_ev);
128 close(chan->fd);
129 chan->refcnt--;
130 chan->tick = 0;
132 while ((ph = STAILQ_FIRST(&chan->pktlist)) != NULL) {
133 STAILQ_REMOVE_HEAD(&chan->pktlist, next);
135 chan->qlen--;
138 if (chan->pfh != NULL) {
139 pidfile_remove(chan->pfh);
140 chan->pfh = NULL;
143 if (chan->refcnt == 0)
144 channel_free(chan);
148 channel_free(channel_t *chan)
151 assert(chan->refcnt == 0);
152 assert(chan->state == CHANNEL_CLOSED);
153 assert(chan->qlen == 0);
154 assert(STAILQ_EMPTY(&chan->pktlist));
156 LIST_REMOVE(chan, next);
157 free(chan->pfilter);
158 free(chan->mfilter);
159 free(chan->sendbuf);
160 free(chan);
173 channel_t *chan = arg;
176 chan->oactive = true;
178 while (chan->qlen > 0) {
179 ph = STAILQ_FIRST(&chan->pktlist);
181 channel_timeout(chan, 10);
182 if (chan->send(chan, ph->data) == false) {
183 if (event_add(&chan->wr_ev, NULL) == -1) {
185 channel_close(chan);
190 STAILQ_REMOVE_HEAD(&chan->pktlist, next);
192 chan->qlen--;
195 channel_timeout(chan, 0);
196 chan->oactive = false;
202 channel_t *chan = arg;
206 pkt = packet_alloc(chan);
208 channel_close(chan);
212 nr = read(fd, pkt->buf, chan->mru);
216 channel_close(chan);
222 channel_close(chan);
227 if (chan->recv(pkt) == true)
236 channel_t *chan;
245 LIST_FOREACH(chan, &channel_list, next) {
246 if (chan == pkt->chan
247 || chan->state != CHANNEL_OPEN)
250 if (memcmp(pkt->dst, chan->raddr, ETHER_ADDR_LEN) == 0) {
251 if (chan->qlen > CHANNEL_MAXQLEN)
254 channel_put(chan, pkt);
261 LIST_FOREACH(chan, &channel_list, next) {
262 if (chan == pkt->chan
263 || chan->state != CHANNEL_OPEN)
266 if (chan->qlen > CHANNEL_MAXQLEN) {
271 channel_put(chan, pkt);
276 channel_put(channel_t *chan, packet_t *pkt)
284 chan->qlen++;
285 STAILQ_INSERT_TAIL(&chan->pktlist, ph, next);
287 if (!chan->oactive)
288 channel_start(chan->fd, EV_WRITE, chan);
296 channel_timeout(channel_t *chan, int to)
301 chan->tick = 0;
303 chan->tick = (channel_tick + to) % 60;
315 channel_t *chan, *next;
322 while ((chan = next) != NULL) {
323 next = LIST_NEXT(chan, next);
325 if (chan->tick == tick)
326 channel_close(chan);
327 else if (chan->tick != 0)