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);
104 unsigned len = opt.length();
107 Ankh::ServerSession *ret = Ankh::Session_factory::get()->create(buf);
110 server.registry()->register_obj(ret);
111 ios << ret->obj_cap();
116 L4::cerr << "Error creating Ankh session object.\n";
121 std::cout << "Unknown protocol: " << t.label() << "\n";
128 EXTERN_C void netdev_add(void *ptr)
130 Ankh::Device_manager::dev_mgr()->add_device(ptr);
134 EXTERN_C void enable_ux_self()
136 l4_thread_control_start();
137 l4_thread_control_ux_host_syscall(1);
138 l4_thread_control_commit(pthread_getl4cap(pthread_self()));
142 EXTERN_C int packet_deliver(void *packet, unsigned len, char const * const dev, unsigned local)
145 static int callcount = 0;
146 if (++callcount >= 7500) {
147 L4Re::Env::env()->parent()->signal(0, 1);
153 int c = l4_debugger_global_id(pthread_getl4cap(pthread_self()));
156 Ankh::Util::print_mac(static_cast<unsigned char*>(packet));
158 Ankh::Util::print_mac(static_cast<unsigned char*>(packet)+6);
159 std::cout << std::endl;
162 Ankh::ServerSession *s = Ankh::Session_factory::get()->find_session_for_mac(
163 static_cast<const char * const>(packet), dev);
168 packet_analyze(static_cast<char*>(packet), len);
173 s->deliver(static_cast<char*>(packet), len);
177 s = Ankh::Session_factory::get()->find_session_for_mac(
178 static_cast<const char * const>(packet), dev, s);
188 int num_devs = open_network_devices(1);
189 std::cout << "Opened " << num_devs << " network devices.\n";
190 Ankh::Device_manager::dev_mgr()->dump_devices();
192 server.registry()->register_obj(&ankh, "ankh_service");
193 std::cout << "Registered @ registry.\n";
195 std::cout << "Gooood Morning Ankh-Morpoooooork! TID = 0x" << std::hex << l4_debugger_global_id(pthread_getl4cap(pthread_self())) << std::dec << "\n";
196 l4_debugger_set_object_name(pthread_getl4cap(pthread_self()), "ankh.main");
202 catch (L4::Base_exception const &e)
204 L4::cerr << "Error: " << e << '\n';
207 catch (std::exception const &e)
209 std::cerr << "Error: " << e.what() << '\n';