6 #include <boost/format.hpp>
10 #include <l4/re/namespace>
11 #include <l4/re/util/cap_alloc>
12 #include <l4/re/util/object_registry>
13 #include <l4/re/protocols>
14 #include <l4/re/util/meta>
15 #include <l4/cxx/ipc_server>
16 #include <l4/cxx/iostream>
17 #include <l4/cxx/l4iostream>
18 #include <l4/dde/linux26/dde26.h>
20 #include <l4/sys/debugger.h>
21 #include <l4/ankh/protocol>
22 #include <l4/ankh/packet_analyzer.h>
25 #include "linux_glue.h"
27 static L4Re::Util::Registry_server<> server;
29 int Ankh::ServerSession::dispatch(l4_umword_t, L4::Ipc_iostream &ios)
35 if (t.label() != Ankh::Protocol::Ankh)
43 case Ankh::Opcode::Activate:
48 case Ankh::Opcode::Deactivate:
53 std::cout << "Unknown op: " << op << "\n";
62 class Ankh_server : public L4::Server_object
65 int dispatch(l4_umword_t, L4::Ipc_iostream &ios);
69 int Ankh_server::dispatch(l4_umword_t, L4::Ipc_iostream &ios)
76 * Used by Ned to find out our supported protocols
78 case L4::Meta::Protocol:
79 return L4Re::Util::handle_meta_request<L4::Factory>(ios);
82 * Factory protocol to create new sessions
84 case L4::Factory::Protocol:
86 unsigned long size = 250;
98 if (!opt.is_of<char const *>()) {
99 std::cerr << "[ERR] Parameter needs to be a string constant.\n";
103 strncpy(buf, opt.value<char const*>(), size);
105 Ankh::ServerSession *ret = Ankh::Session_factory::get()->create(buf);
108 server.registry()->register_obj(ret);
109 ios << ret->obj_cap();
114 L4::cerr << "Error creating Ankh session object.\n";
119 std::cout << "Unknown protocol: " << t.label() << "\n";
126 EXTERN_C void netdev_add(void *ptr)
128 Ankh::Device_manager::dev_mgr()->add_device(ptr);
132 EXTERN_C void enable_ux_self()
134 l4_thread_control_start();
135 l4_thread_control_ux_host_syscall(1);
136 l4_thread_control_commit(pthread_getl4cap(pthread_self()));
140 EXTERN_C int packet_deliver(void *packet, unsigned len, char const * const dev, unsigned local)
143 static int callcount = 0;
144 if (++callcount >= 7500) {
145 L4Re::Env::env()->parent()->signal(0, 1);
151 int c = l4_debugger_global_id(pthread_getl4cap(pthread_self()));
154 Ankh::Util::print_mac(static_cast<unsigned char*>(packet));
156 Ankh::Util::print_mac(static_cast<unsigned char*>(packet)+6);
157 std::cout << std::endl;
160 Ankh::ServerSession *s = Ankh::Session_factory::get()->find_session_for_mac(
161 static_cast<const char * const>(packet), dev);
166 packet_analyze(static_cast<char*>(packet), len);
171 s->deliver(static_cast<char*>(packet), len);
175 s = Ankh::Session_factory::get()->find_session_for_mac(
176 static_cast<const char * const>(packet), dev, s);
186 int num_devs = open_network_devices(1);
187 std::cout << "Opened " << num_devs << " network devices.\n";
188 Ankh::Device_manager::dev_mgr()->dump_devices();
190 server.registry()->register_obj(&ankh, "ankh_service");
191 std::cout << "Registered @ registry.\n";
193 std::cout << "Gooood Morning Ankh-Morpoooooork! TID = 0x" << std::hex << l4_debugger_global_id(pthread_getl4cap(pthread_self())) << std::dec << "\n";
194 l4_debugger_set_object_name(pthread_getl4cap(pthread_self()), "ankh.main");
200 catch (L4::Base_exception const &e)
202 L4::cerr << "Error: " << e << '\n';
205 catch (std::exception const &e)
207 std::cerr << "Error: " << e.what() << '\n';