//------------------------------------------------------------------------------ tOplkError veth_addInstance(const UINT8 aSrcMac_p[6]) { tOplkError ret = kErrorOk; UNUSED_PARAMETER(aSrcMac_p); // Register receive callback function for incoming virtual Ethernet frames ret = dllk_regAsyncHandler(receiveFrameCb); return ret; }
//------------------------------------------------------------------------------ static int veth_open(struct net_device* pNetDevice_p) { tOplkError ret = kErrorOk; //open the device //start the interface queue for the network subsystem netif_start_queue(pNetDevice_p); // register callback function in DLL ret = dllk_regAsyncHandler(veth_receiveFrame); DEBUG_LVL_VETH_TRACE("veth_open: dllk_regAsyncHandler returned 0x%02X\n", ret); return 0; }
//------------------------------------------------------------------------------ tOplkError veth_init(const UINT8 aSrcMac_p[6]) { tOplkError ret; struct ifreq ifr; int err; if ((vethInstance_l.fd = open(TUN_DEV_NAME, O_RDWR)) < 0) { DEBUG_LVL_VETH_TRACE("Error opening %s\n", TUN_DEV_NAME); return kErrorNoFreeInstance; } OPLK_MEMSET(&ifr, 0, sizeof(ifr)); ifr.ifr_flags = IFF_TAP | IFF_NO_PI; strncpy(ifr.ifr_name, PLK_VETH_NAME, IFNAMSIZ); if ((err = ioctl(vethInstance_l.fd, TUNSETIFF, (void*)&ifr)) < 0) { DEBUG_LVL_VETH_TRACE("Error setting TUN IFF options\n"); close(vethInstance_l.fd); return err; } // save MAC address of TAP device and Ethernet device to be able to // exchange them OPLK_MEMCPY(vethInstance_l.macAdrs, aSrcMac_p, 6); getMacAdrs(vethInstance_l.tapMacAdrs); // start tap receive thread vethInstance_l.fStop = FALSE; if (pthread_create(&vethInstance_l.threadHandle, NULL, vethRecvThread, (void*)&vethInstance_l) != 0) return kErrorNoFreeInstance; #if (defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 12)) pthread_setname_np(vethInstance_l.threadHandle, "oplk-veth"); #endif // register callback function in DLL ret = dllk_regAsyncHandler(receiveFrameCb); return ret; }