lwip_static_ip.diff file correct your problem.
On 09/07/2012 12:50 PM, ??? wrote:
Dear Genode ..
I wanna setting the network card with static IP address in the Panda-Board environment.
My Program is using lwip_nic_init() function of lwip library for network communication on the Panda-Board.
We have been applied static IP address when we using the funtion.
However it seems the function causes any problem in terms of network setting with usb_drv.
( It's only well done when we set loopback address to bind on server, with QEMU.
It's put following message, when it's in other environment.
"Could not connect!" )
Following is Server and Client source code of the my test program.
Could you please know why this program is failed on Panda_Board.
If I can't using static IP, i am to dynamic IP. How to connect to DHCP server when i using dhcp server with libc_lwip_nic_dhcp library.
And, How to configure source code or run script file.
Please take a look. Thank you.
< Server Code
/* Genode includes */ #include <base/printf.h> #include <base/thread.h> #include <util/string.h>
/* LwIP includes */ extern "C" { #include <lwip/sockets.h> #include <lwip/api.h> }
#include <lwip/genode.h> #define SERVER_PORTNUM 10000
const static char http_html_hdr[] = "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n"; /* HTTP response header */
const static char http_index_html[] = "<html><head><title>Congrats!</title></head><body><h1>Welcome to our lwIP HTTP server!</h1><p>This is a small test page.</body></html>"; /* HTML page */
/**
- Handle a single client's request.
- \param conn socket connected to the client
*/ void http_server_serve(int conn) { char buf[1024]; ssize_t buflen;
/* Read the data from the port, blocking if nothing yet there. We assume the request (the part we care about) is in one packet */ buflen = lwip_recv(conn, buf, 1024, 0);
if( buflen > 0 ) { PLOG("Packet received!"); PDBG("MSG : %s \n", buf ); }
/* Ignore all receive errors */ if (buflen > 0) {
/* Is this an HTTP GET command? (only check the first 5 chars, since there are other formats for GET, and we're keeping it very simple)*/ if (buflen >= 5 && buf[0] == 'G' && buf[1] == 'E' && buf[2] == 'T' && buf[3] == ' ' && buf[4] == '/' ) {
PLOG("Will send response");
/* Send http header */ lwip_send(conn, http_html_hdr, Genode::strlen(http_html_hdr), 0);
/* Send our HTML page */ lwip_send(conn, http_index_html, Genode::strlen(http_index_html), 0); } } }
int main() { int s;
lwip_tcpip_init();
/* Initialize network stack and do DHCP */ if (lwip_nic_init( inet_addr("10.89.8.1"), inet_addr("255.255.255.0"), inet_addr("10.89.8.1") )) { // if (lwip_nic_init(0, 0, 0 )) { PERR("We got no IP address!"); return -1; }
PLOG("Create new socket ..."); if((s = lwip_socket(AF_INET, SOCK_STREAM, 0/*IPPROTO_TCP*/)) < 0) { PERR("No socket available!"); return -1; }
PLOG("Now, I will bind ..."); struct sockaddr_in in_addr; in_addr.sin_family = AF_INET; in_addr.sin_port = htons( SERVER_PORTNUM ); in_addr.sin_addr.s_addr = inet_addr("10.89.8.1"); if(lwip_bind(s, (struct sockaddr*)&in_addr, sizeof(in_addr))) { PERR("bind failed!"); return -1; }
PLOG("Now, I will listen ..."); if(lwip_listen(s, 5)) { PERR("listen failed!"); return -1; }
PLOG("Start the server loop ...");
// Client cli; // cli.start();
while(true) { PDBG(" loop is alived. --- \n"); struct sockaddr addr; socklen_t len = sizeof(addr); int client = lwip_accept(s, &addr, &len); if(client < 0) { PWRN("Invalid socket from accept!"); continue; } http_server_serve(client); PDBG(" yahoo~~! client communication success!!!^^ client= 0x%p \n", client); lwip_close(client); } return 0; }
< Client Code
/* Genode includes */ #include <base/printf.h> #include <base/thread.h> #include <util/string.h>
//#include <unistd.h> //#include <sys/types.h>
extern "C" { #include <lwip/sockets.h> #include <lwip/api.h> }
//#include <arpa/inet.h> //#include <netinet/in.h>
#include <lwip/genode.h>
static const char *http_get_request = "GET / HTTP/1.0\r\nHost: localhost:80\r\n\r\n"; /* simple HTTP request header */
/**
- The client thread simply loops endless,
- and sends as much 'http get' requests as possible,
- printing out the response.
*/
int main() { lwip_tcpip_init();
if( lwip_nic_init( inet_addr("10.89.8.2"), inet_addr("255.255.255.0"), inet_addr("10.89.8.1") )) //if( lwip_nic_init(0, 0, 0)) { PERR("We got no IP address!"); return 0; }
while(true) {
PDBG("Create new socket ..."); int s = lwip_socket(AF_INET, SOCK_STREAM, 0 ); //IPPROTO_TCP); if (s < 0) { PERR("No socket available!"); continue; }
PDBG("Connect to server ..."); struct sockaddr_in addr; addr.sin_port = htons(10000); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr("10.89.8.1");
if((lwip_connect(s, (struct sockaddr *)&addr, sizeof(addr))) < 0) { PERR("Could not connect!"); lwip_close(s); continue; }
PDBG("Send request..."); unsigned long bytes = lwip_send(s, (char*)http_get_request, Genode::strlen(http_get_request), 0); if ( bytes < 0 ) { PERR("Couldn't send request ..."); lwip_close(s); continue; }
/* Receive http header and content independently in 2 packets */ for(int i=0; i<2; i++) { char buf[1024]; ssize_t buflen; buflen = lwip_recv(s, buf, 1024, 0); if(buflen > 0) { buf[buflen] = 0; PDBG("Packet received!"); PDBG("Packet content:\n%s", buf); } else break; }
/* Close socket */ lwip_close(s); }
PDBG("Modifyed test program ----\n"); return 0; }
< run script of Server >
if {[have_spec linux]} { puts "Run script does not support Linux."; exit 0 }
# # Build #
build { core init drivers/pci drivers/timer drivers/usb test/lwip/ESserver }
create_boot_directory
# # Generate config #
set config {
<config verbose="yes"> <parent-provides> <service name="ROM"/> <service name="RAM"/> <service name="IRQ"/> <service name="IO_MEM"/> <service name="IO_PORT"/> <service name="CAP"/> <service name="PD"/> <service name="RM"/> <service name="CPU"/> <service name="LOG"/> <service name="SIGNAL"/> </parent-provides> <default-route> <any-service> <parent/> <any-child/> </any-service> </default-route> <start name="timer"> <resource name="RAM" quantum="568K"/> <provides> <service name="Timer"/> </provides> </start> <start name="usb_drv"> <resource name="RAM" quantum="20M"/> <provides> <service name="Nic"/> <service name="Input"/> </provides> <config> <nic mac="2e:60:90:0c:4e:01" /> <hid/> </config> </start> <start name="lwip_ESserver"> <resource name="RAM" quantum="2M"/> <route> <service name="Nic"> <child name="usb_drv"/> </service> <any-service> <parent/> <any-child/> </any-service> </route> </start> }
append_if [have_spec pci] config {
<start name="pci_drv"> <resource name="RAM" quantum="1M"/> <provides> <service name="PCI"/> </provides> </start> }
append config {
</config> }
install_config $config
# # Boot modules #
# generic modules set boot_modules { core init timer usb_drv ld.lib.so libc.lib.so libc_log.lib.so lwip.lib.so lwip_ESserver }
# platform-specific modules lappend_if [have_spec pci] boot_modules pci_drv
build_boot_image $boot_modules
# # Execute test case #
run_genode_until {.*/ #.*} 3000
< run script of Client >
if {[have_spec linux]} { puts "Run script does not support Linux."; exit 0 }
# # Build #
build { core init drivers/pci drivers/timer drivers/usb test/lwip/ESclient }
create_boot_directory
# # Generate config #
set config {
<config verbose="yes"> <parent-provides> <service name="ROM"/> <service name="RAM"/> <service name="IRQ"/> <service name="IO_MEM"/> <service name="IO_PORT"/> <service name="CAP"/> <service name="PD"/> <service name="RM"/> <service name="CPU"/> <service name="LOG"/> <service name="SIGNAL"/> </parent-provides> <default-route> <any-service> <parent/> <any-child/> </any-service> </default-route> <start name="timer"> <resource name="RAM" quantum="568K"/> <provides> <service name="Timer"/> </provides> </start> <start name="usb_drv"> <resource name="RAM" quantum="20M"/> <provides> <service name="Nic"/> <service name="Input"/> </provides> <config> <nic mac="2e:60:90:0c:4e:02" /> <hid/> </config> </start> <start name="lwip_ESclient"> <resource name="RAM" quantum="2M"/> <route> <service name="Nic"> <child name="usb_drv"/> </service> <any-service> <parent/> <any-child/> </any-service> </route> </start> }
append_if [have_spec pci] config {
<start name="pci_drv"> <resource name="RAM" quantum="1M"/> <provides> <service name="PCI"/> </provides> </start> }
append config {
</config> }
install_config $config
# # Boot modules #
# generic modules set boot_modules { core init timer usb_drv ld.lib.so libc.lib.so libc_log.lib.so lwip.lib.so lwip_ESclient }
# platform-specific modules lappend_if [have_spec pci] boot_modules pci_drv
build_boot_image $boot_modules
# # Execute test case #
run_genode_until {.*/ #.*} 3000
Best regards,
Eunseok Kim
*????*
*EunSeok Kim / M. +82-10-9035-7096*
*e-Mail. eunseok.kim@...60... mailto:eunseok.kim@...60...*
Assistant Engineer
NextGen. OS Lab in Software R&D Center
*SAMSUNG ELECTRONICS CO., LTD.*
Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
Genode-main mailing list Genode-main@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/genode-main
Hello 김은석,
I opened a new issue in our tracker for your request. You can find it at https://github.com/genodelabs/genode/issues/349. We will leave comments and questions there while working on it.
On Fri, Sep 07, 2012 at 08:50:07AM +0000, 김은석 wrote:
If I can't using static IP, i am to dynamic IP. How to connect to DHCP server when i using dhcp server with libc_lwip_nic_dhcp library.
And, How to configure source code or run script file.
We're not doing anything special on our DHCP server, it's just connected to the same LAN as the Pandaboard and hands out addresses from a dynamic range to unknown MAC addresses (like those of the Genode lwip instances). In fact, your lwip applications look like any other network host to the server, e.g. a laptop.
Therefore, the example code under libports/src/test/lwip/http_srv and the run script libports/run/lwip.run a setup for this standard environment.
If your development environment does not provide a dedicated LAN with a DHCP server, I'm afraid it's up to you to connect the Pandaboards and any Linux host to a network switch and setup a DHCP server (e.g., ISC DHCP or udhcpd). If you wish, I could send you my simple netboot scripts.
Regards