Пример #1
0
void router_add_arp_entry( router_t *router, addr_mac_t mac, addr_ip_t ip, bool dynamic) {
    ip_mac_t *arp_entry;
    
    pthread_mutex_lock(&router->arp_cache_lock);
    
    debug_println("Adding arp entry.");    // TODO remove debugging line
    
    arp_entry = &router->arp_cache[router->num_arp_cache];
    
    arp_entry->mac = mac;
    arp_entry->ip = ip;
    arp_entry->time = get_time();
    arp_entry->dynamic = dynamic;
    
    router->num_arp_cache += 1;
    
#ifdef _CPUMODE_
    
    writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_IP, ntohl(ip));
    writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_MAC_LOW, mac_lo(&mac));
    writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_MAC_HIGH, mac_hi(&mac));
    writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_WR_ADDR, router->num_arp_cache-1);
#endif
    
    pthread_mutex_unlock(&router->arp_cache_lock);
    
}
Пример #2
0
void router_delete_all_arp_entries(router_t *router, bool dynamic) {
    
    pthread_mutex_lock(&router->arp_cache_lock);
    
    debug_println("Deleting all %s arp entries.", (dynamic == TRUE) ? "dyanmic" : "static");    // TODO remove debugging line
    unsigned replace[router->num_arp_cache];
    unsigned num_replace = 0;
    unsigned replaced = 0;
    unsigned move[router->num_arp_cache];
    unsigned num_move = 0;
    unsigned moved = 0;
    unsigned i;
    for (i = 0; i < router->num_arp_cache; i++) {
        if (router->arp_cache[i].dynamic == dynamic) {
            replace[num_replace++] = i;
        } else if (num_replace > replaced) {
            router->arp_cache[replace[replaced]] = router->arp_cache[i];
            move[num_move++] = i;
            if (num_move > moved && move[moved] < replace[replaced]) {
                router->arp_cache[move[moved++]] = router->arp_cache[replace[replaced]];
            } else {
                replaced++;
            }
        } else if (num_move > moved) {
            router->arp_cache[move[moved++]] = router->arp_cache[i];
            move[num_move++] = i;
        }
    }
    router->num_arp_cache -= num_replace;
    
#ifdef _CPUMODE_
    
    for (i = 0; i < num_replace; i++) {
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_IP, 0);
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_MAC_LOW, 0);
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_MAC_HIGH, 0);
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_WR_ADDR, router->num_arp_cache+i);
    }
    
    for (i = router->num_arp_cache-1; i >= 0; i++) { //Backwards
        addr_mac_t *mac = &router->arp_cache[i].mac;
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_IP, ntohl(router->arp_cache[i].ip));
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_MAC_LOW, mac_lo(mac));
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_MAC_HIGH, mac_hi(mac));
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_WR_ADDR, i);
    }
    
#endif
    
    pthread_mutex_unlock(&router->arp_cache_lock);
}
Пример #3
0
int ks2_eth_write_hwaddr(struct udevice *dev)
{
	struct ks2_eth_priv *priv = dev_get_priv(dev);
	struct eth_pdata *pdata = dev_get_platdata(dev);

	writel(mac_hi(pdata->enetaddr),
	       DEVICE_EMACSW_BASE(pdata->iobase, priv->slave_port - 1) +
				  CPGMACSL_REG_SA_HI);
	writel(mac_lo(pdata->enetaddr),
	       DEVICE_EMACSW_BASE(pdata->iobase, priv->slave_port - 1) +
				  CPGMACSL_REG_SA_LO);

	return 0;
}
Пример #4
0
bool router_delete_arp_entry( router_t *router, addr_ip_t ip) {
    
    pthread_mutex_lock(&router->arp_cache_lock);
    
    debug_println("Deleting arp entry.");    // TODO remove debugging line
    unsigned i;
    for (i = 0; i < router->num_arp_cache; i++) {
        if (router->arp_cache[i].ip == ip) {
            break;
        }
    }
    unsigned j;
    for (j = i; j < router->num_arp_cache-1; j++) {
        router->arp_cache[j] = router->arp_cache[j+1];
        
#ifdef _CPUMODE_
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_IP, 0);
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_MAC_LOW, 0);
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_MAC_HIGH, 0);
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_WR_ADDR, j+1);
        
        addr_mac_t *mac = &router->arp_cache[j].mac;
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_IP, ntohl(router->arp_cache[j].ip));
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_MAC_LOW, mac_lo(mac));
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_MAC_HIGH, mac_hi(mac));
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_WR_ADDR, j);
#endif
    }
    
#ifdef _CPUMODE_
    
    if (i == router->num_arp_cache -1) { //If not moving entries, just deleting last one.
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_IP, 0);
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_MAC_LOW, 0);
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_MAC_HIGH, 0);
        writeReg(router->nf.fd, XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_ARP_WR_ADDR, i);
    }
    
#endif
    
    bool succeded = FALSE;
    if (i < router->num_arp_cache) {
        succeded = TRUE;
    }
    router->num_arp_cache -= 1;
    pthread_mutex_unlock(&router->arp_cache_lock);
    
    return succeded;
}
Пример #5
0
static void cpsw_set_slave_mac(struct cpsw_slave *slave,
			       struct cpsw_priv *priv)
{
	__raw_writel(mac_hi(priv->mac_addr), &slave->regs->sa_hi);
	__raw_writel(mac_lo(priv->mac_addr), &slave->regs->sa_lo);
}