--- /dev/null
+--- a/mcproxy/src/utils/mc_socket.cpp
++++ b/mcproxy/src/utils/mc_socket.cpp
+@@ -37,6 +37,135 @@
+ #include <numeric>
+ #include <unistd.h>
+
++#ifdef __UCLIBC__
++#include <assert.h>
++#include <netax25/ax25.h>
++#include <netipx/ipx.h>
++#include <stdlib.h>
++#include <sys/param.h>
++#include <sys/socket.h>
++
++extern "C" {
++static const struct
++{
++ int sol;
++ int af;
++ socklen_t size;
++} sol_map[] =
++ {
++ /* Sort the array according to importance of the protocols. Add
++ more protocols when they become available. */
++ { SOL_IP, AF_INET, sizeof(struct sockaddr_in) },
++ { SOL_IPV6, AF_INET6, sizeof(struct sockaddr_in6) },
++ { SOL_AX25, AF_AX25, sizeof(struct sockaddr_ax25) },
++ { SOL_IPX, AF_IPX, sizeof(struct sockaddr_ipx) },
++ { SOL_PACKET, AF_PACKET, sizeof(struct sockaddr_ll) }
++ };
++#define NSOL_MAP (sizeof(sol_map) / sizeof(sol_map[0]))
++
++/* Try to determine the socket level value. Ideally both side and
++ family are set. But sometimes only the size is correct and the
++ family value might be bogus. Loop over the array entries and look
++ for a perfect match or the first match based on size. */
++int __get_sol(int af, socklen_t len)
++{
++ int first_size_sol = -1;
++ for (size_t cnt = 0; cnt < NSOL_MAP; ++cnt) {
++ /* Just a test so that we make sure the special value used to
++ signal the "we have so far no socket level value" is OK. */
++ assert(sol_map[cnt].sol != -1);
++
++ if (len == sol_map[cnt].size) {
++ /* The size matches, which is a requirement. If the family
++ matches, too, we have a winner. Otherwise we remember the
++ socket level value for this protocol if it is the first
++ match. */
++ if (af == sol_map[cnt].af)
++ return sol_map[cnt].sol;
++
++ if (first_size_sol == -1)
++ first_size_sol = sol_map[cnt].sol;
++ }
++ }
++
++ return first_size_sol;
++}
++
++int getsourcefilter(int s, uint32_t interface, const struct sockaddr *group,
++ socklen_t grouplen, uint32_t *fmode, uint32_t *numsrc,
++ struct sockaddr_storage *slist)
++{
++ socklen_t needed = GROUP_FILTER_SIZE(*numsrc);
++ struct group_filter *gf;
++
++ gf = (struct group_filter *) malloc(needed);
++ if (gf == NULL)
++ return -1;
++
++ gf->gf_interface = interface;
++ memcpy(&gf->gf_group, group, grouplen);
++ gf->gf_numsrc = *numsrc;
++
++ /* We need to provide the appropriate socket level value. */
++ int result;
++ int sol = __get_sol(group->sa_family, grouplen);
++ if (sol == -1) {
++ result = -1;
++ }
++ else {
++ result = getsockopt(s, sol, MCAST_MSFILTER, gf, &needed);
++
++ /* If successful, copy the results to the places the caller wants
++ them in. */
++ if (result == 0) {
++ *fmode = gf->gf_fmode;
++ memcpy(slist, gf->gf_slist,
++ MIN(*numsrc, gf->gf_numsrc)
++ * sizeof(struct sockaddr_storage));
++ *numsrc = gf->gf_numsrc;
++ }
++ }
++
++ free(gf);
++
++ return result;
++}
++
++int setsourcefilter(int s, uint32_t interface, const struct sockaddr *group,
++ socklen_t grouplen, uint32_t fmode, uint32_t numsrc,
++ const struct sockaddr_storage *slist)
++{
++ /* We have to create an struct ip_msfilter object which we can pass
++ to the kernel. */
++ size_t needed = GROUP_FILTER_SIZE(numsrc);
++ struct group_filter *gf;
++
++ gf = (struct group_filter *) malloc(needed);
++ if (gf == NULL)
++ return -1;
++
++ gf->gf_interface = interface;
++ memcpy(&gf->gf_group, group, grouplen);
++ gf->gf_fmode = fmode;
++ gf->gf_numsrc = numsrc;
++ memcpy(gf->gf_slist, slist, numsrc * sizeof(struct sockaddr_storage));
++
++ /* We need to provide the appropriate socket level value. */
++ int result;
++ int sol = __get_sol(group->sa_family, grouplen);
++ if (sol == -1) {
++ result = -1;
++ }
++ else
++ result = setsockopt(s, sol, MCAST_MSFILTER, gf, needed);
++
++ free(gf);
++
++ return result;
++}
++}
++#endif /* __UCLIBC__ */
++
+ std::string ipAddrResolver(std::string ipAddr)
+ {
+ std::string str[][2] = {
--- /dev/null
+OBJECTS = main.o \
+ hamcast_logging.o \
+ mc_socket.o \
+ addr_storage.o \
+ mroute_socket.o \
+ if_prop.o \
+ reverse_path_filter.o \
+ proxy.o \
+ sender.o \
+ receiver.o \
+ mld_receiver.o \
+ igmp_receiver.o \
+ mld_sender.o \
+ igmp_sender.o \
+ proxy_instance.o \
+ routing.o \
+ worker.o \
+ timing.o \
+ check_if.o \
+ check_kernel.o \
+ membership_db.o \
+ querier.o \
+ timers_values.o \
+ interfaces.o \
+ def.o \
+ simple_mc_proxy_routing.o \
+ simple_routing_data.o \
+ scanner.o \
+ token.o \
+ configuration.o \
+ parser.o \
+ interface.o
+
+TARGET = mcproxy
+
+####### Implicit rules
+
+.cpp.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+####### Build rules
+
+all: $(TARGET)
+
+$(TARGET): $(OBJECTS)
+ $(CXX) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
+
+clean:
+ rm -f $(OBJECTS) $(TARGET)
+
+####### Compile
+
+main.o: src/main.cpp include/hamcast_logging.h \
+ include/utils/if_prop.hpp \
+ include/utils/mc_socket.hpp \
+ include/utils/addr_storage.hpp \
+ include/utils/mroute_socket.hpp \
+ include/proxy/proxy.hpp \
+ include/proxy/timing.hpp \
+ include/proxy/message_format.hpp \
+ include/proxy/def.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/timers_values.hpp \
+ include/parser/interface.hpp \
+ include/proxy/check_if.hpp \
+ include/proxy/membership_db.hpp \
+ include/proxy/querier.hpp \
+ include/proxy/proxy_instance.hpp \
+ include/proxy/worker.hpp \
+ include/proxy/message_queue.hpp \
+ include/proxy/simple_mc_proxy_routing.hpp \
+ include/proxy/routing_management.hpp \
+ include/proxy/simple_routing_data.hpp \
+ include/proxy/igmp_sender.hpp \
+ include/proxy/sender.hpp \
+ include/parser/configuration.hpp \
+ include/parser/token.hpp \
+ include/tester/tester.hpp \
+ include/tester/config_map.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o src/main.cpp
+
+hamcast_logging.o: src/hamcast_logging.cpp include/hamcast_logging.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o hamcast_logging.o src/hamcast_logging.cpp
+
+mc_socket.o: src/utils/mc_socket.cpp include/hamcast_logging.h \
+ include/utils/mc_socket.hpp \
+ include/utils/addr_storage.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o mc_socket.o src/utils/mc_socket.cpp
+
+addr_storage.o: src/utils/addr_storage.cpp include/hamcast_logging.h \
+ include/utils/addr_storage.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o addr_storage.o src/utils/addr_storage.cpp
+
+mroute_socket.o: src/utils/mroute_socket.cpp include/hamcast_logging.h \
+ include/utils/mroute_socket.hpp \
+ include/utils/mc_socket.hpp \
+ include/utils/addr_storage.hpp \
+ include/utils/extended_mld_defines.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o mroute_socket.o src/utils/mroute_socket.cpp
+
+if_prop.o: src/utils/if_prop.cpp include/hamcast_logging.h \
+ include/utils/if_prop.hpp \
+ include/utils/addr_storage.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o if_prop.o src/utils/if_prop.cpp
+
+reverse_path_filter.o: src/utils/reverse_path_filter.cpp include/utils/reverse_path_filter.hpp \
+ include/hamcast_logging.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o reverse_path_filter.o src/utils/reverse_path_filter.cpp
+
+proxy.o: src/proxy/proxy.cpp include/hamcast_logging.h \
+ include/proxy/proxy.hpp \
+ include/proxy/check_kernel.hpp \
+ include/proxy/timing.hpp \
+ include/proxy/message_format.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/def.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/timers_values.hpp \
+ include/parser/interface.hpp \
+ include/proxy/proxy_instance.hpp \
+ include/proxy/worker.hpp \
+ include/proxy/message_queue.hpp \
+ include/proxy/querier.hpp \
+ include/proxy/membership_db.hpp \
+ include/parser/configuration.hpp \
+ include/parser/token.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o proxy.o src/proxy/proxy.cpp
+
+sender.o: src/proxy/sender.cpp include/hamcast_logging.h \
+ include/proxy/sender.hpp \
+ include/utils/mroute_socket.hpp \
+ include/utils/mc_socket.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/def.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/message_format.hpp \
+ include/proxy/timers_values.hpp \
+ include/parser/interface.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o sender.o src/proxy/sender.cpp
+
+receiver.o: src/proxy/receiver.cpp include/hamcast_logging.h \
+ include/proxy/receiver.hpp \
+ include/utils/mroute_socket.hpp \
+ include/utils/mc_socket.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/message_format.hpp \
+ include/proxy/def.hpp \
+ include/proxy/timers_values.hpp \
+ include/parser/interface.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o receiver.o src/proxy/receiver.cpp
+
+mld_receiver.o: src/proxy/mld_receiver.cpp include/hamcast_logging.h \
+ include/proxy/mld_receiver.hpp \
+ include/proxy/receiver.hpp \
+ include/utils/mroute_socket.hpp \
+ include/utils/mc_socket.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/message_format.hpp \
+ include/proxy/def.hpp \
+ include/proxy/timers_values.hpp \
+ include/parser/interface.hpp \
+ include/proxy/proxy_instance.hpp \
+ include/proxy/worker.hpp \
+ include/proxy/message_queue.hpp \
+ include/proxy/querier.hpp \
+ include/proxy/membership_db.hpp \
+ include/utils/extended_mld_defines.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o mld_receiver.o src/proxy/mld_receiver.cpp
+
+igmp_receiver.o: src/proxy/igmp_receiver.cpp include/hamcast_logging.h \
+ include/proxy/igmp_receiver.hpp \
+ include/proxy/receiver.hpp \
+ include/utils/mroute_socket.hpp \
+ include/utils/mc_socket.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/message_format.hpp \
+ include/proxy/def.hpp \
+ include/proxy/timers_values.hpp \
+ include/parser/interface.hpp \
+ include/proxy/proxy_instance.hpp \
+ include/proxy/worker.hpp \
+ include/proxy/message_queue.hpp \
+ include/proxy/querier.hpp \
+ include/proxy/membership_db.hpp \
+ include/utils/extended_igmp_defines.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o igmp_receiver.o src/proxy/igmp_receiver.cpp
+
+mld_sender.o: src/proxy/mld_sender.cpp include/hamcast_logging.h \
+ include/proxy/mld_sender.hpp \
+ include/proxy/sender.hpp \
+ include/utils/mroute_socket.hpp \
+ include/utils/mc_socket.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/def.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/message_format.hpp \
+ include/proxy/timers_values.hpp \
+ include/parser/interface.hpp \
+ include/utils/extended_mld_defines.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o mld_sender.o src/proxy/mld_sender.cpp
+
+igmp_sender.o: src/proxy/igmp_sender.cpp include/hamcast_logging.h \
+ include/proxy/igmp_sender.hpp \
+ include/proxy/sender.hpp \
+ include/utils/mroute_socket.hpp \
+ include/utils/mc_socket.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/def.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/message_format.hpp \
+ include/proxy/timers_values.hpp \
+ include/parser/interface.hpp \
+ include/utils/extended_igmp_defines.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o igmp_sender.o src/proxy/igmp_sender.cpp
+
+proxy_instance.o: src/proxy/proxy_instance.cpp include/hamcast_logging.h \
+ include/proxy/proxy_instance.hpp \
+ include/proxy/worker.hpp \
+ include/proxy/message_queue.hpp \
+ include/proxy/message_format.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/def.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/timers_values.hpp \
+ include/parser/interface.hpp \
+ include/proxy/querier.hpp \
+ include/proxy/membership_db.hpp \
+ include/proxy/receiver.hpp \
+ include/utils/mroute_socket.hpp \
+ include/utils/mc_socket.hpp \
+ include/proxy/igmp_receiver.hpp \
+ include/proxy/mld_receiver.hpp \
+ include/proxy/sender.hpp \
+ include/proxy/igmp_sender.hpp \
+ include/proxy/mld_sender.hpp \
+ include/proxy/routing.hpp \
+ include/proxy/timing.hpp \
+ include/proxy/routing_management.hpp \
+ include/proxy/simple_mc_proxy_routing.hpp \
+ include/proxy/simple_routing_data.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o proxy_instance.o src/proxy/proxy_instance.cpp
+
+routing.o: src/proxy/routing.cpp include/hamcast_logging.h \
+ include/proxy/routing.hpp \
+ include/utils/if_prop.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/utils/addr_storage.hpp \
+ include/utils/mroute_socket.hpp \
+ include/utils/mc_socket.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o routing.o src/proxy/routing.cpp
+
+worker.o: src/proxy/worker.cpp include/hamcast_logging.h \
+ include/proxy/worker.hpp \
+ include/proxy/message_queue.hpp \
+ include/proxy/message_format.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/def.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/timers_values.hpp \
+ include/parser/interface.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o worker.o src/proxy/worker.cpp
+
+timing.o: src/proxy/timing.cpp include/hamcast_logging.h \
+ include/proxy/timing.hpp \
+ include/proxy/message_format.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/def.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/timers_values.hpp \
+ include/parser/interface.hpp \
+ include/proxy/worker.hpp \
+ include/proxy/message_queue.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o timing.o src/proxy/timing.cpp
+
+check_if.o: src/proxy/check_if.cpp include/hamcast_logging.h \
+ include/proxy/check_if.hpp \
+ include/utils/if_prop.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o check_if.o src/proxy/check_if.cpp
+
+check_kernel.o: src/proxy/check_kernel.cpp include/hamcast_logging.h \
+ include/proxy/check_kernel.hpp \
+ include/utils/mroute_socket.hpp \
+ include/utils/mc_socket.hpp \
+ include/utils/addr_storage.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o check_kernel.o src/proxy/check_kernel.cpp
+
+membership_db.o: src/proxy/membership_db.cpp include/proxy/membership_db.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/def.hpp \
+ include/proxy/message_format.hpp \
+ include/hamcast_logging.h \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/timers_values.hpp \
+ include/parser/interface.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o membership_db.o src/proxy/membership_db.cpp
+
+querier.o: src/proxy/querier.cpp include/hamcast_logging.h \
+ include/proxy/querier.hpp \
+ include/proxy/membership_db.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/def.hpp \
+ include/proxy/message_format.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/timers_values.hpp \
+ include/parser/interface.hpp \
+ include/proxy/timing.hpp \
+ include/proxy/sender.hpp \
+ include/utils/mroute_socket.hpp \
+ include/utils/mc_socket.hpp \
+ include/proxy/igmp_sender.hpp \
+ include/proxy/mld_sender.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o querier.o src/proxy/querier.cpp
+
+timers_values.o: src/proxy/timers_values.cpp include/proxy/timers_values.hpp \
+ include/hamcast_logging.h \
+ include/proxy/membership_db.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/def.hpp \
+ include/proxy/message_format.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/parser/interface.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o timers_values.o src/proxy/timers_values.cpp
+
+interfaces.o: src/proxy/interfaces.cpp include/hamcast_logging.h \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/utils/addr_storage.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o interfaces.o src/proxy/interfaces.cpp
+
+def.o: src/proxy/def.cpp include/proxy/def.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o def.o src/proxy/def.cpp
+
+simple_mc_proxy_routing.o: src/proxy/simple_mc_proxy_routing.cpp include/hamcast_logging.h \
+ include/proxy/simple_mc_proxy_routing.hpp \
+ include/proxy/routing_management.hpp \
+ include/proxy/def.hpp \
+ include/proxy/simple_routing_data.hpp \
+ include/parser/interface.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/proxy_instance.hpp \
+ include/proxy/worker.hpp \
+ include/proxy/message_queue.hpp \
+ include/proxy/message_format.hpp \
+ include/proxy/timers_values.hpp \
+ include/proxy/querier.hpp \
+ include/proxy/membership_db.hpp \
+ include/proxy/routing.hpp \
+ include/proxy/sender.hpp \
+ include/utils/mroute_socket.hpp \
+ include/utils/mc_socket.hpp \
+ include/proxy/timing.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o simple_mc_proxy_routing.o src/proxy/simple_mc_proxy_routing.cpp
+
+simple_routing_data.o: src/proxy/simple_routing_data.cpp include/hamcast_logging.h \
+ include/proxy/simple_routing_data.hpp \
+ include/proxy/def.hpp \
+ include/proxy/message_format.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/proxy/timers_values.hpp \
+ include/parser/interface.hpp \
+ include/utils/mroute_socket.hpp \
+ include/utils/mc_socket.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o simple_routing_data.o src/proxy/simple_routing_data.cpp
+
+scanner.o: src/parser/scanner.cpp include/hamcast_logging.h \
+ include/parser/scanner.hpp \
+ include/parser/token.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o scanner.o src/parser/scanner.cpp
+
+token.o: src/parser/token.cpp include/hamcast_logging.h \
+ include/parser/token.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o token.o src/parser/token.cpp
+
+configuration.o: src/parser/configuration.cpp include/hamcast_logging.h \
+ include/parser/configuration.hpp \
+ include/parser/token.hpp \
+ include/parser/interface.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/def.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp \
+ include/parser/parser.hpp \
+ include/parser/scanner.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o configuration.o src/parser/configuration.cpp
+
+parser.o: src/parser/parser.cpp include/hamcast_logging.h \
+ include/parser/parser.hpp \
+ include/parser/scanner.hpp \
+ include/proxy/def.hpp \
+ include/parser/token.hpp \
+ include/parser/interface.hpp \
+ include/utils/addr_storage.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o parser.o src/parser/parser.cpp
+
+interface.o: src/parser/interface.cpp include/hamcast_logging.h \
+ include/parser/interface.hpp \
+ include/utils/addr_storage.hpp \
+ include/proxy/def.hpp \
+ include/proxy/interfaces.hpp \
+ include/utils/if_prop.hpp \
+ include/utils/reverse_path_filter.hpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o interface.o src/parser/interface.cpp