static void notify_handler(void *dummy) { __u16 contr; for (contr=1; VALID_CARD(contr); contr++) if (test_and_clear_bit(contr, ¬ify_up_set)) notify_up(contr); for (contr=1; VALID_CARD(contr); contr++) if (test_and_clear_bit(contr, ¬ify_down_set)) notify_down(contr); }
static inline void notify_doit(struct capi_notifier *np) { switch (np->cmd) { case KCI_CONTRUP: notify_up(np->controller); break; case KCI_CONTRDOWN: notify_down(np->controller); break; } }
static int notify_handler(struct notifier_block *nb, unsigned long val, void *v) { u32 contr = (long)v; switch (val) { case CAPICTR_UP: notify_up(contr); break; case CAPICTR_DOWN: notify_down(contr); break; } return NOTIFY_OK; }
static void inline notify_doit(struct capi_notifier *np) { switch (np->cmd) { case KCI_CONTRUP: notify_up(np->controller); break; case KCI_CONTRDOWN: notify_down(np->controller); break; case KCI_NCCIUP: notify_ncciup(np->controller, np->applid, np->ncci); break; case KCI_NCCIDOWN: notify_nccidown(np->controller, np->applid, np->ncci); break; } }
static int disc_read(struct triton_md_handler_t *h) { struct disc_net *net = container_of(h, typeof(*net), hnd); uint8_t *pack = NULL; struct ethhdr *ethhdr; struct pppoe_hdr *hdr; int n; struct sockaddr_ll src; socklen_t slen = sizeof(src); while (1) { if (!pack) pack = mempool_alloc(pkt_pool); n = net->net->recvfrom(h->fd, pack + 4, ETHER_MAX_LEN, MSG_DONTWAIT, (struct sockaddr *)&src, &slen); if (n < 0) { if (errno == EAGAIN) break; if (errno == ENETDOWN) { notify_down(net, src.sll_ifindex); continue; } log_error("pppoe: disc: read: %s\n", strerror(errno)); continue; } ethhdr = (struct ethhdr *)(pack + 4); hdr = (struct pppoe_hdr *)(pack + 4 + ETH_HLEN); if (n < ETH_HLEN + sizeof(*hdr)) { if (conf_verbose) log_warn("pppoe: short packet received (%i)\n", n); continue; } if (mac_filter_check(ethhdr->h_source)) { __sync_add_and_fetch(&stat_filtered, 1); continue; } //if (memcmp(ethhdr->h_dest, bc_addr, ETH_ALEN) && memcmp(ethhdr->h_dest, serv->hwaddr, ETH_ALEN)) // continue; if (!memcmp(ethhdr->h_source, bc_addr, ETH_ALEN)) { if (conf_verbose) log_warn("pppoe: discarding packet (host address is broadcast)\n"); continue; } if ((ethhdr->h_source[0] & 1) != 0) { if (conf_verbose) log_warn("pppoe: discarding packet (host address is not unicast)\n"); continue; } if (n < ETH_HLEN + sizeof(*hdr) + ntohs(hdr->length)) { if (conf_verbose) log_warn("pppoe: short packet received\n"); continue; } if (hdr->ver != 1) { if (conf_verbose) log_warn("pppoe: discarding packet (unsupported version %i)\n", hdr->ver); continue; } if (hdr->type != 1) { if (conf_verbose) log_warn("pppoe: discarding packet (unsupported type %i)\n", hdr->type); } if (forward(net, src.sll_ifindex, pack, n)) pack = NULL; } mempool_free(pack); return 0; }