X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/c29d86ce91159cc6ddcb4266903f0aafe9992e01..2827b727d2910a3b48f9de7d67b3a67f59e256c7:/lincan/src/can_queue.c diff --git a/lincan/src/can_queue.c b/lincan/src/can_queue.c index f061f4f..b0c027e 100644 --- a/lincan/src/can_queue.c +++ b/lincan/src/can_queue.c @@ -636,4 +636,45 @@ int canqueue_ends_kill_outlist(struct canque_ends_t *qends) } +/** + * canqueue_ends_filt_conjuction - computes conjunction of incoming edges filters filters + * @qends: pointer to ends structure + * @filt: pointer the filter structure filled by computed filters conjunction + * + * Return Value: Number of incoming edges + */ +int canqueue_ends_filt_conjuction(struct canque_ends_t *qends, struct canfilt_t *filt) +{ + struct canque_edge_t *edge; + int cnt=0; + unsigned long filtid=0; + unsigned long filtmask=~0; + unsigned long local_only=canque_filtid2internal(0,MSG_LOCAL); + + canque_for_each_inedge(qends, edge){ + /* skip edges processing only local messages */ + if(edge->filtid & edge->filtmask & local_only) + continue; + + if(!cnt++) + filtid = edge->filtid; + else + filtmask &= ~(filtid ^ edge->filtid); + + filtmask &= edge->filtmask; + } + + filt->id = filtid & MSG_ID_MASK; + filt->mask = filtmask & MSG_ID_MASK; + filtid >>= 28; + filtmask >>= 28; + filt->flags = filtid & MSG_EXT; + if(filtmask & (MSG_EXT)) + filt->flags |= MSG_EXT_MASK; + if(filtid & (MSG_RTR<<1)) + filt->flags |= MSG_RTR<<1; + if(filtmask & (MSG_RTR<<1)) + filt->flags |= MSG_RTR_MASK; + return cnt; +}