Пример #1
0
int
arp_init(void)
{
    struct dpf_ir filter;
    int i;

    /* pkt statically  */
    for(i = 0; i < RINGSZ; i++) {
        arp_pkt = &arp_pkts[i];
        arp_pkt->next = &arp_pkts[i+1];
        arp_pkt->pollptr = &arp_pkts[i].flag;
        arp_pkt->n = 1;
        arp_pkt->sz = ETHER_MAX_LEN;
        arp_pkt->data = &arp_pkt->space[0];
        arp_pkt->flag = 0;
    }
    /* fix last entry */
    arp_pkt->next = &arp_pkts[0];

    if ((arp_ringid = sys_pktring_setring
                      (CAP_ARP,0,(struct pktringent *) arp_pkt))<=0)
    {
        kprintf ("vos arpd: setring failed: returned: %d!\n",arp_ringid);
        assert (0);
    }

    dpf_begin(&filter);  /* must be done before use */
    /* eth protocol = arp */
    dpf_eq16(&filter, eth_offset(proto), htons(EP_ARP));
    /* hardware proto = 1 */
    dpf_eq16(&filter, eth_sz+arp_offset(arp_hrd), htons(1));
    /* target proto = EP_IP */
    dpf_eq16(&filter, eth_sz+arp_offset(arp_pro), htons(EP_IP));


    dprintf("vos arpd: inserting arp replies filter...\n");
    arp_fid_res = sys_self_dpf_insert(CAP_USER, CAP_ARP, &filter, arp_ringid);

    if((int)(arp_fid_res) < 0)
    {
        kprintf("vos arpd: failed to insert ARP filter, already listening?\n");
        return -1;
    }

    kprintf("vos arpd: arp replies filter: using filter %d, pkt: %p, env: %d)\n",
            arp_fid_res,arp_pkt,getpid());
    dprintf("(using pktrings, arp_ringid: %d)\n",arp_ringid);
    arp_pkt->flag = 0;

    return 0;
}
Пример #2
0
int
xok_sys_self_dpf_insert (u_int a1, u_int a2, void *a3, int a4)
{
    return sys_self_dpf_insert(a1, a2, a3, a4);
}