/* @func int32 | rtl865x_referPpp |refer ppp table entry. @parm uint32 | sessionId | ppp session ID @rvalue SUCCESS | Success. @rvalue FAILED | Failed @comm */ int32 rtl865x_referPpp(uint32 sessionId) { int32 retval = FAILED; unsigned long flags; //rtl_down_interruptible(&ppp_sem); local_irq_save(flags); retval = _rtl865x_referPpp(sessionId); //rtl_up(&ppp_sem); local_irq_restore(flags); return retval; }
static int32 _rtl865x_addNxtHop(uint32 attr, void *ref_ptr, rtl865x_netif_local_t *netif, uint32 nexthop,uint32 srcIp) { int entryIdx; rtl865x_nextHopEntry_t *entry = NULL, *entry1 = NULL; rtl865x_route_t *rt_t = NULL; /* * NOTE: * parameter description: * (1) attr: why need to add the nexthop entry? NEXTHOP_L3 or NEXTHOP_DEFREDIRECT_ACL? * (2) ref_ptr: when attr = NEXTHOP_L3, ref_ptr point to a route structure, * attr = NEXTHOP_DEFREDIRECT_ACL, ref_ptr = NULL, * attr = others, ref_ptr = NULL * (3) netif: destination network interface * (4) nexthop: * a) netif->if_type == IF_ETHER, nexthop = nexthop ip address, * b) netif->if_type == session based type, nexthop = session Id, * * following case should be NOTED now: * (1) ETHERNET type network interface: * a) If nexthop != NULL , it means the entry is added for: * nexthop ip&mac information, nextHop = arp entry of nexthop ip address. * b) If nexthop == 0, use default route's nexthop or nexthop TOCPU * * (2) PPPoE/PPTP/L2TP type network interface: * The "nexthop" will explicitly specify the PPPoE session (PPTP/L2TP session). */ if(netif == NULL) return RTL_EINVALIDINPUT; /* Allocate an empty entry for new one */ /*Note: all nexthop entry referenced by L3 must be 2 entries aligned(reference l3 Datasheet)*/ for(entryIdx = 0; entryIdx < NXTHOP_ENTRY_NUM; entryIdx++) { if(rtl865x_nxtHopTable[entryIdx].valid == 0) { switch(attr) { case NEXTHOP_L3: if( entryIdx%2 == 0 && (entryIdx + 1) < NXTHOP_ENTRY_NUM && rtl865x_nxtHopTable[entryIdx+1].valid == 0) { entry = &rtl865x_nxtHopTable[entryIdx]; goto found; } break; case NEXTHOP_DEFREDIRECT_ACL: entry = &rtl865x_nxtHopTable[entryIdx]; goto found; break; default: printk("attr(%d) is not support.....\n",attr); break; } } } /*if not found proper nextHop entry, return*/ entry = NULL; found: if(entry == NULL) return RTL_ENOFREEBUFFER; entry->valid = 1; entry->dstNetif = netif; entry->entryIndex = entryIdx; entry->nextHopType = netif->if_type; entry->srcIp = srcIp; entry->refCnt = 1; entry->flag = attr; switch(netif->if_type) { case IF_ETHER: entry->nexthop = nexthop; break; case IF_PPPOE: case IF_PPTP: case IF_L2TP: /*nexthop is sessionId*/ entry->nexthop = nexthop; break; } if(attr == NEXTHOP_L3) { entry1 = &rtl865x_nxtHopTable[entryIdx+1]; memcpy(entry1,entry,sizeof(rtl865x_nextHopEntry_t)); entry1->entryIndex = entryIdx + 1; _rtl865x_arrangeNxtHop(entryIdx, 2); /*entry1 used netif,update reference netif*/ rtl865x_referNetif(netif->name); /*entry1 used pppoe!, update reference pppoe*/ if((entry1->nextHopType == IF_PPPOE) || (entry1->nextHopType == IF_PPTP) || (entry1->nextHopType == IF_L2TP) ){ #if LINUX_VERSION_CODE > KERNEL_VERSION(3,4,0) _rtl865x_referPpp(nexthop); #else rtl865x_referPpp(nexthop); #endif } /*FIXME_hyking:lazy, update the route information right here....*/ rt_t = (rtl865x_route_t *)ref_ptr; rt_t ->un.nxthop.nxtHopSta = entryIdx; rt_t ->un.nxthop.nxtHopEnd = entryIdx + 1; } else _rtl865x_arrangeNxtHop(entryIdx, 1); /*update reference dstnetif&pppoe arp?*/ rtl865x_referNetif(netif->name); if((entry->nextHopType == IF_PPPOE) || (entry->nextHopType == IF_PPTP) || (entry->nextHopType == IF_L2TP) ){ #if LINUX_VERSION_CODE > KERNEL_VERSION(3,4,0) _rtl865x_referPpp(nexthop); #else rtl865x_referPpp(nexthop); #endif } return SUCCESS; }