Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
7198b18c
提交
7198b18c
12月 28, 2011
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Connect sys_{socket,bind,listen,accept} to lwIP
上级
3cf099da
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
170 行增加
和
13 行删除
+170
-13
file.h
file.h
+3
-1
net.c
net.c
+51
-12
sysfile.c
sysfile.c
+116
-0
没有找到文件。
file.h
浏览文件 @
7198b18c
struct
file
{
struct
file
{
enum
{
FD_NONE
,
FD_PIPE
,
FD_INODE
}
type
;
enum
{
FD_NONE
,
FD_PIPE
,
FD_INODE
,
FD_SOCKET
}
type
;
int
ref
;
// reference count
int
ref
;
// reference count
char
readable
;
char
readable
;
char
writable
;
char
writable
;
int
socket
;
struct
pipe
*
pipe
;
struct
pipe
*
pipe
;
struct
inode
*
ip
;
struct
inode
*
ip
;
u32
off
;
u32
off
;
...
...
net.c
浏览文件 @
7198b18c
...
@@ -6,6 +6,7 @@
...
@@ -6,6 +6,7 @@
#include "lwip/ip.h"
#include "lwip/ip.h"
#include "lwip/netif.h"
#include "lwip/netif.h"
#include "lwip/dhcp.h"
#include "lwip/dhcp.h"
#include "lwip/sockets.h"
#include "netif/etharp.h"
#include "netif/etharp.h"
#pragma GCC diagnostic pop
#pragma GCC diagnostic pop
#endif
#endif
...
@@ -14,6 +15,8 @@
...
@@ -14,6 +15,8 @@
#include "kernel.h"
#include "kernel.h"
#include "queue.h"
#include "queue.h"
#include "proc.h"
#include "proc.h"
#include "fs.h"
#include "file.h"
void
void
netfree
(
void
*
va
)
netfree
(
void
*
va
)
...
@@ -199,27 +202,63 @@ initnet(void)
...
@@ -199,27 +202,63 @@ initnet(void)
}
}
long
long
sys_
socket
(
int
domain
,
int
type
,
int
protocol
)
net
socket
(
int
domain
,
int
type
,
int
protocol
)
{
{
return
-
1
;
return
lwip_socket
(
domain
,
type
,
protocol
)
;
}
}
long
long
sys_
bind
(
int
sock
,
void
*
xaddr
,
int
xaddrlen
)
net
bind
(
int
sock
,
void
*
xaddr
,
int
xaddrlen
)
{
{
return
-
1
;
void
*
addr
;
long
r
;
addr
=
kmalloc
(
xaddrlen
);
if
(
addr
==
NULL
)
return
-
1
;
if
(
umemcpy
(
addr
,
xaddr
,
xaddrlen
))
return
-
1
;
r
=
lwip_bind
(
sock
,
addr
,
xaddrlen
);
kmfree
(
addr
);
return
r
;
}
}
long
long
sys_
listen
(
int
sock
,
int
backlog
)
net
listen
(
int
sock
,
int
backlog
)
{
{
return
-
1
;
return
lwip_listen
(
sock
,
backlog
)
;
}
}
long
long
sys_
accept
(
int
sock
,
void
*
xaddr
,
void
*
xaddrlen
)
net
accept
(
int
sock
,
void
*
xaddr
,
void
*
xaddrlen
)
{
{
return
-
1
;
socklen_t
*
lenptr
=
xaddrlen
;
socklen_t
len
;
void
*
addr
;
int
ss
;
if
(
umemcpy
(
&
len
,
lenptr
,
sizeof
(
*
lenptr
)))
return
-
1
;
addr
=
kmalloc
(
len
);
if
(
addr
==
NULL
)
return
-
1
;
ss
=
lwip_accept
(
sock
,
addr
,
&
len
);
if
(
ss
<
0
)
{
kmfree
(
addr
);
return
ss
;
}
if
(
kmemcpy
(
xaddrlen
,
&
len
,
sizeof
(
len
))
||
kmemcpy
(
xaddr
,
addr
,
len
))
{
lwip_close
(
ss
);
kmfree
(
addr
);
return
-
1
;
}
return
ss
;
}
}
#else
#else
...
@@ -236,25 +275,25 @@ netrx(void *va, u16 len)
...
@@ -236,25 +275,25 @@ netrx(void *va, u16 len)
}
}
long
long
sys_
socket
(
int
domain
,
int
type
,
int
protocol
)
net
socket
(
int
domain
,
int
type
,
int
protocol
)
{
{
return
-
1
;
return
-
1
;
}
}
long
long
sys_
bind
(
int
sock
,
void
*
xaddr
,
int
xaddrlen
)
net
bind
(
int
sock
,
void
*
xaddr
,
int
xaddrlen
)
{
{
return
-
1
;
return
-
1
;
}
}
long
long
sys_
listen
(
int
sock
,
int
backlog
)
net
listen
(
int
sock
,
int
backlog
)
{
{
return
-
1
;
return
-
1
;
}
}
long
long
sys_
accept
(
int
sock
,
void
*
xaddr
,
void
*
xaddrlen
)
net
accept
(
int
sock
,
void
*
xaddr
,
void
*
xaddrlen
)
{
{
return
-
1
;
return
-
1
;
}
}
...
...
sysfile.c
浏览文件 @
7198b18c
...
@@ -416,3 +416,119 @@ sys_pipe(void)
...
@@ -416,3 +416,119 @@ sys_pipe(void)
fd
[
1
]
=
fd1
;
fd
[
1
]
=
fd1
;
return
0
;
return
0
;
}
}
static
void
freesocket
(
int
fd
)
{
fileclose
(
myproc
()
->
ofile
[
fd
]);
myproc
()
->
ofile
[
fd
]
=
0
;
}
static
int
getsocket
(
int
fd
,
struct
file
**
ret
)
{
struct
file
*
f
;
if
(
fd
<
0
||
fd
>=
NOFILE
||
(
f
=
myproc
()
->
ofile
[
fd
])
==
0
)
return
-
1
;
if
(
f
->
type
!=
FD_SOCKET
)
return
-
1
;
*
ret
=
f
;
return
0
;
}
static
int
allocsocket
(
struct
file
**
rf
,
int
*
rfd
)
{
struct
file
*
f
;
int
fd
;
f
=
filealloc
();
if
(
f
==
NULL
)
return
-
1
;
fd
=
fdalloc
(
f
);
if
(
fd
<
0
)
{
fileclose
(
f
);
return
fd
;
}
f
->
type
=
FD_SOCKET
;
f
->
off
=
0
;
f
->
readable
=
1
;
f
->
writable
=
1
;
*
rf
=
f
;
*
rfd
=
fd
;
return
0
;
}
long
sys_socket
(
int
domain
,
int
type
,
int
protocol
)
{
extern
long
netsocket
(
int
domain
,
int
type
,
int
protocol
);
struct
file
*
f
;
int
fd
;
int
s
;
if
(
allocsocket
(
&
f
,
&
fd
))
return
-
1
;
s
=
netsocket
(
domain
,
type
,
protocol
);
if
(
s
<
0
)
{
myproc
()
->
ofile
[
fd
]
=
0
;
fileclose
(
f
);
return
s
;
}
f
->
socket
=
s
;
return
fd
;
}
long
sys_bind
(
int
xsock
,
void
*
xaddr
,
int
xaddrlen
)
{
extern
long
netbind
(
int
,
void
*
,
int
);
struct
file
*
f
;
if
(
getsocket
(
xsock
,
&
f
))
return
-
1
;
return
netbind
(
f
->
socket
,
xaddr
,
xaddrlen
);
}
long
sys_listen
(
int
xsock
,
int
backlog
)
{
extern
long
netlisten
(
int
,
int
);
struct
file
*
f
;
if
(
getsocket
(
xsock
,
&
f
))
return
-
1
;
return
netlisten
(
f
->
socket
,
backlog
);
}
long
sys_accept
(
int
xsock
,
void
*
xaddr
,
void
*
xaddrlen
)
{
extern
long
netaccept
(
int
,
void
*
,
void
*
);
struct
file
*
f
,
*
cf
;
int
cfd
;
int
ss
;
if
(
getsocket
(
xsock
,
&
f
))
return
-
1
;
if
(
allocsocket
(
&
cf
,
&
cfd
))
return
-
1
;
ss
=
netaccept
(
f
->
socket
,
xaddr
,
xaddrlen
);
if
(
ss
<
0
)
{
freesocket
(
cfd
);
return
ss
;
}
cf
->
socket
=
ss
;
return
cfd
;
}
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论