bd3ef36eda
------- This patch enhances networking support for the simulation under Linux. Includes updated support for Linux TUN/TAP, and the addition of support for Linux bridge devices. CHANGES ------- o Check to see if the d_txavail callback is present before calling it in the arp send code. This prevents a segfault when simulating the telnetd daemon with arp send enabled. o Adjust the simulation's netdriver_loop() so it will detect and respond to ARP requests. o Do not attempt to take the tap device's hardware address for use by the simulation. That hardware address belongs to the host end of the link, not the simulation end. Generate a randomized MAC address instead. o Do not assign an IP address to the interface on the host side of the TAP link. + Provide two modes: "host route" and "bridge". + In host route mode, maintain a host route that points any traffic for the simulation's IP address to the tap device. In this mode, so long as the simulation's IP is a free address in the same subnet as the host, no additional configuration will be required to talk to it from the host. Note that address changes are handled automatically if they follow the rule of if-down/set-address/if-up, which everything seems to. + In bridge mode, add the tap device to the specified bridge instance. See configs/sim/NETWORK-LINUX.txt for information and usage examples. This enables much more flexible configurations (with fewer headaches), such as running multiple simulations on a single host, all of which can access the network the host is connected to. o Refresh configurations in configs/sim where CONFIG_NET=y. They default to "host route" mode. o Add configs/sim/NETWORK-LINUX.txt CAVEATS ------- - The MAC address generation code is extremely simplistic, and does not check for potential conflicts on the network. Probably not an issue, but something to be aware of. - I was careful to leave it in a state where Cygwin/pcap should still work, but I don't have a Windows environment to test in. This should be checked. - I don't know if this was ever intended to work with OS X. I didn't even try to test it there. NOTES ----- - Was able to get telnetd working and simulate nsh over telnet, but only so long as listen backlogs were disabled. There appears to be a bug in the backlog code where sockets are being returned in SYN_RCVD state instead of waiting until they're ESTABLISHED; if you perform an immediate send after accepting the connection, it will confuse the stack and the send will hang; additionally, the connection will never reach ESTABLISHED state. Can be worked around by adding a sleep(1) after the accept in telnetd. I don't have the necessary knowledge of the IP stack to know what the correct fix is.
310 lines
8.4 KiB
Makefile
310 lines
8.4 KiB
Makefile
############################################################################
|
|
# arch/sim/src/Makefile
|
|
#
|
|
# Copyright (C) 2007, 2008, 2011-2012, 2014, 2016 Gregory Nutt. All rights reserved.
|
|
# Author: Gregory Nutt <gnutt@nuttx.org>
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
#
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in
|
|
# the documentation and/or other materials provided with the
|
|
# distribution.
|
|
# 3. Neither the name NuttX nor the names of its contributors may be
|
|
# used to endorse or promote products derived from this software
|
|
# without specific prior written permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
#
|
|
############################################################################
|
|
|
|
-include $(TOPDIR)/Make.defs
|
|
|
|
CPPFLAGS += -I$(TOPDIR)/sched $(EXTRADEFINES)
|
|
CFLAGS += -I$(TOPDIR)/sched $(EXTRADEFINES)
|
|
CXXFLAGS += -I$(TOPDIR)/sched $(EXTRADEFINES)
|
|
|
|
ASRCS =
|
|
|
|
ifeq ($(CONFIG_HOST_X86_64),y)
|
|
ifeq ($(CONFIG_SIM_M32),y)
|
|
ASRCS += up_setjmp32.S
|
|
else
|
|
ASRCS += up_setjmp64.S
|
|
endif
|
|
else
|
|
ASRCS += up_setjmp32.S
|
|
endif
|
|
|
|
AOBJS = $(ASRCS:.S=$(OBJEXT))
|
|
|
|
CSRCS = up_initialize.c up_idle.c up_interruptcontext.c up_initialstate.c
|
|
CSRCS += up_createstack.c up_usestack.c up_releasestack.c up_stackframe.c
|
|
CSRCS += up_unblocktask.c up_blocktask.c up_releasepending.c
|
|
CSRCS += up_reprioritizertr.c up_exit.c up_schedulesigaction.c up_spiflash.c
|
|
CSRCS += up_allocateheap.c up_devconsole.c
|
|
|
|
HOSTSRCS = up_hostusleep.c
|
|
|
|
ifeq ($(CONFIG_SCHED_TICKLESS),y)
|
|
CSRCS += up_tickless.c
|
|
endif
|
|
|
|
ifeq ($(CONFIG_SPINLOCK),y)
|
|
HOSTSRCS += up_testset.c
|
|
endif
|
|
|
|
ifeq ($(CONFIG_SMP),y)
|
|
CSRCS += up_smpsignal.c up_smphook.c up_cpuidlestack.c
|
|
HOSTSRCS += up_simsmp.c
|
|
endif
|
|
|
|
ifeq ($(CONFIG_SCHED_INSTRUMENTATION),y)
|
|
ifneq ($(CONFIG_SCHED_INSTRUMENTATION_BUFFER),y)
|
|
CSRCS += up_schednote.c
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(CONFIG_DEV_CONSOLE),y)
|
|
CSRCS += up_uartwait.c
|
|
HOSTSRCS += up_simuart.c
|
|
endif
|
|
|
|
ifeq ($(CONFIG_NX_LCDDRIVER),y)
|
|
CSRCS += board_lcd.c
|
|
else
|
|
CSRCS += up_framebuffer.c
|
|
ifeq ($(CONFIG_SIM_X11FB),y)
|
|
HOSTSRCS += up_x11framebuffer.c
|
|
ifeq ($(CONFIG_SIM_TOUCHSCREEN),y)
|
|
CSRCS += up_touchscreen.c
|
|
HOSTSRCS += up_x11eventloop.c
|
|
else
|
|
ifeq ($(CONFIG_SIM_AJOYSTICK),y)
|
|
CSRCS += up_ajoystick.c
|
|
HOSTSRCS += up_x11eventloop.c
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(CONFIG_ELF),y)
|
|
CSRCS += up_elf.c
|
|
endif
|
|
|
|
ifeq ($(CONFIG_FS_FAT),y)
|
|
CSRCS += up_blockdevice.c up_deviceimage.c
|
|
endif
|
|
|
|
ifeq ($(CONFIG_ARCH_ROMGETC),y)
|
|
CSRCS += up_romgetc.c
|
|
endif
|
|
|
|
ifeq ($(CONFIG_NET_ETHERNET),y)
|
|
CSRCS += up_netdriver.c
|
|
HOSTCFLAGS += -DNETDEV_BUFSIZE=$(CONFIG_NET_ETH_MTU)
|
|
ifneq ($(HOSTOS),Cygwin)
|
|
HOSTSRCS += up_tapdev.c up_netdev.c
|
|
ifeq ($(CONFIG_SIM_NET_BRIDGE),y)
|
|
HOSTCFLAGS += -DCONFIG_SIM_NET_BRIDGE
|
|
HOSTCFLAGS += -DCONFIG_SIM_NET_BRIDGE_DEVICE=\"$(CONFIG_SIM_NET_BRIDGE_DEVICE)\"
|
|
endif
|
|
ifeq ($(CONFIG_SIM_NET_HOST_ROUTE),y)
|
|
HOSTCFLAGS += -DCONFIG_SIM_NET_HOST_ROUTE
|
|
endif
|
|
else
|
|
HOSTSRCS += up_wpcap.c up_netdev.c
|
|
DRVLIB = /lib/w32api/libws2_32.a /lib/w32api/libiphlpapi.a
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(CONFIG_SMP),y)
|
|
HOSTCFLAGS += -DCONFIG_SMP=1 -DCONFIG_SMP_NCPUS=$(CONFIG_SMP_NCPUS)
|
|
endif
|
|
|
|
ifeq ($(CONFIG_FS_HOSTFS),y)
|
|
HOSTSRCS += up_hostfs.c
|
|
|
|
up_hostfs.c: hostfs.h
|
|
|
|
hostfs.h: $(TOPDIR)/include/nuttx/fs/hostfs.h
|
|
@echo "CP: $<"
|
|
$(Q) cp $< $@
|
|
endif
|
|
|
|
COBJS = $(CSRCS:.c=$(OBJEXT))
|
|
|
|
NUTTXOBJS = $(AOBJS) $(COBJS)
|
|
HOSTOBJS = $(HOSTSRCS:.c=$(OBJEXT))
|
|
|
|
SRCS = $(ASRCS) $(CSRCS) $(HOSTSRCS)
|
|
OBJS = $(AOBJS) $(COBJS) $(HOSTOBJS)
|
|
|
|
# Determine which standard libraries will need to be linked in
|
|
|
|
ifeq ($(CONFIG_SIM_X11FB),y)
|
|
STDLIBS += -lX11 -lXext
|
|
endif
|
|
|
|
# Override in Make.defs if linker is not 'ld'
|
|
|
|
LDSTARTGROUP ?= --start-group
|
|
LDENDGROUP ?= --end-group
|
|
|
|
EXTRA_LIBS ?=
|
|
EXTRA_LIBPATHS ?=
|
|
|
|
ifeq ($(CONFIG_FS_FAT),y)
|
|
STDLIBS += -lz
|
|
endif
|
|
|
|
STDLIBS += -lc
|
|
STDLIBS += -lpthread
|
|
|
|
# Determine which objects are required in the link. The
|
|
# up_head object normally draws in all that is needed, but
|
|
# there are a fews that must be included because they
|
|
# are called only from the host OS-specific logic (HOSTOBJS)
|
|
|
|
LINKOBJS = up_head$(OBJEXT)
|
|
REQUIREDOBJS = $(LINKOBJS)
|
|
|
|
ifeq ($(CONFIG_DEV_CONSOLE),y)
|
|
REQUIREDOBJS += up_uartwait$(OBJEXT)
|
|
endif
|
|
|
|
ifeq ($(CONFIG_SIM_X11FB),y)
|
|
ifeq ($(CONFIG_SIM_TOUCHSCREEN),y)
|
|
REQUIREDOBJS += up_touchscreen$(OBJEXT)
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(CONFIG_SMP),y)
|
|
REQUIREDOBJS += up_smpsignal$(OBJEXT) up_smphook$(OBJEXT)
|
|
endif
|
|
|
|
# Determine which NuttX libraries will need to be linked in
|
|
# Most are provided by LINKLIBS on the MAKE command line
|
|
|
|
LINKLIBS ?=
|
|
RELLIBS = $(patsubst %.a,%,$(patsubst lib%,-l%,$(LINKLIBS)))
|
|
RELPATHS += -L"$(TOPDIR)/lib"
|
|
|
|
# Add the board-specific library and directory
|
|
|
|
LIBPATHS += -L board
|
|
RELPATHS += -L board
|
|
RELLIBS += -lboard
|
|
|
|
# Make targets begin here
|
|
|
|
all: up_head$(OBJEXT) libarch$(LIBEXT)
|
|
|
|
.PHONY: board/libboard$(LIBEXT) export_startup clean distclean cleanrel depend
|
|
|
|
$(AOBJS): %$(OBJEXT): %.S
|
|
$(call ASSEMBLE, $<, $@)
|
|
|
|
$(COBJS) $(LINKOBJS): %$(OBJEXT): %.c
|
|
$(call COMPILE, $<, $@)
|
|
|
|
$(HOSTOBJS): %$(OBJEXT): %.c
|
|
$(Q) echo "CC: $<"
|
|
$(Q) "$(CC)" -c $(HOSTCFLAGS) $< -o $@
|
|
|
|
# The architecture-specific library
|
|
|
|
libarch$(LIBEXT): $(NUTTXOBJS)
|
|
$(call ARCHIVE, $@, $(NUTTXOBJS))
|
|
|
|
# The "board"-specific library. Of course, there really are no boards in
|
|
# the simulation. However, this is a good place to keep parts of the simulation
|
|
# that are not hardware-related.
|
|
|
|
board/libboard$(LIBEXT):
|
|
$(Q) $(MAKE) -C board TOPDIR="$(TOPDIR)" libboard$(LIBEXT) EXTRADEFINES=$(EXTRADEFINES)
|
|
|
|
# A partially linked object containing only NuttX code (no interface to host OS)
|
|
# Change the names of most symbols that conflict with libc symbols.
|
|
|
|
GNU:
|
|
$(Q) mkdir ./GNU
|
|
|
|
GNU/Linux-names.dat: GNU nuttx-names.dat
|
|
$(Q) cp nuttx-names.dat $@
|
|
|
|
Cygwin-names.dat: nuttx-names.dat
|
|
ifeq ($())CONFIG_SIM_CYGWIN_DECORATED),y)
|
|
$(Q) cat $^ | sed -e "s/^/_/g" >$@
|
|
else
|
|
$(Q) cp nuttx-names.dat $@
|
|
endif
|
|
|
|
nuttx.rel : libarch$(LIBEXT) board/libboard$(LIBEXT) $(HOSTOS)-names.dat $(LINKOBJS)
|
|
$(Q) echo "LD: nuttx.rel"
|
|
$(Q) $(LD) -r $(LDLINKFLAGS) $(RELPATHS) $(EXTRA_LIBPATHS) -o $@ $(REQUIREDOBJS) $(LDSTARTGROUP) $(RELLIBS) $(EXTRA_LIBS) $(LDENDGROUP)
|
|
$(Q) $(OBJCOPY) --redefine-syms=$(HOSTOS)-names.dat $@
|
|
|
|
# Generate the final NuttX binary by linking the host-specific objects with the NuttX
|
|
# specific objects (with munged names)
|
|
|
|
nuttx$(EXEEXT): cleanrel nuttx.rel $(HOSTOBJS)
|
|
$(Q) echo "LD: nuttx$(EXEEXT)"
|
|
$(Q) "$(CC)" $(CCLINKFLAGS) $(LIBPATHS) -o $(TOPDIR)/$@ nuttx.rel $(HOSTOBJS) $(DRVLIB) $(STDLIBS)
|
|
$(Q) $(NM) $(TOPDIR)/$@ | \
|
|
grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
|
|
sort > $(TOPDIR)/System.map
|
|
$(Q) rm -f nuttx.rel
|
|
|
|
# This is part of the top-level export target
|
|
|
|
export_startup: board/libboard$(LIBEXT) up_head.o $(HOSTOBJS)
|
|
cp up_head.o $(HOSTOBJS) ${EXPORT_DIR}/startup
|
|
cp nuttx-names.dat ${EXPORT_DIR}/libs
|
|
echo main NXmain >> ${EXPORT_DIR}/libs/nuttx-names.dat
|
|
|
|
# Dependencies
|
|
|
|
.depend: Makefile $(SRCS)
|
|
$(Q) $(MKDEP) "$(CC)" -- $(CFLAGS) -- $(SRCS) >Make.dep
|
|
$(Q) touch $@
|
|
|
|
depend: .depend
|
|
|
|
cleanrel:
|
|
$(Q) rm -f nuttx.rel GNU/Linux-names.dat Cygwin-names.dat
|
|
|
|
clean: cleanrel
|
|
$(Q) if [ -e board/Makefile ]; then \
|
|
$(MAKE) -C board TOPDIR="$(TOPDIR)" clean ; \
|
|
fi
|
|
$(call DELFILE, nuttx.rel)
|
|
$(call DELFILE, libarch$(LIBEXT))
|
|
$(call CLEAN)
|
|
|
|
distclean: clean
|
|
$(Q) if [ -e board/Makefile ]; then \
|
|
$(MAKE) -C board TOPDIR="$(TOPDIR)" distclean ; \
|
|
fi
|
|
$(call DELFILE, Make.dep)
|
|
$(call DELFILE, .depend)
|
|
$(call DELFILE, hostfs.h)
|
|
$(Q) rm -rf GNU
|
|
|
|
-include Make.dep
|