2007年9月19日水曜日

rtl8187

何となく rc6-mm1 パッチだけあてて make menuconfig してみたところ、zd1211rw の mac80211 ありました。なので、近々? zd1211 でも Master あるいは Monitor mode にできるかも。

....とか言いつつ mac80211 & USB で何か無いかなぁ。と眺めていたところ rtl8187 なるデバイスが 2.6.23-rc にて使えるとの話。探した探した見付かった。個人輸入代行まで考えていたが 7月? 頃 NetGear の日本語版が発売。物は
ネットギア・インターナショナル WG111 USB2.0 無線アダプタ WG111-300JPS
との事で大凡 2,000- 程度。で rtl8187_dev.c の適当なところに
{USB_DEVICE(0x0846, 0x4260)},
を加えてあげて、認識した。が、個人的には USB2.0 only はチト辛い。ここから先は未。

2007年9月18日火曜日

LSRR with nuttcp

iperf どうしようか...と考えていたところ nuttcp なるものを発見。例のごとく読み切れていないのだけど、クライアント側からの trans のみで有効なパッチを適当に作成して測定してみたところ...遅いっ。遅すぎる。なーぜー? 他の環境でも試してみよう。

あっ /proc/sys/net/ipv4/conf/eth#/accept_source_route だけではダメで all/accept_source_route も 1 に。また conntrack してるなら INVALID も受付けるように。

--- nuttcp-5.3.1.c.orig 2007-09-18 21:19:37.000000000 +0900
+++ nuttcp-5.3.1.c 2007-09-18 23:32:05.000000000 +0900
@@ -357,6 +357,16 @@
#include "addrinfo.h" /* from missing */
#endif

+/* Source record routing */
+#include <netinet/ip.h>
+#include <sys/queue.h>
+struct entry {
+ char *hname;
+ char strict;
+ TAILQ_ENTRY(entry) entries;
+};
+TAILQ_HEAD(qhead, entry);
+
static struct timeval time0; /* Time at which timing started */
static struct timeval timepk; /* Time at which last packet sent */
static struct timeval timep; /* Previous time - for interval reporting */
@@ -465,6 +475,8 @@
int delay( int us );
int mread( int fd, char *bufp, unsigned n);
char *getoptvalp( char **argv, int index, int reqval, int *skiparg );
+char *alloc_inet_srr(int is_ssrr);
+int add_inet_gate(char *optr, char *hname);

int vers_major = 5;
int vers_minor = 3;
@@ -508,6 +520,12 @@
int srvrwin=0;
/* end nick code */

+/* source record routing */
+int ngates = 0;
+struct qhead gates;
+struct qhead *gatesp;
+/* end source record routing */
+
int udp = 0; /* 0 = tcp, !0 = udp */
int udplossinfo = 0; /* set to 1 to give UDP loss info for
* interval reporting */
@@ -641,7 +659,8 @@
-T## transmit timeout in seconds (or (m|M)inutes or (h|H)ours)\n\
-i## receiver interval reporting in seconds (or (m|M)inutes)\n\
-Ixxx identifier for nuttcp output (max of 40 characters)\n\
- -F flip option to reverse direction of data connection open\n"
+ -F flip option to reverse direction of data connection open\n\
+ -gxxx specifies lsrr point\n"
#ifdef HAVE_SETPRIO
" -xP## set nuttcp process priority (must be root)\n"
#endif
@@ -972,6 +991,7 @@
short save_events;
int skiparg;
int reqval;
+ struct entry *gate;

sendwin = 0;
rcvwin = 0;
@@ -1435,6 +1455,24 @@
goto usage;
}
break;
+ case 'g':
+ reqval = 1;
+ gate = (struct entry *)calloc(1, sizeof(struct entry));
+ cp1 = getoptvalp(argv, 2, reqval, &skiparg);
+ gate->hname = calloc(1, strlen(cp1) + 1);
+ strncpy(gate->hname, cp1, strlen(cp1));
+ if (!ngates) {
+ TAILQ_INIT(&gates);
+ } else {
+ if (ngates > 9) {
+ fprintf(stderr, "too many gate was specified\n");
+ fflush(stderr);
+ exit(1);
+ }
+ }
+ TAILQ_INSERT_TAIL(&gates, gate, entries);
+ ngates++;
+ break;
case 'h':
default:
goto usage;
@@ -1608,6 +1646,11 @@
fprintf(stderr, "server mode only allowed for receiver\n");
goto usage;
}
+ if (ngates) {
+ fprintf(stderr, "source route only allowed for client\n");
+ goto usage;
+ }
+
udp = 0;
sinkmode = 1;
start_idx = 0;
@@ -2576,6 +2619,29 @@
err("setsockopt");
}
}
+ if (ngates) {
+ if (af == AF_INET6) {
+ fprintf(stderr, "source route allowed for AF_INET only, sorry");
+ fflush(stderr);
+ exit(1);
+ }
+
+ cp1 = alloc_inet_srr(0);
+ if (!cp1)
+ err("alloc");
+ for (gate = gates.tqh_first; gate != NULL; gate = gate->entries.tqe_next) {
+ i = add_inet_gate(cp1, gate->hname);
+ if (!i)
+ err("add gate");
+ if (i < 0) {
+ fprintf(stderr, "%s: %s\n", gai_strerror(i), gate->hname);
+ exit(1);
+ }
+ }
+ if (setsockopt(fd[stream_idx], IPPROTO_IP, IP_OPTIONS, cp1, i)) {
+ err("setsockopt");
+ }
+ }
}
if (!udp || (stream_idx == 0)) {
if (((trans && !reverse) && (stream_idx > 0)) ||
@@ -4572,3 +4638,59 @@

return(*nextarg);
}
+
+/* from Richard W. Stevens, unpv12 */
+
+char *
+alloc_inet_srr(int is_ssrr) {
+ char *opt, *p;
+
+ p = calloc(1, 44); /* NOP, code, len, ptr, up to 10 addresses */
+ if (!p) {
+ return NULL;
+ }
+ opt = p;
+ *opt++ = IPOPT_NOP; /* NOP for alignment */
+ *opt++ = is_ssrr ? IPOPT_SSRR : IPOPT_LSRR;
+ *opt++ = 3; /* fill in the length */
+ *opt++ = 4; /* offset to first address */
+
+ return p;
+}
+
+int
+add_inet_gate(char *optr, char *hname)
+{
+ int n;
+ struct addrinfo *ai, hints;
+ struct sockaddr_in *sin;
+
+ char *lenptr = optr + 2; /* pointer to length byte in SRR option */
+
+ if (*optr != IPOPT_NOP) {
+ errno = EINVAL; /* slight sanity check */
+ return 0;
+ }
+ if (*lenptr > 9) {
+ errno = ENOBUFS;
+ return 0; /* too many source routes */
+ }
+
+ bzero(&hints, sizeof(struct addrinfo));
+ hints.ai_flags = AI_CANONNAME; /* always return canonical name */
+ hints.ai_family = AF_INET;
+ hints.ai_socktype = 0;
+
+ if ((n = getaddrinfo(hname, NULL, &hints, &ai)) != 0) {
+ return n;
+ }
+
+ sin = (struct sockaddr_in *) ai->ai_addr;
+ memcpy(optr + 1 + *lenptr, &sin->sin_addr, sizeof(struct in_addr));
+ freeaddrinfo(ai);
+
+ *lenptr += sizeof(struct in_addr);
+
+ return *lenptr + 1; /* size for setsockopt() */
+}
すっかり LSRR ハマってる自分。

2007年9月10日月曜日

lguest64

[ANNOUNCE] Lguest64 - fatter puppies! This is a formal announcement of Lguest64. だそうだ。
git://git.et.redhat.com/kernel-lguest-64.git だそうだ (T_T)

ncftp(get|put) で bind

ncftpget, ncftpput で送信元アドレスを指定するパッチを貼り付け。あんまチェックとかしていないけど、とりあえずなら使えたので。
diff -ubBr ncftp-3.2.0/libncftp/ftp.c ncftp-3.2.0-bind/libncftp/ftp.c                                                                                                                 
--- ncftp-3.2.0/libncftp/ftp.c 2005-01-02 06:27:07.000000000 +0900
+++ ncftp-3.2.0-bind/libncftp/ftp.c 2007-09-09 16:37:07.000000000 +0900
@@ -88,6 +88,16 @@
return (result);
} /* GetSocketAddress */

+static int
+SetSocketAddress(int sockfd, struct sockaddr_in *saddr)
+{
+ saddr->sin_family = AF_INET;
+ saddr->sin_port = 0;
+
+ return bind(sockfd, (struct sockaddr *) saddr, sizeof(struct sockaddr_in));
+} /* SetSocketAddress */
+
+



@@ -286,7 +296,7 @@
* size specified.
*/
(void) SetSocketBufSize(sockfd, cip->ctrlSocketRBufSize, cip->ctrlSocketSBufSize);
-
+ (void) SetSocketAddress(sockfd, &cip->ourCtlAddr);
#ifdef NO_SIGNALS
err = SConnect(sockfd, &cip->servCtlAddr, (int) cip->connTimeout);

diff -ubBr ncftp-3.2.0/sh_util/ncftpget.c ncftp-3.2.0-bind/sh_util/ncftpget.c
--- ncftp-3.2.0/sh_util/ncftpget.c 2006-08-12 08:36:34.000000000 +0900
+++ ncftp-3.2.0-bind/sh_util/ncftpget.c 2007-09-09 17:17:21.000000000 +0900
@@ -228,7 +228,7 @@
perfilecmd[0] = '\0';

GetoptReset(&opt);
- while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:t:aRTr:vVf:ADzZEFbcCB:W:X:Y:")) > 0) {
+ while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:t:aRTr:vVf:ADzZEFbcCB:W:X:Y:L:")) > 0) {
if (c == 'b') {
batchmode++;
}
@@ -247,7 +247,7 @@
}

GetoptReset(&opt);
- while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:t:aRTr:vVf:o:ADzZEFbcCB:W:X:Y:")) > 0) switch(c) {
+ while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:t:aRTr:vVf:o:ADzZEFbcCB:W:X:Y:L:")) > 0) switch(c) {
case 'P':
fi.port = atoi(opt.arg);
break;
@@ -363,6 +363,11 @@
case 'C':
ftpcat = 2;
break;
+ case 'L':
+ if (inet_pton(AF_INET, opt.arg, &fi.ourCtlAddr.sin_addr) <= 0) {
+ (void) fprintf(stderr, "Warning: could not resolve address specified by -L flag: %s\n", opt.arg);
+ }
+ break;
default:
Usage();
}
diff -ubBr ncftp-3.2.0/sh_util/ncftpput.c ncftp-3.2.0-bind/sh_util/ncftpput.c
--- ncftp-3.2.0/sh_util/ncftpput.c 2006-08-12 08:36:29.000000000 +0900
+++ ncftp-3.2.0-bind/sh_util/ncftpput.c 2007-09-09 17:17:51.000000000 +0900
@@ -230,7 +230,7 @@
perfilecmd[0] = '\0';

GetoptReset(&opt);
- while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:U:t:mar:RvVf:o:AT:S:EFcCyZzDbB:W:X:Y:")) > 0) {
+ while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:U:t:mar:RvVf:o:AT:S:EFcCyZzDbB:W:X:Y:L:")) > 0) {
if (c == 'b') {
batchmode++;
}
@@ -250,7 +250,7 @@
}

GetoptReset(&opt);
- while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:U:t:mar:RvVf:o:AT:S:EFcCyZzDbB:W:X:Y:")) > 0) switch(c) {
+ while ((c = Getopt(&opt, argc, argv, "P:u:j:p:h:e:d:U:t:mar:RvVf:o:AT:S:EFcCyZzDbB:W:X:Y:L:")) > 0) switch(c) {
case 'P':
fi.port = atoi(opt.arg);
break;
@@ -380,6 +380,11 @@
STRNCAT(postcmd, opt.arg);
STRNCAT(postcmd, "\n");
break;
+ case 'L':
+ if (inet_pton(AF_INET, opt.arg, &fi.ourCtlAddr.sin_addr) <= 0) {
+ (void) fprintf(stderr, "Warning: could not resolve address specified by -L flag: %s\n", opt.arg);
+ }
+ break;
default:
iperf のソース見難いなぁ。ttcp.c とかの方が良い?

2007年9月2日日曜日

いろいろ。

バタバタと忙しくて元気が無いので雑多なメモ。

NVIDIA-Linux-x86_64-1.0-9639-pkg2

2.6.23-rc2 以降位でコンパイル通すためのパッチ。
--- nv/nv-linux.h       2007-04-17 13:03:18.000000000 +0900
+++ nv-new/nv-linux.h 2007-09-02 18:06:02.000000000 +0900
@@ -528,7 +528,7 @@
#define NV_KMEM_CACHE_CREATE(kmem_cache, name, type) \
{ \
kmem_cache = kmem_cache_create(name, sizeof(type), \
- 0, 0, NULL, NULL); \
+ 0, 0, NULL); \
}

#define NV_KMEM_CACHE_DESTROY(kmem_cache) \
Only in nv-new: nv-linux.h.orig
Only in nv-new: nv-vm.o
diff -ubBr nv/nv.c nv-new/nv.c
--- nv/nv.c 2007-04-17 13:03:18.000000000 +0900
+++ nv-new/nv.c 2007-09-02 18:06:02.000000000 +0900
@@ -107,7 +107,8 @@

static int nv_mmconfig_failure_detected = 0;

-static kmem_cache_t *nv_pte_t_cache = NULL;
+static struct kmem_cache *nv_pte_t_cache;

// allow an easy way to convert all debug printfs related to events
// back and forth between 'info' and 'errors'
@@ -1423,8 +1424,7 @@
if (apm_nv_dev[i] != NULL) pm_unregister(apm_nv_dev[i]);
#endif

- if (unregister_chrdev(nv_major, "nvidia") < 0)
- nv_printf(NV_DBG_ERRORS, "NVRM: unregister nv chrdev failed\n");
+ unregister_chrdev(nv_major, "nvidia");

for (i = 0; i < num_nv_devices; i++)
{
@@ -1450,8 +1450,7 @@

nv_printf(NV_DBG_INFO, "NVRM: nvidia_exit_module\n");

- if (unregister_chrdev(nv_major, "nvidia") < 0)
- nv_printf(NV_DBG_ERRORS, "NVRM: unregister nv chrdev failed\n");
+ unregister_chrdev(nv_major, "nvidia");

for (i = 0; i < num_nv_devices; i++)
{

[PATCH 0/25 -v2] paravirt_ops for x86_64, second round

おなじ x86_64 で lguest (paravirt_ops) のパッチが LKML に 2度目? 投げられているが 2.6.24 になるのかしら?

遅延 ACK

TCP の sliding window の話をしていたところ「遅延 ACKとゆーものがあって、受信側はウィンドウサイズ (cwnd?) 分のパケットを受け取った後でないと ACK を返さない」とおかしな事を言い切っていたが、そんな実装もあるのか? Web をウロウロしていたら linux では quickackというものがあり...評判が悪いらしい。けど、どういった状態で delayed ACK を無効にするか知りたいが、そう。TCP のコードも私にとっては難解。

あとあと piggyback を使っているアプリケーションってある? 先日の lsrr を iperf に実装すべくコード読み始めたけど読み辛い....