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); }
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); }
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; }
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; }
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); }