Man page - packet(7)
Packages contains this manual
- shm_overview(7)
- nss(5)
- proc_mtrr(5)
- intro(7)
- tcp(7)
- iso_8859-9(7)
- armscii-8(7)
- proc_kpagecount(5)
- initrd(4)
- mouse(4)
- proc_stat(5)
- x25(7)
- proc_interrupts(5)
- fifo(7)
- repertoiremap(5)
- icmp(7)
- futex(7)
- feature_test_macros(7)
- lp(4)
- bpf-helpers(7)
- epoll(7)
- proc_sys_dev(5)
- namespaces(7)
- proc_sysrq-trigger(5)
- proc_bus(5)
- cp1251(7)
- proc_pid_maps(5)
- proc_sys_vm(5)
- proc_pid_projid_map(5)
- st(4)
- proc_pid(5)
- issue(5)
- pid_namespaces(7)
- unicode(7)
- inode(7)
- hosts.equiv(5)
- iso-8859-13(7)
- proc_fb(5)
- proc_modules(5)
- proc_pid_autogroup(5)
- keyrings(7)
- sysvipc(7)
- proc_kmsg(5)
- cgroups(7)
- latin6(7)
- proc_pid_uid_map(5)
- unix(7)
- proc_pid_io(5)
- pts(4)
- packet(7)
- ld-linux.so(8)
- tzselect(8)
- iconv(1)
- proc_pid_syscall(5)
- proc_pid_net(5)
- proc_pid_pagemap(5)
- tty(4)
- proc_profile(5)
- standards(7)
- proc_pid_mounts(5)
- filesystems(5)
- iso-8859-15(7)
- locale(5)
- iso_8859_3(7)
- xattr(7)
- iso-8859-2(7)
- proc_uptime(5)
- persistent-keyring(7)
- credentials(7)
- proc_pid_timers(5)
- utmpx(5)
- vcsa(4)
- proc_pid_exe(5)
- proc_net(5)
- proc_timer_stats(5)
- ip(7)
- proc_pid_fd(5)
- ptmx(4)
- user_namespaces(7)
- resolv.conf(5)
- url(7)
- iso_8859_5(7)
- iso_8859-8(7)
- urn(7)
- process-keyring(7)
- proc_pid_auxv(5)
- proc_ksyms(5)
- proc_ide(5)
- veth(4)
- ldd(1)
- proc_swaps(5)
- landlock(7)
- proc_vmstat(5)
- system_data_types(7)
- cp1252(7)
- lirc(4)
- proc_kpageflags(5)
- random(7)
- precedence(7)
- cpuset(7)
- proc_pid_ns(5)
- acct(5)
- latin4(7)
- proc_pid_cgroup(5)
- proc_cpuinfo(5)
- iso_8859-2(7)
- proc_keys(5)
- charsets(7)
- pldd(1)
- proc_pid_stat(5)
- rtnetlink(7)
- netlink(7)
- ram(4)
- mem(4)
- iso-8859-6(7)
- proc_key-users(5)
- iso_8859_15(7)
- fanotify(7)
- proc_sys_net(5)
- sysfs(5)
- math_error(7)
- latin1(7)
- proc_pid_root(5)
- nptl(7)
- proc_cgroups(5)
- proc_iomem(5)
- proc_pid_statm(5)
- sem_overview(7)
- hier(7)
- full(4)
- proc_pid_status(5)
- proc_pid_cwd(5)
- proc_pid_cpuset(5)
- proc_scsi(5)
- uri(7)
- proc_diskstats(5)
- iso_8859_6(7)
- latin2(7)
- latin5(7)
- man-pages(7)
- ld.so(8)
- uts_namespaces(7)
- proc_pid_mountstats(5)
- intro(3)
- proc_pid_seccomp(5)
- proc_pid_wchan(5)
- attributes(7)
- symlink(7)
- mount_namespaces(7)
- charmap(5)
- tis-620(7)
- iso-8859-10(7)
- getent(1)
- proc_buddyinfo(5)
- ttytype(5)
- rtc(4)
- proc_malloc(5)
- suffixes(7)
- sln(8)
- signal(7)
- proc_sys_abi(5)
- signal-safety(7)
- time_namespaces(7)
- proc_pid_comm(5)
- raw(7)
- gai.conf(5)
- proc_crypto(5)
- locale(1)
- iso-8859-3(7)
- motd(5)
- proc_meminfo(5)
- iso-8859-8(7)
- protocols(5)
- proc_pid_map_files(5)
- pthreads(7)
- null(4)
- proc(5)
- zdump(8)
- socket(7)
- proc_sys_kernel(5)
- ddp(7)
- memusagestat(1)
- hd(4)
- iso-8859-14(7)
- shells(5)
- pipe(7)
- glob(7)
- proc_self(5)
- network_namespaces(7)
- utmp(5)
- proc_kcore(5)
- nsswitch.conf(5)
- sd(4)
- iso-8859-5(7)
- iso_8859_16(7)
- man(7)
- iso_8859-6(7)
- dir_colors(5)
- mq_overview(7)
- vsock(7)
- ascii(7)
- thread-keyring(7)
- fs(5)
- proc_pid_attr(5)
- proc_sys_debug(5)
- proc_sys(5)
- proc_pid_cmdline(5)
- pty(7)
- services(5)
- cgroup_namespaces(7)
- securetty(5)
- netdevice(7)
- iso_8859_13(7)
- host.conf(5)
- proc_pid_setgroups(5)
- proc_slabinfo(5)
- sock_diag(7)
- iso_8859-14(7)
- iso-8859-11(7)
- iso_8859_11(7)
- operator(7)
- regex(7)
- wavelan(4)
- proc_sys_fs(5)
- nologin(5)
- proc_pci(5)
- koi8-r(7)
- erofs(5)
- intro(2)
- utf8(7)
- proc_kallsyms(5)
- proc_sysvipc(5)
- queue(7)
- proc_sys_sunrpc(5)
- intro(5)
- latin8(7)
- mtrace(1)
- ipc_namespaces(7)
- dsp56k(4)
- iso_8859_4(7)
- proc_pid_smaps(5)
- proc_cmdline(5)
- rpc(5)
- proc_tty(5)
- proc_version(5)
- smartpqi(4)
- proc_pid_timerslack_ns(5)
- aio(7)
- session-keyring(7)
- resolver(5)
- slabinfo(5)
- wtmp(5)
- iso_8859_9(7)
- proc_locks(5)
- mailaddr(7)
- proc_pid_oom_score(5)
- kmem(4)
- iconvconfig(8)
- iso_8859-7(7)
- glibc(7)
- hostname(7)
- proc_thread-self(5)
- ipv6(7)
- iso_8859_7(7)
- proc_kpagecgroup(5)
- core(5)
- time(7)
- units(7)
- proc_dma(5)
- loop(4)
- address_families(7)
- zero(4)
- intro(4)
- procfs(5)
- iso_8859-4(7)
- vdso(7)
- tmpfs(5)
- iso-8859-16(7)
- iso_8859_10(7)
- user-session-keyring(7)
- libc(7)
- proc_fs(5)
- koi8-u(7)
- latin3(7)
- proc_tid_children(5)
- proc_pid_limits(5)
- proc_pid_coredump_filter(5)
- iso_8859-15(7)
- arp(7)
- urandom(4)
- iso_8859-10(7)
- hpsa(4)
- proc_pid_environ(5)
- boot(7)
- ftm(7)
- ld-linux(8)
- proc_driver(5)
- loop-control(4)
- iso_8859-16(7)
- proc_filesystems(5)
- tzfile(5)
- sprof(1)
- proc_pid_task(5)
- proc_pid_oom_score_adj(5)
- proc_mounts(5)
- iso-8859-4(7)
- iso_8859-1(7)
- utf-8(7)
- iso_8859-13(7)
- intro(6)
- proc_timer_list(5)
- rtld-audit(7)
- iso_8859-3(7)
- group(5)
- sched(7)
- proc_pid_clear_refs(5)
- hosts(5)
- iso_8859-11(7)
- numa(7)
- iso_8859_2(7)
- locale(7)
- iso-8859-1(7)
- fuse(4)
- proc_tid(5)
- proc_execdomains(5)
- proc_pid_mountinfo(5)
- intro(8)
- iso_8859_8(7)
- proc_loadavg(5)
- proc_pid_oom_adj(5)
- re_format(7)
- iso_8859_14(7)
- zic(8)
- bootparam(7)
- inotify(7)
- posixoptions(7)
- proc_partitions(5)
- iso-8859-9(7)
- proc_pid_mem(5)
- networks(5)
- proc_sys_user(5)
- udp(7)
- proc_zoneinfo(5)
- latin10(7)
- proc_pid_fdinfo(5)
- proc_pid_stack(5)
- memusage(1)
- spufs(7)
- pkeys(7)
- path_resolution(7)
- proc_ioports(5)
- intro(1)
- ldconfig(8)
- msr(4)
- svipc(7)
- port(4)
- proc_pid_personality(5)
- cciss(4)
- latin9(7)
- capabilities(7)
- localedef(1)
- vcs(4)
- iso_8859-5(7)
- elf(5)
- proc_sys_proc(5)
- console_codes(4)
- random(4)
- iso-8859-7(7)
- termcap(5)
- cpuid(4)
- environ(7)
- string_copying(7)
- proc_pid_gid_map(5)
- queue(3)
- termio(7)
- user-keyring(7)
- complex(7)
- latin7(7)
- proc_config.gz(5)
- udplite(7)
- kernel_lockdown(7)
- proc_devices(5)
- proc_apm(5)
- iso_8859_1(7)
- proc_pid_numa_maps(5)
apt-get install manpages
Available languages:
en fr ja ru zh_TW zh_CNManual
PACKET
名 前書 式
説 明
ア ド レ ス の タ イ プ
ソ ケ ッ ト オ プ シ ョ ン
ioctl
エ ラ ー 処 理
エ ラ ー
バ ー ジ ョ ン
注 意
移 植 性
バ グ
関 連 項 目
こ の 文 書 に つ い て
名 前
packet - デ バ イ ス レ ベ ル の パ ケ ッ ト イ ン タ ー フ ェ ー ス
書 式
#include
<sys/socket.h>
#include <linux/if_packet.h>
#include <net/ethernet.h> /* L2 プ ロ
ト コ ル */
packet_socket = socket(AF_PACKET, int socket_type , int protocol );
説 明
packet ソ ケ ッ ト は 、 デ バ イ ス ド ラ イ バ (OSI レ イ ヤ 2) レ ベ ル で 生 の パ ケ ッ ト (raw packet) を 送 受 信 す る た め に 用 い ら れ る 。 packet ソ ケ ッ ト を 使 う と 、 ユ ー ザ ー 空 間 で 物 理 層 の 上 に プ ロ ト コ ル モ ジ ュ ー ル を 実 装 す る こ と が で き る 。
socket_type に は SOCK_RAW と SOCK_DGRAM の い ず れ か を 指 定 す る 。 SOCK_RAW は リ ン ク レ ベ ル ヘ ッ ダ ー を 含 む raw パ ケ ッ ト を 、 SOCK_DGRAM は リ ン ク レ ベ ル ヘ ッ ダ ー が 削 除 さ れ た 加 工 済 み パ ケ ッ ト を 示 す 。 リ ン ク レ ベ ル ヘ ッ ダ ー 情 報 は sockaddr_ll 構 造 体 で 共 通 の フ ォ ー マ ッ ト で 入 手 で き る 。 protocol に は IEEE 802.3 プ ロ ト コ ル 番 号 を ネ ッ ト ワ ー ク バ イ ト オ ー ダ ー で 指 定 す る 。 指 定 で き る プ ロ ト コ ル の リ ス ト は 、 イ ン ク ル ー ド フ ァ イ ル <linux/if_ether.h> を 参 照 。 プ ロ ト コ ル を htons(ETH_P_ALL) に す る と 、 全 て の プ ロ ト コ ル が 受 信 さ れ る 。 外 部 か ら 来 た パ ケ ッ ト の う ち 指 定 し た プ ロ ト コ ル の も の は 、 カ ー ネ ル に 実 装 さ れ て い る プ ロ ト コ ル に 渡 さ れ る 前 の 段 階 で 、 packet ソ ケ ッ ト に 渡 さ れ る 。
In order to create a packet socket, a process must have the CAP_NET_RAW capability in the user namespace that governs its network namespace.
SOCK_RAW パ ケ ッ ト で は 、 パ ケ ッ ト を デ バ イ ス ド ラ イ バ と 受 け 渡 し す る 際 、 パ ケ ッ ト デ ー タ に 変 更 が 行 わ れ る こ と は な い 。 パ ケ ッ ト の 受 信 時 に は 、 ア ド レ ス の 解 析 だ け は 行 わ れ 、 標 準 的 な sockaddr_ll ア ド レ ス 構 造 体 に 渡 さ れ る 。 パ ケ ッ ト の 送 信 時 に は 、 ユ ー ザ ー が 指 定 す る バ ッ フ ァ ー に 物 理 層 の ヘ ッ ダ ー が 含 ま れ て い る 必 要 が あ る 。 パ ケ ッ ト は そ の ま ま 修 正 を 受 け ず に 、 行 き 先 ア ド レ ス か ら 決 定 さ れ る イ ン タ ー フ ェ ー ス の ネ ッ ト ワ ー ク ド ラ イ バ に キ ュ ー イ ン グ さ れ る 。 デ バ イ ス ド ラ イ バ に よ っ て は 、 他 の ヘ ッ ダ ー を 常 に 追 加 す る も の も あ る 。 SOCK_RAW は Linux 2.0 の obosolete な AF_INET/SOCK_PACKET と 似 て い る が 、 互 換 性 が あ る わ け で は な い 。
SOCK_DGRAM は や や 高 位 の レ ベ ル で 動 作 す る 。 物 理 ヘ ッ ダ ー は 、 パ ケ ッ ト が ユ ー ザ ー に 渡 さ れ る 前 に 削 除 さ れ る 。 SOCK_DGRAM の packet ソ ケ ッ ト を 通 し て 送 ら れ る パ ケ ッ ト は 、 sockaddr_ll の 行 き 先 ア ド レ ス の 情 報 に 基 づ き 、 適 切 な 物 理 層 の ヘ ッ ダ ー が 付 加 さ れ て か ら 、 キ ュ ー に 送 ら れ る 。
By default, all packets of the specified protocol type are passed to a packet socket. To get packets only from a specific interface use bind (2) specifying an address in a struct sockaddr_ll to bind the packet socket to an interface. Fields used for binding are sll_family (should be AF_PACKET ), sll_protocol , and sll_ifindex .
connect (2) 操 作 は packet ソ ケ ッ ト で は サ ポ ー ト さ れ て い な い 。
MSG_TRUNC フ ラ グ が recvmsg (2), recv (2), recvfrom (2) に 渡 さ れ る と 、 (バ ッ フ ァ ー サ イ ズ よ り 大 き か っ た と し て も ) 常 に 実 際 に 通 信 さ れ た パ ケ ッ ト の 長 さ が 返 さ れ る 。
ア ド レ ス の タ イ プ
sockaddr_ll 構 造 体 は デ バ イ ス に 依 存 し な い 物 理 層 の ア ド レ ス で あ る 。
struct
sockaddr_ll {
unsigned short sll_family; /* 常 に AF_PACKET */
unsigned short sll_protocol; /* 物 理 層
の プ ロ ト コ ル */
int sll_ifindex; /* イ ン タ ー
フ ェ ー ス 番 号 */
unsigned short sll_hatype; /* ARP ハ ー ド
ウ ェ ア 種 別 */
unsigned char sll_pkttype; /* パ ケ ッ
ト 種 別 */
unsigned char sll_halen; /* ア ド レ
ス の 長 さ */
unsigned char sll_addr[8]; /* 物 理 層
の ア ド レ ス */
};
こ の 構 造 体 の フ ィ ー ル ド は 以 下 の 通 り で あ る 。
|
* |
sll_protocol is the standard ethernet protocol type in network byte order as defined in the <linux/if_ether.h> include file. It defaults to the socket’s protocol. |
||
|
* |
sll_ifindex is the interface index of the interface (see netdevice (7)); 0 matches any interface (only permitted for binding). sll_hatype is an ARP type as defined in the <linux/if_arp.h> include file. |
||
|
* |
sll_pkttype contains the packet type. Valid types are PACKET_HOST for a packet addressed to the local host, PACKET_BROADCAST for a physical-layer broadcast packet, PACKET_MULTICAST for a packet sent to a physical-layer multicast address, PACKET_OTHERHOST for a packet to some other host that has been caught by a device driver in promiscuous mode, and PACKET_OUTGOING for a packet originating from the local host that is looped back to a packet socket. These types make sense only for receiving. |
||
|
* |
sll_addr and sll_halen contain the physical-layer (e.g., IEEE 802.3) address and its length. The exact interpretation depends on the device. |
パ ケ ッ ト を 送 る 場 合 は 、 sll_family , sll_addr , sll_halen , sll_ifindex , sll_protocol を 指 定 す れ ば 十 分 で あ る 。 そ の 他 の フ ィ ー ル ド は 0 に し て お く べ き で あ る 。 sll_hatype と sll_pkttype に は 受 信 し た パ ケ ッ ト の 情 報 が 設 定 さ れ る 。
ソ ケ ッ ト オ プ シ ョ ン
パ
ケ ッ ト ソ ケ ッ
ト の オ プ シ ョ
ン は 、 レ ベ ル
SOL_PACKET
を 指 定 し
て
setsockopt
(2) を 呼 び
出 す こ と で 設
定 で き る 。
PACKET_ADD_MEMBERSHIP
PACKET_DROP_MEMBERSHIP
packet ソ ケ ッ ト は 、 物 理 層 の マ ル チ キ ャ ス ト や 無 差 別 モ ー ド (promiscuous mode) を 設 定 し て 使 う こ と が で き る 。 PACKET_ADD_MEMBERSHIP は バ イ ン ド を 追 加 し 、 PACKET_DROP_MEMBERSHIP は バ イ ン ド を 削 除 す る 。 こ れ ら は い ず れ も packet_mreq 構 造 体 を 引 数 に 取 る 。
struct
packet_mreq {
int mr_ifindex; /* イ ン タ ー
フ ェ ー ス 番 号 */
unsigned short mr_type; /* 動 作 */
unsigned short mr_alen; /* ア ド レ
ス の 長 さ */
unsigned char mr_address[8]; /* 物 理 層
の ア ド レ ス */
};
mr_ifindex は 、 ス テ ー タ ス を 変 更 し た い イ ン タ ー フ ェ ー ス の イ ン タ ー フ ェ ー ス 番 号 で あ る 。 mr_type フ ィ ー ル ド は 実 行 す る 動 作 を 指 定 す る : PACKET_MR_PROMISC は 、 共 有 し て い る 媒 体 か ら の 全 て の パ ケ ッ ト を 受 信 で き る よ う に す る (し ば し ば "無 差 別 モ ー ド (promiscuous mode)" と 呼 ば れ る )。 PACKET_MR_MULTICAST は 、 そ の ソ ケ ッ ト を 、 mr_address と mr_alen で 指 定 さ れ る 物 理 層 の マ ル チ キ ャ ス ト ブ ル ー プ に バ イ ン ド す る 。 PACKET_MR_ALLMULTI は socket を up に し て 、 そ の イ ン タ ー フ ェ ー ス に 到 達 し た す べ て の マ ル チ キ ャ ス ト パ ケ ッ ト を 受 信 で き る よ う に す る 。
昔 か ら あ る ioctl だ け で な く 、 SIOCSIFFLAGS , SIOCADDMULTI , SIOCDELMULTI を 同 じ 目 的 に 用 い る こ と が で き る 。
PACKET_AUXDATA (Linux 2.6.21 以 降 )
ブ ー ル 値 の オ プ シ ョ ン を 有 効 す る と 、 パ ケ ッ ト ソ ケ ッ ト は 、 パ ケ ッ ト と 一 緒 に メ タ デ ー タ 構 造 体 を recvmsg (2) コ ン ト ロ ー ル フ ィ ー ル ド で 渡 す 。 こ の 構 造 体 は cmsg (3) を 使 っ て 読 む こ と が で き る 。 定 義 は 以 下 の 通 り で あ る 。
struct
tpacket_auxdata {
__u32 tp_status;
__u32 tp_len; /* packet length */
__u32 tp_snaplen; /* captured length */
__u16 tp_mac;
__u16 tp_net;
__u16 tp_vlan_tci;
__u16 tp_vlan_tpid; /* Since Linux 3.14; earlier, these
were unused padding bytes */
};
PACKET_FANOUT (Linux 3.1 以 降 )
ス レ ッ ド に ま た が っ て 処 理 を ス ケ ー ル さ せ る た め 、 パ ケ ッ ト ソ ケ ッ ト は フ ァ ン ア ウ ト グ ル ー プ を 構 成 す る こ と が で き る 。 こ の モ ー ド で は 、 マ ッ チ し た そ れ ぞ れ の パ ケ ッ ト は グ ル ー プ 内 の い ず れ か 一 つ の ソ ケ ッ ト に だ け キ ュ ー イ ン グ さ れ る 。 ソ ケ ッ ト を フ ァ ン ア ウ ト グ ル ー プ に 参 加 さ せ る に は 、 レ ベ ル SOL_PACKET で オ プ シ ョ ン PACKET_FANOUT を 指 定 し て setsockopt (2) を 呼 び 出 す 。 ネ ッ ト ワ ー ク 名 前 空 間 毎 に 最 大 65536 個 の 独 立 し た グ ル ー プ を 持 つ こ と が で き る 。 整 数 の オ プ シ ョ ン 値 の 先 頭 16 ビ ッ ト に ID を エ ン コ ー ド す る こ と で 、 ソ ケ ッ ト は グ ル ー プ を 選 択 す る 。 あ る グ ル ー プ へ の 最 初 の パ ケ ッ ト ソ ケ ッ ト の 参 加 が あ っ た 時 点 で 、 グ ル ー プ は 暗 黙 の う ち に 作 成 さ れ る 。 既 存 の グ ル ー プ へ の 参 加 が 成 功 す る た め に は 、 そ れ 以 降 に そ の グ ル ー プ に 参 加 し よ う と す る パ ケ ッ ト ソ ケ ッ ト は 、 プ ロ ト コ ロ 、 デ バ イ ス 設 定 、 フ ァ ン ア ウ ト モ ー ド 、 フ ラ グ が 同 じ で あ る 必 要 が あ る (下 記 参 照 )。 パ ケ ッ ト ソ ケ ッ ト が フ ァ ン ア ウ ト グ ル ー プ か ら 抜 け る の は 、 そ の ソ ケ ッ ト を ク ロ ー ズ し た 場 合 だ け で あ る 。 フ ァ ン ア ウ ト グ ル ー プ は 最 後 の ソ ケ ッ ト が ク ロ ー ズ し た 場 合 に 削 除 さ れ る 。
Fanout supports multiple algorithms to spread traffic between sockets, as follows:
|
* |
The default mode, PACKET_FANOUT_HASH , sends packets from the same flow to the same socket to maintain per-flow ordering. For each packet, it chooses a socket by taking the packet flow hash modulo the number of sockets in the group, where a flow hash is a hash over network-layer address and optional transport-layer port fields. |
||
|
* |
The load-balance mode PACKET_FANOUT_LB implements a round-robin algorithm. |
||
|
* |
PACKET_FANOUT_CPU selects the socket based on the CPU that the packet arrived on. |
||
|
* |
PACKET_FANOUT_ROLLOVER processes all data on a single socket, moving to the next when one becomes backlogged. |
||
|
* |
PACKET_FANOUT_RND selects the socket using a pseudo-random number generator. |
||
|
* |
PACKET_FANOUT_QM (available since Linux 3.14) selects the socket using the recorded queue_mapping of the received skb. |
フ ァ ン ア ウ ト モ ー ド で は 追 加 の オ プ シ ョ ン が あ る 。 IP フ ラ グ メ ン テ ー シ ョ ン が 起 こ る と 、 同 じ フ ロ ー の パ ケ ッ ト の フ ロ ー ハ ッ シ ュ が 異 な る ハ ッ シ ュ を 持 つ こ と に な る 。 フ ラ グ PACKET_FANOUT_FLAG_DEFRAG を セ ッ ト す る と 、 パ ケ ッ ト は フ ァ ン ア ウ ト を 行 う 前 に フ ラ グ メ ン ト 再 構 築 が 行 わ れ る よ う に な り 、 フ ラ グ メ ン ト が あ っ た 場 合 で も 順 序 が 維 持 さ れ る 。 フ ァ ン ア ウ ト モ ー ド と オ プ シ ョ ン は 、 整 数 の オ プ シ ョ ン 値 の 下 位 16 ビ ッ ト で 指 定 さ れ る 。 フ ラ グ PACKET_FANOUT_FLAG_ROLLOVER を 指 定 す る と 、 バ ッ ク ア ッ プ 戦 略 と し て ロ ー ル オ ー バ ー 方 式 が 有 効 に な る 。 元 の フ ァ ン ア ウ ト ア ル ゴ リ ズ ム が backlog ソ ケ ッ ト を 選 択 し て い れ ば 、 パ ケ ッ ト は 次 の 利 用 可 能 な ソ ケ ッ ト に ロ ー ル オ ー バ ー さ れ る 。
PACKET_LOSS ( PACKET_TX_RING で 使 用 )
送 信 リ ン グ で 不 正 な 形 式 の パ ケ ッ ト に 遭 遇 し た 場 合 、 デ フ ォ ル ト で は そ の リ ン グ の tp_status を TP_STATUS_WRONG_FORMAT に 戻 し 、 そ の 送 信 を 直 ち に 中 止 す る 。 不 正 な 形 式 の パ ケ ッ ト に よ り 、 そ の パ ケ ッ ト 自 身 と そ の 以 降 に キ ュ ー に 入 れ ら れ た パ ケ ッ ト の 送 信 が ブ ロ ッ ク さ れ る 。 形 式 エ ラ ー を 修 正 し 、 関 連 す る tp_status を TP_STATUS_SEND_REQUEST に 設 定 し 直 し 、 send (2) を 使 っ て 送 信 処 理 を 再 開 し な け れ ば な ら な い 。 し か し な が ら 、 PACKET_LOSS が セ ッ ト さ れ て い る 場 合 、 不 正 な 形 式 の パ ケ ッ ト は す べ て ス キ ッ プ さ れ 、 そ の 送 信 リ ン グ の tp_status は TP_STATUS_AVAILABLE に 設 定 し 直 さ れ 、 送 信 処 理 は 継 続 さ れ る 。
PACKET_RESERVE ( PACKET_RX_RING で 使 用 )
デ フ ォ ル ト で は 、 パ ケ ッ ト 受 信 リ ン グ は メ タ デ ー タ 構 造 体 と ア ラ イ メ ン ト 用 の パ デ ィ ン グ の 直 後 に パ ケ ッ ト を 書 き 込 む 。 こ の 整 数 オ プ シ ョ ン を 設 定 す る と 、 パ ケ ッ ト の 前 に 追 加 で 領 域 が 予 約 さ れ る 。
PACKET_RX_RING
非 同 期 で の パ ケ ッ ト 受 信 用 の メ モ リ ー マ ッ プ さ れ た リ ン グ バ ッ フ ァ ー を 作 成 す る 。 パ ケ ッ ト ソ ケ ッ ト は ア プ リ ケ ー シ ョ ン の ア ド レ ス 空 間 に 連 続 す る 領 域 を 確 保 し 、 そ こ に パ ケ ッ ト ス ロ ッ ト の 配 列 を 構 成 し 、 (最 大 tp_snaplen 個 の ) パ ケ ッ ト を 順 に ス ロ ッ ト に コ ピ ー す る 。 各 パ ケ ッ ト の 前 に は tpacket_auxdata に 似 た メ タ デ ー タ 構 造 体 が 置 か れ る 。 プ ロ ト コ ル フ ィ ー ル ド に は 、 デ ー タ の 、 メ タ デ ー タ ヘ ッ ダ ー の 先 頭 か ら の オ フ セ ッ ト が 入 る 。 tp_net に は ネ ッ ト ワ ー ク 層 へ の オ フ セ ッ ト が 格 納 さ れ る 。 パ ケ ッ ト ソ ケ ッ ト が SOCK_DGRAM 型 の 場 合 、 tp_mac も 同 じ で あ る 。 SOCK_RAW 型 の 場 合 、 tp_net に は リ ン ク 層 の フ レ ー ム へ の オ フ セ ッ ト が 入 る 。 パ ケ ッ ト ソ ケ ッ ト と ア プ リ ケ ー シ ョ ン は tp_status フ ィ ー ル ド を 通 し て リ ン グ の 先 頭 (head) と 末 尾 (tail) の 情 報 を 受 け 渡 す 。 パ ケ ッ ト ソ ケ ッ ト は tp_status が TP_STATUS_KERNEL の す べ て の ス ロ ッ ト を 所 有 し て お り 、 ス ロ ッ ト に デ ー タ が 入 る と 、 パ ケ ッ ト ソ ケ ッ ト は そ の ス ロ ッ ト の ス テ ー タ ス を ア プ リ ケ ー シ ョ ン に 所 有 権 を 渡 す 状 態 に 変 更 す る 。 通 常 の 動 作 で は 、 新 し い tp_status で 少 な く と も TP_STATUS_USER ビ ッ ト が セ ッ ト さ れ て い れ ば 、 受 信 さ れ た パ ケ ッ ト が 格 納 さ れ た こ と を 示 し て い る 。 ア プ リ ケ ー シ ョ ン が パ ケ ッ ト の 処 理 を 終 え る と 、 ア プ リ ケ ー シ ョ ン は そ の ス ロ ッ ト の tp_status を TP_STATUS_KERNEL に 設 定 し 、 そ の ス ロ ッ ト の 所 有 権 を ソ ケ ッ ト に 返 す 。
パ ケ ッ ト ソ ケ ッ ト は 、 複 数 バ ー ジ ョ ン の パ ケ ッ ト リ ン グ を 実 装 し て い る 。 実 装 の 詳 細 は Linux カ ー ネ ル ソ ー ス ツ リ ー の Documentation/networking/packet_mmap.txt で 説 明 さ れ て い る 。
PACKET_STATISTICS
パ ケ ッ ト ソ ケ ッ ト の 統 計 情 報 を 次 の 構 造 体 形 式 で 取 得 す る 。
struct
tpacket_stats {
unsigned int tp_packets; /* 総 パ ケ
ッ ト 数 */
unsigned int tp_drops; /* ド ロ ッ
プ パ ケ ッ ト 数 */
};
統 計 情 報 を 取 得 す る と 、 内 部 カ ウ ン タ ー は リ セ ッ ト さ れ る 。 TPACKET_V3 の リ ン グ を 使 う 場 合 に は 、 統 計 情 報 構 造 体 は 違 う も の に な る 。
PACKET_TIMESTAMP ( PACKET_RX_RING で 使 用 ; Linux 2.6.36 以 降 )
パ ケ ッ ト 受 信 リ ン グ で は 常 に タ イ ム ス タ ン プ が メ タ デ ー タ ヘ ッ ダ ー に 格 納 さ れ る 。 デ フ ォ ル ト で は 、 タ イ ム ス タ ン プ は パ ケ ッ ト が リ ン グ に コ ピ ー さ れ た 時 点 で 生 成 さ れ る ソ フ ト ウ ェ ア に よ る タ イ ム ス タ ン プ で あ る 。 こ の 整 数 オ プ シ ョ ン に よ り タ イ ム ス タ ン プ の 種 類 を 選 択 で き る 。 デ フ ォ ル ト 以 外 で は 、 Linux カ ー ネ ル ソ ー ス ツ リ ー の Documentation/networking/timestamping.rst に 説 明 が あ る 2 種 類 の ハ ー ド ウ ェ ア フ ォ ー マ ッ ト が サ ポ ー ト さ れ て い る 。
PACKET_TX_RING (Linux 2.6.31 以 降 )
パ ケ ッ ト 送 信 用 の メ モ リ ー マ ッ プ さ れ た リ ン グ バ ッ フ ァ ー を 作 成 す る 。 こ の オ プ シ ョ ン は PACKET_RX_RING と 同 様 で 、 同 じ 引 数 を 取 る 。 ア プ リ ケ ー シ ョ ン は tp_status が TP_STATUS_AVAILABLE の ス ロ ッ ト に パ ケ ッ ト を 書 き 込 み 、 tp_status を TP_STATUS_SEND_REQUEST に 変 更 す る こ と で そ の パ ケ ッ ト の 送 信 を 予 約 す る 。 パ ケ ッ ト の 送 信 準 備 が で き た ら 、 ア プ リ ケ ー シ ョ ン は 続 け て send (2) 系 の シ ス テ ム コ ー ル を 呼 び 出 す 。 シ ス テ ム コ ー ル の 引 数 buf と len は 無 視 さ れ る 。 sendto (2) や sendmsg (2) を 使 っ て ア ド レ ス が 渡 さ れ た 場 合 、 ソ ケ ッ ト の デ フ ォ ル ト 値 で は な く そ の ア ド レ ス が 使 用 さ れ る 。 送 信 に 成 功 す る と 、 ソ ケ ッ ト は そ の ス ロ ッ ト の tp_status を TP_STATUS_AVAILABLE に 戻 す 。 エ ラ ー の 場 合 、 PACKET_LOSS が セ ッ ト さ れ て い な け れ ば 、 直 ち に 送 信 を 中 断 し エ ラ ー を 上 げ る 。
PACKET_VERSION ( PACKET_RX_RING で 使 用 ; Linux 2.6.27 以 降 )
デ フ ォ ル ト で は 、 PACKET_RX_RING は TPACKET_V1 の パ ケ ッ ト 受 信 リ ン グ を 作 成 す る 。 別 の バ ー ジ ョ ン の リ ン グ を 作 成 す る に は 、 そ の リ ン グ を 作 成 す る 前 に 希 望 す る バ ー ジ ョ ン が 使 わ れ る よ う に こ の 整 数 オ プ シ ョ ン を 設 定 す る こ と 。
PACKET_QDISC_BYPASS (Linux 3.14 以 降 )
デ フ ォ ル ト で は 、 パ ケ ッ ト は カ ー ネ ル の qdisc (ト ラ フ ィ ッ ク 制 御 ) レ イ ヤ ー 経 由 で 渡 さ れ る 。 こ れ は 大 半 の ユ ー ス ケ ー ス に 合 っ て い る 。 ネ ッ ト ワ ー ク に 対 し て 可 能 な 限 り パ ケ ッ ト を 送 信 す る (例 え ば pkggen と 同 様 の 方 法 で 負 荷 対 象 の デ バ イ ス を 試 験 す る ) の に パ ケ ッ ト ソ ケ ッ ト を 使 う ト ラ フ ィ ッ ク 生 成 ア プ ラ イ ア ン ス で は 、 こ の 整 数 オ プ シ ョ ン を 1 に 設 定 す る こ と で qdisc レ イ ヤ ー を 飛 ば す こ と が で き る 。 qdisc レ イ ヤ ー で の パ ケ ッ ト バ ッ フ ァ ー が 行 わ れ な く な る と い う 副 作 用 が あ る 。 こ れ に よ り 、 ネ ッ ト ワ ー ク デ バ イ ス の 送 信 キ ュ ー の 使 用 量 が 高 い 場 合 に パ ケ ッ ト 廃 棄 が 起 き や す く な る 。
ioctl
SIOCGSTAMP を 用 い る と 、 最 後 に 受 信 し た パ ケ ッ ト の タ イ ム ス タ ン プ を 得 る こ と が で き る 。 引 数 は struct timeval 型 の 変 数 で あ る 。
さ ら に 、 netdevice (7) お よ び socket (7) で 定 義 さ れ て い る 標 準 の ioctl は い ず れ も packet ソ ケ ッ ト に 指 定 可 能 で あ る 。
エ ラ ー 処 理
packet ソ ケ ッ ト は 、 パ ケ ッ ト を デ バ イ ス ド ラ イ バ に 渡 す と き に 起 き た エ ラ ー し か 処 理 し な い 。 遅 延 エ ラ ー (pending error) に 関 す る 概 念 は 持 っ て い な い 。
エ ラ ー
EADDRNOTAVAIL
不 明 な マ ル チ キ ャ ス ト グ ル ー プ ア ド レ ス が 渡 さ れ た 。
|
EFAULT |
ユ ー ザ ー が 渡 し た メ モ リ ー ア ド レ ス が 不 正 。 |
|||
|
EINVAL |
引 数 が 不 正 。 |
EMSGSIZE
パ ケ ッ ト が イ ン タ ー フ ェ ー ス の MTU よ り 大 き い 。
ENETDOWN
イ ン タ ー フ ェ ー ス が up で な い 。
ENOBUFS
パ ケ ッ ト に 割 り 当 て る メ モ リ ー が 足 り な い 。
|
ENODEV |
デ バ イ ス 名 が 不 明 。 あ る い は イ ン タ ー フ ェ ー ス ア ド レ ス で 指 定 さ れ た イ ン タ ー フ ェ ー ス イ ン デ ッ ク ス が 不 明 。 |
|||
|
ENOENT |
パ ケ ッ ト を 一 つ も 受 信 し て い な い 。 |
ENOTCONN
イ ン タ ー フ ェ ー ス ア ド レ ス が 渡 さ れ な か っ た 。
|
ENXIO |
イ ン タ ー フ ェ ー ス ア ド レ ス に 不 正 な イ ン タ ー フ ェ ー ス イ ン デ ッ ク ス が 含 ま れ て い る 。 |
||
|
EPERM |
こ の 操 作 を 行 う の に 必 要 な 権 限 を ユ ー ザ ー が 持 っ て い な い 。 |
上 記 以 外 の エ ラ ー が 、 低 レ ベ ル の ド ラ イ バ で 生 成 さ れ る こ と が あ る 。
バ ー ジ ョ ン
AF_PACKET は Linux 2.2 の 新 機 能 で あ る 。 こ れ よ り 古 い バ ー ジ ョ ン の Linux で は SOCK_PACKET の み を サ ポ ー ト し て い た 。
注 意
移 植 性 の 必 要 な プ ロ グ ラ ム で は 、 pcap (3) 経 由 で AF_PACKET を 用 い る こ と を お 薦 め す る 。 た だ し 、 こ の 方 法 で は AF_PACKET の 機 能 す べ て を 利 用 す る こ と は で き な い 。
SOCK_DGRAM packet ソ ケ ッ ト は 、 IEEE 802.3 フ レ ー ム の IEEE 802.2 LLC ヘ ッ ダ ー の 生 成 や 解 析 を 行 お う と し な い 。 ETH_P_802_3 が 送 信 プ ロ ト コ ル に 指 定 さ れ る と 、 カ ー ネ ル は 802.3 フ レ ー ム を 生 成 し て length フ ィ ー ル ド に 書 き 込 む 。 完 全 に 準 拠 し た パ ケ ッ ト を 得 る た め に は ユ ー ザ ー が LLC ヘ ッ ダ ー を 与 え る 必 要 が あ る 。 到 着 し た 802.3 パ ケ ッ ト で は 、 DSAP/SSAP protocol の 各 フ ィ ー ル ド は 多 重 化 (multiplex) さ れ て い な い 。 代 わ り に こ れ ら は LLC ヘ ッ ダ ー が 前 置 さ れ た ETH_P_802_2 プ ロ ト コ ル と し て 与 え ら れ る 。 し た が っ て 、 ETH_P_802_3 に バ イ ン ド す る こ と は で き な い 。 か わ り に ETH_P_802_2 に バ イ ン ド し 、 自 分 自 身 で プ ロ ト コ ル の 多 重 化 を 行 う こ と 。 送 信 の デ フ ォ ル ト は 、 プ ロ ト コ ル フ ィ ー ル ド を 持 つ 標 準 の Ethernet DIX encapsulation で あ る 。
packet ソ ケ ッ ト は 入 出 力 の firewall chain に 影 響 を う け な い 。
移 植 性
In Linux 2.0, the only way to get a packet socket was with the call:
socket(AF_INET, SOCK_PACKET, protocol)
This is still supported, but deprecated and strongly discouraged. The main difference between the two methods is that SOCK_PACKET uses the old struct sockaddr_pkt to specify an interface, which doesn’t provide physical-layer independence.
struct
sockaddr_pkt {
unsigned short spkt_family;
unsigned char spkt_device[14];
unsigned short spkt_protocol;
};
spkt_family は デ バ イ ス の タ イ プ 、 spkt_protocol は <sys/if_ether.h> で 定 義 さ れ て い る IEEE 802.3 プ ロ ト コ ル タ イ プ 、 spkt_device は デ バ イ ス の 名 前 を ヌ ル 終 端 さ れ た 文 字 列 で 与 え た も の (例 : eth0) で あ る 。
こ の 構 造 体 は obsolete で あ り 、 新 し く コ ー ド を 書 く 時 に は 用 い る べ き で な い 。
バ グ
IEEE 802.2/803.3 の LLC の 扱 い 方 は 、 バ グ と 考 え て も 良 い だ ろ う 。
ソ ケ ッ ト フ ィ ル タ ー に つ い て 記 載 さ れ て い な い 。
MSG_TRUNC recvmsg (2) 拡 張 は 非 常 に ま ず い 対 処 で あ り 、 制 御 メ ッ セ ー ジ で 置 き 換 え る べ き で あ る 。 今 の と こ ろ SOCK_DGRAM 経 由 で パ ケ ッ ト に つ い て い た 宛 先 ア ド レ ス を 得 る 方 法 が な い 。
関 連 項 目
socket (2), pcap (3), capabilities (7), ip (7), raw (7), socket (7)
標 準 IP Ethernet encapsulation に 関 し て は RFC 894 を 、 IEEE 802.3 IP encapsulation に 関 し て は RFC 1700 を 参 照 。
物 理 層 の プ ロ ト コ ル に 関 す る 記 述 は <linux/if_ether.h> イ ン ク ル ー ド フ ァ イ ル に あ る 。
Linux カ ー ネ ル の ソ ー ス ツ リ ー 。 Documentation/networking/filter.rst に は Berkeley Packet Filters を パ ケ ッ ト ソ ケ ッ ト に ど の よ う に 適 用 す る か の 説 明 が あ る 。 /tools/testing/selftests/net/psock_tpacket.c に は 、 PACKET_RX_RING と PACKET_TX_RING の 利 用 可 能 な す べ て の バ ー ジ ョ ン の サ ン プ ル ソ ー ス コ ー ド が あ る 。
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。