Linux Kernel TIPC

簡介

TIPC (透明程序間通訊) 是一種專門為叢集內通訊設計的協議。它可以配置為透過 UDP 或直接透過乙太網傳輸訊息。訊息傳遞保證順序、無損和流量控制。延遲時間比任何其他已知協議都短,而最大吞吐量與 TCP 相當。

TIPC 特性

  • 叢集範圍的 IPC 服務

    您是否曾經希望擁有 Unix 域套接字的便利性,即使在叢集節點之間傳輸資料時也是如此?您可以自己確定要繫結的和使用的地址?您不必執行 DNS 查詢並擔心 IP 地址?您不必啟動計時器來監視對等套接字的持續存在?但又沒有該套接字型別的缺點,例如 lingering inodes 的風險?

    歡迎使用透明程序間通訊服務,簡稱 TIPC,它為您提供所有這些以及更多。

  • 服務定址

    TIPC 中的一個基本概念是服務定址,它使程式設計師可以選擇自己的地址,將其繫結到伺服器套接字,並讓客戶端程式僅使用該地址傳送訊息。

  • 服務跟蹤

    想要等待伺服器可用的客戶端使用服務跟蹤機制來訂閱具有關聯服務地址的套接字的繫結和取消繫結/關閉事件。

    服務跟蹤機制也可用於叢集拓撲跟蹤,即訂閱叢集節點的可用/不可用性。

    同樣,服務跟蹤機制可用於叢集連線跟蹤,即訂閱叢集節點之間各個鏈路的啟動/關閉事件。

  • 傳輸模式

    使用服務地址,客戶端可以將資料報訊息傳送到伺服器套接字。

    使用相同的地址型別,它可以建立與接受伺服器套接字的連線。

    它還可以使用服務地址建立並加入通訊組,這是 TIPC 對無代理訊息匯流排的體現。

    在資料報模式和通訊組模式下都可以使用效能和可擴充套件性都非常好的多播。

  • 節點間鏈路

    叢集中任意兩個節點之間的通訊由一個或兩個節點間鏈路維護,這些鏈路既保證資料流量完整性,又監視對等節點的可用性。

  • 叢集可擴充套件性

    透過在節點間鏈路應用重疊環監控演算法,可以將 TIPC 叢集擴充套件到 1000 個節點,並保持 1-2 秒的鄰居故障發現時間。對於較小的叢集,這個時間可以大大縮短。

  • 鄰居發現

    當乙太網廣播或 UDP 多播可用時,叢集中的鄰居節點發現透過乙太網廣播或 UDP 多播完成。如果不可用,可以使用配置的對等 IP 地址。

  • 配置

    在單節點模式下執行 TIPC 時,不需要任何配置。在叢集模式下執行時,TIPC 必須至少被賦予一個節點地址(Linux 4.17 之前)並告知要連線的介面。“tipc”配置工具可以新增和維護更多配置引數。

  • 效能

    TIPC 訊息傳輸延遲時間優於任何其他已知協議。節點間連線的最大位元組吞吐量仍然略低於 TCP,而同一主機上的節點內和容器間吞吐量則優於 TCP。

  • 語言支援

    TIPC 使用者 API 支援 C、Python、Perl、Ruby、D 和 Go。

更多資訊

實現

TIPC 在 net/tipc/ 目錄中作為核心模組實現。

TIPC 基本型別

struct tipc_subscription

TIPC 網路拓撲訂閱物件

定義:

struct tipc_subscription {
    struct tipc_subscr s;
    struct tipc_event evt;
    struct kref kref;
    struct net *net;
    struct timer_list timer;
    struct list_head service_list;
    struct list_head sub_list;
    int conid;
    bool inactive;
    spinlock_t lock;
};

成員

s

使用者訂閱的主機位元組序副本

evt

由訂閱生成的事件的模板

kref

此訂閱的引用計數

net

與訂閱關聯的網路名稱空間

timer

控制訂閱持續時間的計時器(可選)

service_list

名稱序列的訂閱列表中的相鄰訂閱

sub_list

訂閱者的訂閱列表中的相鄰訂閱

conid

拓撲伺服器的連線識別符號

inactive

如果此訂閱未啟用,則為 true

lock

序列化啟動/關閉和計時器事件

struct tipc_media_addr

TIPC 承載使用的目標地址

定義:

struct tipc_media_addr {
    u8 value[TIPC_MEDIA_INFO_SIZE];
    u8 media_id;
    u8 broadcast;
};

成員

value

地址資訊(格式由媒體定義)

media_id

TIPC 媒體型別識別符號

broadcast

如果地址是廣播地址,則為非零

struct tipc_media

媒體特定資訊暴露給通用承載層

定義:

struct tipc_media {
    int (*send_msg)(struct net *net, struct sk_buff *buf,struct tipc_bearer *b, struct tipc_media_addr *dest);
    int (*enable_media)(struct net *net, struct tipc_bearer *b, struct nlattr *attr[]);
    void (*disable_media)(struct tipc_bearer *b);
    int (*addr2str)(struct tipc_media_addr *addr,char *strbuf, int bufsz);
    int (*addr2msg)(char *msg, struct tipc_media_addr *addr);
    int (*msg2addr)(struct tipc_bearer *b,struct tipc_media_addr *addr, char *msg);
    int (*raw2addr)(struct tipc_bearer *b,struct tipc_media_addr *addr, const char *raw);
    u32 priority;
    u32 tolerance;
    u32 min_win;
    u32 max_win;
    u32 mtu;
    u32 type_id;
    u32 hwaddr_len;
    char name[TIPC_MAX_MEDIA_NAME];
};

成員

send_msg

處理緩衝區傳輸的例程

enable_media

啟用媒體的例程

disable_media

停用媒體的例程

addr2str

將媒體地址格式轉換為字串

addr2msg

從媒體地址格式轉換為發現訊息地址格式

msg2addr

從發現訊息地址格式轉換為媒體地址格式

raw2addr

從原始地址格式轉換為媒體地址格式

priority

預設鏈路(和承載)優先順序

tolerance

宣告鏈路故障之前的預設時間(以毫秒為單位)

min_win

宣告鏈路擁塞之前的最小視窗(以資料包為單位)

max_win

宣告鏈路擁塞之前的最大視窗(以資料包為單位)

mtu

承載可以支援的媒體型別的最大資料包大小,不依賴於底層裝置 MTU

type_id

TIPC 媒體識別符號

hwaddr_len

TIPC 媒體地址長度

name

媒體名稱

struct tipc_bearer

通用 TIPC 承載結構

定義:

struct tipc_bearer {
    void __rcu *media_ptr;
    u32 mtu;
    struct tipc_media_addr addr;
    char name[TIPC_MAX_BEARER_NAME];
    struct tipc_media *media;
    struct tipc_media_addr bcast_addr;
    struct packet_type pt;
    struct rcu_head rcu;
    u32 priority;
    u32 min_win;
    u32 max_win;
    u32 tolerance;
    u32 domain;
    u32 identity;
    struct tipc_discoverer *disc;
    char net_plane;
    u16 encap_hlen;
    unsigned long up;
    refcount_t refcnt;
};

成員

media_ptr

指向有關承載的其他媒體特定資訊的指標

mtu

承載可以支援的最大資料包大小

addr

與承載關聯的媒體特定地址

name

承載名稱(格式 = 媒體:介面)

media

指向與承載關聯的媒體結構的指標

bcast_addr

廣播中使用的媒體地址

pt

承載的資料包型別

rcu

tipc_bearer 的 rcu 結構

priority

承載的預設鏈路優先順序

min_win

宣告鏈路擁塞之前的最小視窗(以資料包為單位)

max_win

宣告鏈路擁塞之前的最大視窗(以資料包為單位)

tolerance

承載的預設鏈路容差

domain

可以建立鏈路的網路域

identity

此承載在 TIPC 承載陣列中的陣列索引

disc

指向鏈路設定請求的指標

net_plane

當前與承載關聯的網路平面(“A”到“H”)

encap_hlen

封裝標頭長度

up

承載啟動標誌(位 0)

refcnt

tipc_bearer 引用計數器

注意

媒體特定程式碼負責在啟用承載時初始化下面指示的欄位;TIPC 的通用承載程式碼負責初始化所有其他欄位。

struct publication

有關已釋出的服務地址或範圍的資訊

定義:

struct publication {
    struct tipc_service_range sr;
    struct tipc_socket_addr sk;
    u16 scope;
    u32 key;
    u32 id;
    struct list_head binding_node;
    struct list_head binding_sock;
    struct list_head local_publ;
    struct list_head all_publ;
    struct list_head list;
    struct rcu_head rcu;
};

成員

sr

此釋出表示的服務範圍

sk

繫結到此釋出的套接字的地址

scope

釋出範圍,TIPC_NODE_SCOPE 或 TIPC_CLUSTER_SCOPE

key

釋出金鑰,在叢集中唯一

id

釋出 ID

binding_node

來自繫結此釋出節點的同一節點的所有釋出 - 遠端釋出:在 node->publ_list 中;由節點/名稱分配器使用,以便在節點丟失時撤回釋出 - 本地/節點範圍釋出:在 name_table->node_scope 列表中 - 本地/叢集範圍釋出:在 name_table->cluster_scope 列表中

binding_sock

來自繫結此釋出節點的同一套接字的所有釋出 由套接字使用,以便在套接字未繫結/釋放時撤回釋出

local_publ

從此節點進行的相同釋出列表 用於 closest_first 和多播接收查詢演算法

all_publ

與此釋出相同的節點和範圍的所有釋出 用於迴圈查詢演算法

list

以時間順序形成釋出列表

rcu

用於延遲釋放的 RCU 回撥頭

struct name_table

包含所有現有埠名稱釋出的表

定義:

struct name_table {
    struct rcu_head rcu;
    struct hlist_head services[TIPC_NAMETBL_SIZE];
    struct list_head node_scope;
    struct list_head cluster_scope;
    rwlock_t cluster_scope_lock;
    u32 local_publ_count;
    u32 rc_dests;
    u32 snd_nxt;
};

成員

rcu

用於延遲釋放的 RCU 回撥頭

services

名稱序列雜湊列表

node_scope

所有具有節點範圍的本地釋出 - 由 name_distr 在重新初始化名稱表期間使用

cluster_scope

所有具有叢集範圍的本地釋出 - 由 name_distr 使用,以便將批次更新發送到新節點 - 由 name_distr 在重新初始化名稱表期間使用

cluster_scope_lock

用於訪問 cluster_scope 的鎖

local_publ_count

由此節點發布的釋出數

rc_dests

目標節點計數器

snd_nxt

要使用的下一個序列號

struct distr_item

釋出資訊分發到其他節點

定義:

struct distr_item {
    __be32 type;
    __be32 lower;
    __be32 upper;
    __be32 port;
    __be32 key;
};

成員

type

名稱序列型別

lower

名稱序列下限

upper

名稱序列上限

port

釋出埠引用

key

publication key

描述

===> 所有欄位都以網路位元組序儲存。 <===

前 3 個欄位標識正在釋出的(名稱或)名稱序列。引用欄位唯一標識釋出名稱序列的埠。金鑰欄位唯一標識釋出,以防埠具有同一名稱序列的多個釋出。

注意

沒有欄位標識釋出節點,因為對於釋出訊息中包含的所有項,釋出節點都是相同的。

struct tipc_bc_base

用於保持廣播發送狀態的基本結構

定義:

struct tipc_bc_base {
    struct tipc_link *link;
    struct sk_buff_head inputq;
    int dests[MAX_BEARERS];
    int primary_bearer;
    bool bcast_support;
    bool force_bcast;
    bool rcast_support;
    bool force_rcast;
    int rc_ratio;
    int bc_threshold;
};

成員

link

廣播發送鏈路結構

inputq

資料輸入佇列;將僅攜帶 SOCK_WAKEUP 訊息

dests

陣列,用於保持每個承載的可達目標數

primary_bearer

具有到所有廣播目標的鏈路的承載(如果有)

bcast_support

指示主承載(如果有)是否支援廣播

force_bcast

強制多播流量使用廣播

rcast_support

指示所有對等節點是否支援複製播

force_rcast

強制多播流量使用複製播

rc_ratio

目標計數,表示傳送方法更改的叢集大小的百分比

bc_threshold

從 rc_ratio 計算得出;如果 dests > threshold 則使用廣播

TIPC 承載介面

struct tipc_media *tipc_media_find(const char *name)

按名稱查詢指定的媒體物件

引數

const char *name

要查詢的名稱

struct tipc_media *media_find_id(u8 type)

按型別識別符號查詢指定的媒體物件

引數

u8 type

要查詢的型別識別符號

int tipc_media_addr_printf(char *buf, int len, struct tipc_media_addr *a)

在列印緩衝區中記錄媒體地址

引數

char *buf

輸出緩衝區

int len

剩餘的輸出緩衝區大小

struct tipc_media_addr *a

輸入媒體地址

int bearer_name_validate(const char *name, struct tipc_bearer_names *name_parts)

驗證 & (可選) 解構承載名稱

引數

const char *name

指向承載名稱字串的指標

struct tipc_bearer_names *name_parts

指向承載名稱元件區域的指標(如果不需要,則為 NULL)

返回

如果承載名稱有效,則為 1,否則為 0。

struct tipc_bearer *tipc_bearer_find(struct net *net, const char *name)

查詢具有匹配承載名稱的承載物件

引數

struct net *net

適用的網路名稱空間

const char *name

要查詢的承載名稱

int tipc_enable_bearer(struct net *net, const char *name, u32 disc_domain, u32 prio, struct nlattr *attr[], struct netlink_ext_ack *extack)

啟用具有給定名稱的承載

引數

struct net *net

適用的網路名稱空間

const char *name

要啟用的承載名稱

u32 disc_domain

承載域

u32 prio

承載優先順序

struct nlattr *attr[]

nlattr 陣列

struct netlink_ext_ack *extack

netlink 擴充套件確認

int tipc_reset_bearer(struct net *net, struct tipc_bearer *b)

重置透過此承載建立的所有鏈路

引數

struct net *net

適用的網路名稱空間

struct tipc_bearer *b

目標承載

void bearer_disable(struct net *net, struct tipc_bearer *b)

停用此承載

引數

struct net *net

適用的網路名稱空間

struct tipc_bearer *b

要停用的承載

注意

此例程假定呼叫方持有 RTNL 鎖。

int tipc_l2_send_msg(struct net *net, struct sk_buff *skb, struct tipc_bearer *b, struct tipc_media_addr *dest)

透過 L2 介面傳送 TIPC 資料包

引數

struct net *net

關聯的網路名稱空間

struct sk_buff *skb

要傳送的資料包

struct tipc_bearer *b

資料包要透過其傳送的承載

struct tipc_media_addr *dest

對等目標地址

int tipc_l2_rcv_msg(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)

處理來自介面的傳入 TIPC 訊息

引數

struct sk_buff *skb

收到的訊息

struct net_device *dev

接收資料包的網路裝置

struct packet_type *pt

用於註冊此處理程式的 packet_type 結構

struct net_device *orig_dev

如果裝置是繫結裝置,則為原始接收網路裝置

描述

僅接受顯式傳送到此節點的資料包或廣播資料包;忽略使用介面多播發送的資料包,以及傳送到其他節點的流量(如果介面以混雜模式執行,則可能發生這種情況)。

int tipc_l2_device_event(struct notifier_block *nb, unsigned long evt, void *ptr)

處理來自網路裝置的裝置事件

引數

struct notifier_block *nb

通知的上下文

unsigned long evt

事件的型別

void *ptr

事件發生的網路裝置

描述

此函式由乙太網驅動程式在鏈路更改事件的情況下呼叫。

struct udp_media_addr

IP/UDP 定址資訊

定義:

struct udp_media_addr {
    __be16 proto;
    __be16 port;
    union {
        struct in_addr ipv4;
        struct in6_addr ipv6;
    };
};

成員

proto

正在使用的乙太網協議

port

正在使用的埠

{unnamed_union}

anonymous

ipv4

鄰居的 IPv4 地址

ipv6

鄰居的 IPv6 地址

描述

這是鄰居發現訊息中使用的承載級別原始地址,所有欄位都應採用網路位元組序

struct udp_bearer

ip/udp 承載資料結構

定義:

struct udp_bearer {
    struct tipc_bearer __rcu *bearer;
    struct socket *ubsock;
    u32 ifindex;
    struct work_struct work;
    struct udp_replicast rcast;
};

成員

bearer

關聯的通用 tipc 承載

ubsock

承載關聯的套接字

ifindex

本地地址範圍

work

用於在承載上計劃延遲工作

rcast

關聯的 udp_replicast 容器

int tipc_parse_udp_addr(struct nlattr *nla, struct udp_media_addr *addr, u32 *scope_id)

從 netlink 資料構建 udp 媒體地址

引數

struct nlattr *nla

包含 sockaddr 儲存對齊地址的 netlink 屬性

struct udp_media_addr *addr

要使用地址、埠和協議型別填充的 tipc 媒體地址

u32 *scope_id

IPv6 範圍 ID 指標,非 NULL 表示需要

int tipc_udp_enable(struct net *net, struct tipc_bearer *b, struct nlattr *attrs[])

用於建立新的 UDP 承載例項的回撥函式

引數

struct net *net

網路名稱空間

struct tipc_bearer *b

指向通用 tipc_bearer 的指標

struct nlattr *attrs[]

Netlink 承載配置

描述

驗證承載引數並初始化 UDP 承載,應持有 rtnl_lock

TIPC 加密介面

struct tipc_tfm

用於形成 TFM 列表的 TIPC TFM 結構

定義:

struct tipc_tfm {
    struct crypto_aead *tfm;
    struct list_head list;
};

成員

tfm

密碼控制代碼/金鑰

list

TFM 的連結串列

struct tipc_aead

TIPC AEAD 金鑰結構

定義:

struct tipc_aead {
#define TIPC_AEAD_HINT_LEN (5);
    struct tipc_tfm * __percpu *tfm_entry;
    struct tipc_crypto *crypto;
    struct tipc_aead *cloned;
    atomic_t users;
    u32 salt;
    u8 authsize;
    u8 mode;
    char hint[2 * TIPC_AEAD_HINT_LEN + 1];
    struct rcu_head rcu;
    struct tipc_aead_key *key;
    u16 gen;
    atomic64_t seqno ;
    refcount_t refcnt ;
};

成員

tfm_entry

指向 TFM 列表中一個條目的 per-cpu 指標

加密

TIPC 加密擁有此金鑰

克隆

克隆情況下引用源金鑰

使用者

金鑰使用者數(TX/RX)

salt

金鑰的 SALT 值

authsize

身份驗證標記大小(最大 = 16)

模式

應用於金鑰的加密模式

提示

使用者金鑰的提示

rcu

struct rcu_head

key

AEAD 金鑰

gen

金鑰的生成

seqno

金鑰序列號(叢集範圍)

refcnt

金鑰引用計數器

struct tipc_crypto_stats

TIPC 加密統計資訊

定義:

struct tipc_crypto_stats {
    unsigned int stat[MAX_STATS];
};

成員

stat

加密統計資訊陣列

struct tipc_crypto

TIPC TX/RX 加密結構

定義:

struct tipc_crypto {
    struct net *net;
    struct tipc_node *node;
    struct tipc_aead __rcu *aead[KEY_MAX + 1];
    atomic_t peer_rx_active;
    u16 key_gen;
    struct tipc_key key;
    u8 skey_mode;
    struct tipc_aead_key *skey;
    struct workqueue_struct *wq;
    struct delayed_work work;
#define KEY_DISTR_SCHED         1;
#define KEY_DISTR_COMPL         2;
    atomic_t key_distr;
    u32 rekeying_intv;
    struct tipc_crypto_stats __percpu *stats;
    char name[48];
    atomic64_t sndnxt ;
    unsigned long timer1;
    unsigned long timer2;
    union {
        struct {
            u8 working:1;
            u8 key_master:1;
            u8 legacy_user:1;
            u8 nokey: 1;
        };
        u8 flags;
    };
    spinlock_t lock;
};

成員

net

struct net

節點

TIPC 節點(RX)

aead

指向用於加密/解密的 AEAD 金鑰的指標陣列

peer_rx_active

複製的對等 RX 活動金鑰索引

key_gen

TX/RX 金鑰生成

key

金鑰狀態

skey_mode

會話金鑰的模式

skey

接收到的會話金鑰

wq

TX 加密的通用工作佇列

work

TX/RX 的延遲工作排程

key_distr

金鑰分發狀態

rekeying_intv

重新金鑰間隔(分鐘)

stats

加密統計資訊

name

加密名稱

sndnxt

每個對等方的 sndnxt (TX)

timer1

通用計時器 1 (jiffies)

timer2

通用計時器 2 (jiffies)

{unnamed_union}

anonymous

{unnamed_struct}

anonymous

working

加密是否正在工作

key_master

標誌指示主金鑰是否存在

legacy_user

標誌指示對等方是否在沒有主金鑰的情況下加入(用於 bwd comp.)

nokey

無金鑰指示

flags

組合標誌欄位

lock

tipc_key 鎖

int tipc_aead_key_validate(struct tipc_aead_key *ukey, struct genl_info *info)

驗證 AEAD 使用者金鑰

引數

struct tipc_aead_key *ukey

指向使用者金鑰資料的指標

struct genl_info *info

Netlink 資訊指標

int tipc_aead_key_generate(struct tipc_aead_key *skey)

生成新的會話金鑰

引數

struct tipc_aead_key *skey

具有新內容的輸入/輸出金鑰

返回

成功時為 0,否則 < 0

void tipc_aead_free(struct rcu_head *rp)

釋放 AEAD 金鑰,包括列表中的所有 TFM

引數

struct rcu_head *rp

rcu 頭指標

struct crypto_aead *tipc_aead_tfm_next(struct tipc_aead *aead)

將 TFM 條目移動到列表中的下一個並返回

引數

struct tipc_aead *aead

AEAD 金鑰指標

int tipc_aead_init(struct tipc_aead **aead, struct tipc_aead_key *ukey, u8 mode)

啟動 TIPC AEAD

引數

struct tipc_aead **aead

返回的新 TIPC AEAD 金鑰控制代碼指標

struct tipc_aead_key *ukey

指向使用者金鑰資料的指標

u8 mode

金鑰模式

描述

如果有效,則使用特定使用者金鑰資料分配新的密碼轉換 (TFM)(或列表)。可以透過 sysfs “net/tipc/max_tfms” 首先設定已分配 TFM 的數量。此外,還會初始化所有其他 AEAD 資料。

返回

如果啟動成功,則為 0,否則:< 0

int tipc_aead_clone(struct tipc_aead **dst, struct tipc_aead *src)

克隆 TIPC AEAD 金鑰

引數

struct tipc_aead **dst

用於克隆的目標金鑰

struct tipc_aead *src

從中克隆的源金鑰

描述

將源 AEAD 金鑰資料的“副本”複製到目標,TFMs 列表對於金鑰是通用的。源的引用儲存在“cloned”指標中,以供稍後釋放。

注意

這必須僅在叢集金鑰模式下完成!

返回

成功時為 0,否則 < 0

void *tipc_aead_mem_alloc(struct crypto_aead *tfm, unsigned int crypto_ctx_size, u8 **iv, struct aead_request **req, struct scatterlist **sg, int nsg)

為 AEAD 請求操作分配記憶體

引數

struct crypto_aead *tfm

要向請求註冊的密碼控制代碼

unsigned int crypto_ctx_size

回撥的加密上下文大小

u8 **iv

返回的指向 IV 資料的指標

struct aead_request **req

返回的指向 AEAD 請求資料的指標

struct scatterlist **sg

返回的指向 SG 列表的指標

int nsg

要分配的 SG 列表數

描述

分配記憶體以儲存加密上下文資料、AEAD 請求、IV 和 SG 列表,記憶體佈局如下:crypto_ctx || iv || aead_req || sg[]

返回

成功時指向記憶體區域的指標,否則為 NULL

int tipc_aead_encrypt(struct tipc_aead *aead, struct sk_buff *skb, struct tipc_bearer *b, struct tipc_media_addr *dst, struct tipc_node *__dnode)

加密訊息

引數

struct tipc_aead *aead

用於訊息加密的 TIPC AEAD 金鑰

struct sk_buff *skb

輸入/輸出 skb

struct tipc_bearer *b

TIPC 承載,訊息加密後將在此處傳遞

struct tipc_media_addr *dst

目標媒體地址

struct tipc_node *__dnode

如果“已知”的 TIPC 目標節點

返回

  • 0:如果加密已完成

  • -EINPROGRESS/-EBUSY:如果將執行回撥

  • < 0:加密失敗

int tipc_aead_decrypt(struct net *net, struct tipc_aead *aead, struct sk_buff *skb, struct tipc_bearer *b)

解密加密訊息

引數

struct net *net

struct net

struct tipc_aead *aead

用於訊息解密的 TIPC AEAD

struct sk_buff *skb

輸入/輸出 skb

struct tipc_bearer *b

TIPC 承載,訊息已在此處接收

返回

  • 0:如果解密已完成

  • -EINPROGRESS/-EBUSY:如果將執行回撥

  • < 0:解密失敗

bool tipc_ehdr_validate(struct sk_buff *skb)

驗證加密訊息

引數

struct sk_buff *skb

訊息緩衝區

返回

如果這是有效的加密訊息,則為“true”,否則為“false”

int tipc_ehdr_build(struct net *net, struct tipc_aead *aead, u8 tx_key, struct sk_buff *skb, struct tipc_crypto *__rx)

構建 TIPC 加密訊息頭

引數

struct net *net

struct net

struct tipc_aead *aead

將用於訊息加密的 TX AEAD 金鑰

u8 tx_key

用於訊息加密的金鑰 ID

struct sk_buff *skb

輸入/輸出訊息 skb

struct tipc_crypto *__rx

如果目標“已知”,則為 RX 加密控制代碼

返回

如果構建成功,則為頭大小,否則 < 0

int tipc_crypto_key_init(struct tipc_crypto *c, struct tipc_aead_key *ukey, u8 mode, bool master_key)

啟動新的使用者/AEAD 金鑰

引數

struct tipc_crypto *c

將新金鑰附加到的 TIPC 加密

struct tipc_aead_key *ukey

使用者金鑰

u8 mode

金鑰模式(CLUSTER_KEY 或 PER_NODE_KEY)

bool master_key

指定這是一個叢集主金鑰

描述

將分配一個新的 TIPC AEAD 金鑰,並使用指定的使用者金鑰啟動,然後附加到 TIPC 加密。

返回

成功時為新金鑰 ID,否則:< 0

int tipc_crypto_key_attach(struct tipc_crypto *c, struct tipc_aead *aead, u8 pos, bool master_key)

將新的 AEAD 金鑰附加到 TIPC 加密

引數

struct tipc_crypto *c

將新 AEAD 金鑰附加到的 TIPC 加密

struct tipc_aead *aead

新的 AEAD 金鑰指標

u8 pos

加密金鑰陣列中所需的插槽,如果任何插槽都行,則 = 0!

bool master_key

指定這是一個叢集主金鑰

返回

成功時為新金鑰 ID,否則:-EBUSY

bool tipc_crypto_key_try_align(struct tipc_crypto *rx, u8 new_pending)

如果可能,對齊 RX 金鑰

引數

struct tipc_crypto *rx

RX 加密控制代碼

u8 new_pending

如果已對齊,則為新的掛起插槽(= 來自對等方的 TX 金鑰)

描述

對等方使用了未知的金鑰插槽,這僅在對等方已離開並重新加入時或我們是新手時才會發生。這意味著,必須沒有活動金鑰,而是在未對齊的插槽上有一個掛起金鑰。如果是這樣,我們嘗試將掛起金鑰移動到新插槽。

注意

可能存在潛在的被動金鑰,它將相應地移動!

返回

如果金鑰成功對齊,則為“true”,否則為“false”

struct tipc_aead *tipc_crypto_key_pick_tx(struct tipc_crypto *tx, struct tipc_crypto *rx, struct sk_buff *skb, u8 tx_key)

選擇一個 TX 金鑰用於訊息解密

引數

struct tipc_crypto *tx

TX 加密控制代碼

struct tipc_crypto *rx

RX 加密控制代碼(可以為 NULL)

struct sk_buff *skb

稍後將解密的訊息 skb

u8 tx_key

對等方 TX 金鑰 ID

描述

此函式查詢現有的 TX 金鑰並選擇一個適合訊息解密的金鑰,該金鑰必須是一個叢集金鑰,並且以前未在同一訊息上使用過(即,遞迴)。

返回

成功時為 TX AEAD 金鑰控制代碼,否則為 NULL

void tipc_crypto_key_synch(struct tipc_crypto *rx, struct sk_buff *skb)

根據對等金鑰狀態同步自己的金鑰資料

引數

struct tipc_crypto *rx

RX 加密控制代碼

struct sk_buff *skb

TIPCv2 訊息緩衝區(包括來自對等方的 ehdr)

描述

此函式會更新與對等節點相關的資料,因為對等 RX 活動金鑰已更改,因此在此節點上 TX 金鑰的使用者數量會相應地增加和減少。

它還考慮了對等方是否沒有金鑰,那麼我們需要使自己的主金鑰(如果有)接管,即開始寬限期並觸發金鑰分發過程。

當對等金鑰已切換時,還會重置“每個對等方”sndnxt。

int tipc_crypto_xmit(struct net *net, struct sk_buff **skb, struct tipc_bearer *b, struct tipc_media_addr *dst, struct tipc_node *__dnode)

構建並加密用於 xmit 的 TIPC 訊息

引數

struct net *net

struct net

struct sk_buff **skb

輸入/輸出訊息 skb 指標

struct tipc_bearer *b

用於稍後 xmit 的承載

struct tipc_media_addr *dst

目標媒體地址

struct tipc_node *__dnode

目標節點(如果有)

描述

首先,在訊息頂部構建加密訊息頭,然後使用掛起金鑰、主金鑰或活動金鑰(具有此首選項順序)加密原始 TIPC 訊息。如果加密成功,則會直接或透過回撥返回加密的 skb。否則,skb 將被釋放!

返回

  • 0:加密已成功(或未加密)

  • -EINPROGRESS/-EBUSY:加密正在進行中,將進行回撥

  • -ENOKEK

    :由於沒有金鑰,加密失敗

  • -EKEYREVOKED

    :由於金鑰已撤銷,加密失敗

  • -ENOMEM

    :由於沒有記憶體,加密失敗

  • < 0:由於其他原因,加密失敗

int tipc_crypto_rcv(struct net *net, struct tipc_crypto *rx, struct sk_buff **skb, struct tipc_bearer *b)

解密來自對等方的加密 TIPC 訊息

引數

struct net *net

struct net

struct tipc_crypto *rx

RX 加密控制代碼

struct sk_buff **skb

輸入/輸出訊息 skb 指標

struct tipc_bearer *b

訊息接收方的承載。

描述

如果解密成功,解密的 skb 將直接返回或作為回撥返回,加密頭和身份驗證標籤將在轉發到 tipc_rcv() 之前被刪除,透過 tipc_crypto_rcv_complete()。否則,skb 將被釋放!

注意

RX 金鑰可以重新對齊,或者在沒有合適的金鑰的情況下,可以使用 TX 叢集金鑰進行解密(- 遞迴)。

返回

  • 0:解密已成功完成

  • -EINPROGRESS/-EBUSY:解密正在進行中,將進行回撥

  • -ENOKEY

    :由於沒有金鑰而導致解密失敗

  • -EBADMSG

    :由於訊息錯誤而導致解密失敗

  • -ENOMEM

    :由於沒有記憶體而導致解密失敗

  • < 0:由於其他原因導致解密失敗

void tipc_crypto_msg_rcv(struct net *net, struct sk_buff *skb)

公共 ‘MSG_CRYPTO’ 處理點

引數

struct net *net

net 結構

struct sk_buff *skb

接收訊息緩衝區

int tipc_crypto_key_distr(struct tipc_crypto *tx, u8 key, struct tipc_node *dest)

分發 TX 金鑰

引數

struct tipc_crypto *tx

TX 加密

u8 key

金鑰的索引

struct tipc_node *dest

目標 tipc 節點,如果分發到所有節點,則 = NULL

返回

成功時為 0,否則 < 0

int tipc_crypto_key_xmit(struct net *net, struct tipc_aead_key *skey, u16 gen, u8 mode, u32 dnode)

傳送會話金鑰

引數

struct net *net

net 結構

struct tipc_aead_key *skey

要傳送的會話金鑰

u16 gen

金鑰的生成

u8 mode

金鑰的模式

u32 dnode

目標節點地址,如果廣播到所有節點,則 = 0

描述

會話金鑰 ‘skey’ 被打包在 TIPC v2 ‘MSG_CRYPTO/KEY_DISTR_MSG’ 中作為其資料部分,然後透過 uc/bc 鏈路進行 xmit-ed。

返回

成功時為 0,否則 < 0

bool tipc_crypto_key_rcv(struct tipc_crypto *rx, struct tipc_msg *hdr)

接收會話金鑰

引數

struct tipc_crypto *rx

RX 加密

struct tipc_msg *hdr

TIPC v2 訊息,包括資料中接收的會話金鑰

描述

此函式檢索來自對等方的訊息中的會話金鑰,然後安排 RX 工作,將金鑰附加到相應的 RX 加密。

返回

如果金鑰已安排用於附加,則為“true”,否則為“false”。

void tipc_crypto_work_rx(struct work_struct *work)

已安排的 RX 工作處理程式

引數

struct work_struct *work

struct RX 工作

描述

該函式處理先前安排的工作,即分發 TX 金鑰或將接收的會話金鑰附加到 RX 加密。

void tipc_crypto_rekeying_sched(struct tipc_crypto *tx, bool changed, u32 new_intv)

(重新)安排重新金鑰,無需新間隔

引數

struct tipc_crypto *tx

TX 加密

bool changed

如果需要使用新間隔重新安排重新金鑰

u32 new_intv

新的重新金鑰間隔(當“changed” = true 時)

void tipc_crypto_work_tx(struct work_struct *work)

已安排的 TX 工作處理程式

引數

struct work_struct *work

struct TX 工作

描述

該函式處理先前安排的工作,即金鑰重新金鑰,透過基於當前金鑰生成新的會話金鑰,然後將其附加到 TX 加密,最後將其分發給對等方。如果需要,它還會重新安排重新金鑰。

TIPC 發現器介面

struct tipc_discoverer

有關正在進行的鏈路設定請求的資訊

定義:

struct tipc_discoverer {
    u32 bearer_id;
    struct tipc_media_addr dest;
    struct net *net;
    u32 domain;
    int num_nodes;
    spinlock_t lock;
    struct sk_buff *skb;
    struct timer_list timer;
    unsigned long timer_intv;
};

成員

bearer_id

發出請求的承載的標識

dest

請求訊息的目標地址

net

網路名稱空間例項

domain

可以建立鏈路的網路域

num_nodes

當前已發現的節點數(即具有活動鏈路)

lock

用於控制對請求的訪問的自旋鎖

skb

要(重複)傳送的請求訊息

timer

控制請求之間週期的計時器

timer_intv

請求之間的當前間隔(以毫秒為單位)

void tipc_disc_init_msg(struct net *net, struct sk_buff *skb, u32 mtyp, struct tipc_bearer *b)

初始化鏈路設定訊息

引數

struct net *net

適用的網路名稱空間

struct sk_buff *skb

包含訊息的緩衝區

u32 mtyp

訊息型別(請求或響應)

struct tipc_bearer *b

指向發出訊息的承載的指標

void disc_dupl_alert(struct tipc_bearer *b, u32 node_addr, struct tipc_media_addr *media_addr)

發出節點地址重複警報

引數

struct tipc_bearer *b

指向檢測到重複的承載的指標

u32 node_addr

重複的節點地址

struct tipc_media_addr *media_addr

重複節點通告的媒體地址

void tipc_disc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b)

處理傳入的發現訊息(請求或響應)

引數

struct net *net

適用的 net 名稱空間

struct sk_buff *skb

包含訊息的緩衝區

struct tipc_bearer *b

訊息到達的承載

int tipc_disc_create(struct net *net, struct tipc_bearer *b, struct tipc_media_addr *dest, struct sk_buff **skb)

建立物件以傳送定期鏈路設定請求

引數

struct net *net

適用的網路名稱空間

struct tipc_bearer *b

指向發出請求的承載的指標

struct tipc_media_addr *dest

請求訊息的目標地址

struct sk_buff **skb

指向建立的幀的指標

返回

如果成功,則為 0,否則為 -errno。

void tipc_disc_delete(struct tipc_discoverer *d)

銷燬傳送定期鏈路設定請求的物件

引數

struct tipc_discoverer *d

指向鏈路目標結構的指標

void tipc_disc_reset(struct net *net, struct tipc_bearer *b)

重置物件以傳送定期鏈路設定請求

引數

struct net *net

適用的網路名稱空間

struct tipc_bearer *b

指向發出請求的承載的指標

TIPC msg 介面

struct sk_buff *tipc_buf_acquire(u32 size, gfp_t gfp)

建立 TIPC 訊息緩衝區

引數

u32 size

訊息大小(包括 TIPC 標頭)

gfp_t gfp

記憶體分配標誌

返回

一個新的緩衝區,其資料指標設定為指定的大小。

注意

預留了 headroom 以允許新增資料鏈路標頭。緩衝區的末尾可能還存在未請求的 tailroom。

int tipc_msg_append(struct tipc_msg *_hdr, struct msghdr *m, int dlen, int mss, struct sk_buff_head *txq)

將資料附加到現有緩衝區佇列的尾部

引數

struct tipc_msg *_hdr

要使用的標頭

struct msghdr *m

要附加的資料

int dlen

要附加的資料的大小

int mss

緩衝區的最大允許大小

struct sk_buff_head *txq

要附加到的佇列

返回

附加的 1k 塊數或 errno 值

int tipc_msg_fragment(struct sk_buff *skb, const struct tipc_msg *hdr, int pktmax, struct sk_buff_head *frags)

為 TIPC 訊息構建一個分段 skb 列表

引數

struct sk_buff *skb

TIPC 訊息 skb

const struct tipc_msg *hdr

要放在片段頂部的內部訊息標頭

int pktmax

片段的最大大小,包括標頭

struct sk_buff_head *frags

返回的分段 skb 列表

返回

如果分段成功,則為 0,否則為: -EINVAL 或 -ENOMEM

int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m, int offset, int dsz, int pktmax, struct sk_buff_head *list)

建立包含指定標頭和資料的緩衝區鏈

引數

struct tipc_msg *mhdr

訊息標頭,將新增到資料的前面

struct msghdr *m

使用者訊息

int offset

分段訊息的緩衝區偏移量 (FIXME)

int dsz

使用者資料的總長度

int pktmax

可以使用的最大資料包大小

struct sk_buff_head *list

要返回給呼叫方的緩衝區或緩衝區鏈

描述

請注意,我們在此處進行的遞迴呼叫是安全的,因為它在邏輯上只能再下降一個級別。

返回

訊息資料大小或 errno: -ENOMEM, -EFAULT

bool tipc_msg_bundle(struct sk_buff *bskb, struct tipc_msg *msg, u32 max)

將緩衝區的內容附加到現有緩衝區的尾部

引數

struct sk_buff *bskb

要附加到的捆綁緩衝區

struct tipc_msg *msg

要附加的訊息

u32 max

捆綁緩衝區的最大允許大小

返回

如果執行了捆綁,則為“true”,否則為“false”

bool tipc_msg_try_bundle(struct sk_buff *tskb, struct sk_buff **skb, u32 mss, u32 dnode, bool *new_bundle)

嘗試將新訊息捆綁到最後一個訊息

引數

struct sk_buff *tskb

將附加新訊息的最後一個/目標訊息

struct sk_buff **skb

新的訊息 skb 指標

u32 mss

最大訊息大小(包括標頭)

u32 dnode

訊息的目標節點

bool *new_bundle

此呼叫是否建立了新的捆綁包

返回

如果新的訊息 skb 可能在此次或稍後進行捆綁,則為“true”,在這種情況下,skb 將被消耗(skb 指標 = NULL)。 否則,如果 skb 根本無法捆綁,則為“false”。

bool tipc_msg_extract(struct sk_buff *skb, struct sk_buff **iskb, int *pos)

從緩衝區中提取捆綁的內部資料包

引數

struct sk_buff *skb

要從中提取的緩衝區。

struct sk_buff **iskb

提取的內部緩衝區,要返回

int *pos

要提取的訊息的外部訊息中的位置。 返回下一個訊息的位置。 提取最後一個數據包時會消耗外部緩衝區

返回

存在提取的緩衝區時為 true,否則為 false

bool tipc_msg_reverse(u32 own_node, struct sk_buff **skb, int err)

交換源地址和目標地址,並新增錯誤程式碼

引數

u32 own_node

反向訊息的原始節點 ID

struct sk_buff **skb

包含要反向的訊息的緩衝區;將被消耗

int err

要在訊息中設定的錯誤程式碼(如果有)。成功時,使用新緩衝區替換消耗的緩衝區

返回

如果成功,則為 true,否則為 false

bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err)

嘗試查詢命名訊息的新目標

引數

struct net *net

指向關聯的網路名稱空間的指標

struct sk_buff *skb

包含訊息的緩衝區。

int *err

如果查詢失敗,則供呼叫方使用的錯誤程式碼。不消耗緩衝區

返回

如果找到目標,則為 true,否則為 false

TIPC 名稱介面

struct service_range

服務範圍的所有繫結的容器

定義:

struct service_range {
    u32 lower;
    u32 upper;
    struct rb_node tree_node;
    u32 max;
    struct list_head local_publ;
    struct list_head all_publ;
};

成員

lower

服務範圍下限

upper

服務範圍上限

tree_node

服務範圍 RB 樹的成員

max

此節點子樹中最大的“upper”

local_publ

從此節點進行的相同釋出的列表。由 closest_first 查詢和多播查詢演算法使用

all_publ

與此釋出相同的節點和範圍的所有釋出 用於迴圈查詢演算法

struct tipc_service

服務型別的所有已釋出例項的容器

定義:

struct tipc_service {
    u32 type;
    u32 publ_cnt;
    struct rb_root ranges;
    struct hlist_node service_list;
    struct list_head subscriptions;
    spinlock_t lock;
    struct rcu_head rcu;
};

成員

type

服務的 32 位“型別”值

publ_cnt

此服務中釋出的遞增計數器

ranges

包含此服務的所有服務範圍的 rb 樹

service_list

指向雜湊鏈中相鄰名稱範圍的連結

subscriptions

此服務型別的訂閱列表

lock

控制對相關服務範圍/釋出的訪問的自旋鎖

rcu

用於延遲釋放的 RCU 回撥頭

service_range_foreach_match

service_range_foreach_match (sr, sc, start, end)

對於每個範圍匹配,迭代 tipc 服務 rbtree

引數

sr

作為迴圈游標的服務範圍指標

sc

指向 tipc 服務的指標,該服務擁有服務範圍 rbtree

start

搜尋範圍的開始 (end >= start) 用於匹配

end

搜尋範圍的結束 (end >= start) 用於匹配

struct service_range *service_range_match_first(struct rb_node *n, u32 start, u32 end)

查詢與範圍匹配的第一個服務範圍

引數

struct rb_node *n

用於搜尋的服務範圍 rbtree 的根節點

u32 start

搜尋範圍的開始 (end >= start) 用於匹配

u32 end

搜尋範圍的結束 (end >= start) 用於匹配

返回

rbtree 中與特定範圍重疊的最左側服務範圍節點(如果有)。 否則,返回 NULL。

struct service_range *service_range_match_next(struct rb_node *n, u32 start, u32 end)

查詢與範圍匹配的下一個服務範圍

引數

struct rb_node *n

rbtree 中從中開始搜尋的服務範圍節點

u32 start

搜尋範圍的開始 (end >= start) 用於匹配

u32 end

搜尋範圍的結束 (end >= start) 用於匹配

返回

rbtree 中與特定範圍重疊的給定節點的下一個服務範圍節點(如果有)。 否則,返回 NULL。

struct publication *tipc_publ_create(struct tipc_uaddr *ua, struct tipc_socket_addr *sk, u32 key)

建立釋出結構

引數

struct tipc_uaddr *ua

使用者繫結到的服務範圍

struct tipc_socket_addr *sk

繫結套接字的地址

u32 key

publication key

struct tipc_service *tipc_service_create(struct net *net, struct tipc_uaddr *ua)

為指定的“型別”建立服務結構

引數

struct net *net

網路名稱空間

struct tipc_uaddr *ua

表示要繫結的服務的地址

描述

分配單個範圍結構,並將其設定為全 0。

struct publication *tipc_service_remove_publ(struct service_range *r, struct tipc_socket_addr *sk, u32 key)

從服務中刪除釋出

引數

struct service_range *r

從中刪除釋出的 service_range

struct tipc_socket_addr *sk

釋出套接字的地址

u32 key

目標釋出金鑰

void tipc_service_subscribe(struct tipc_service *service, struct tipc_subscription *sub)

附加訂閱,並且如果存在與請求範圍重疊的任何服務範圍,則可以選擇發出規定的事件數

引數

struct tipc_service *service

要將 sub 附加到的 tipc_service

struct tipc_subscription *sub

要附加的訂閱

bool tipc_nametbl_lookup_anycast(struct net *net, struct tipc_uaddr *ua, struct tipc_socket_addr *sk)

執行服務例項到套接字轉換

引數

struct net *net

網路名稱空間

struct tipc_uaddr *ua

要查詢的服務地址

struct tipc_socket_addr *sk

我們要查詢的套接字的地址

描述

在進入時,非零“sk->node”表示我們要執行查詢的節點,該節點可能不是此節點。

退出時

  • 如果查詢被推遲到另一個節點,則保持“sk->node”不變並返回“true”。

  • 如果查詢成功,則設定表示繫結套接字的“sk->node”和“sk->ref”(== portid)並返回“true”。

  • 如果查詢失敗,則返回“false”

請注意,對於舊版使用者(配置了 Z.C.N 地址格式的節點),必須維護“最近優先”查詢演算法,即,如果 sk.node 為 0,我們必須首先在本地繫結列表中查詢

void tipc_nametbl_withdraw(struct net *net, struct tipc_uaddr *ua, struct tipc_socket_addr *sk, u32 key)

撤回服務繫結

引數

struct net *net

網路名稱空間

struct tipc_uaddr *ua

正在取消繫結的服務地址/範圍

struct tipc_socket_addr *sk

從其取消繫結的套接字的地址

u32 key

目標釋出金鑰

bool tipc_nametbl_subscribe(struct tipc_subscription *sub)

將訂閱物件新增到名稱表

引數

struct tipc_subscription *sub

要新增的訂閱

void tipc_nametbl_unsubscribe(struct tipc_subscription *sub)

從名稱表中刪除訂閱物件

引數

struct tipc_subscription *sub

要刪除的訂閱

void tipc_service_delete(struct net *net, struct tipc_service *sc)

清除服務的所有釋出並刪除它

引數

struct net *net

關聯的網路名稱空間

struct tipc_service *sc

要刪除的 tipc_service

void publ_to_item(struct distr_item *i, struct publication *p)

將釋出資訊新增到釋出訊息

引數

struct distr_item *i

訊息中專案的位置

struct publication *p

釋出資訊

struct sk_buff *named_prepare_buf(struct net *net, u32 type, u32 size, u32 dest)

分配和初始化釋出訊息

引數

struct net *net

關聯的網路名稱空間

u32 type

訊息型別

u32 size

有效負載大小

u32 dest

目標節點

描述

返回的緩衝區大小為 INT_H_SIZE + payload size

struct sk_buff *tipc_named_publish(struct net *net, struct publication *p)

告知其他節點此節點的新發布

引數

struct net *net

關聯的網路名稱空間

struct publication *p

新的釋出

struct sk_buff *tipc_named_withdraw(struct net *net, struct publication *p)

告知其他節點此節點已撤回釋出

引數

struct net *net

關聯的網路名稱空間

struct publication *p

撤回的釋出

void named_distribute(struct net *net, struct sk_buff_head *list, u32 dnode, struct list_head *pls, u16 seqno)

準備用於批次分發到另一個節點的名稱資訊

引數

struct net *net

關聯的網路名稱空間

struct sk_buff_head *list

此函式返回的訊息(緩衝區)列表

u32 dnode

要更新的節點

struct list_head *pls

要打包到緩衝區鏈中的釋出項的連結串列

u16 seqno

此訊息的序列號

void tipc_named_node_up(struct net *net, u32 dnode, u16 capabilities)

告知指定節點此節點的所有釋出

引數

struct net *net

關聯的網路名稱空間

u32 dnode

目標節點

u16 capabilities

對等節點的功能

void tipc_publ_purge(struct net *net, struct publication *p, u32 addr)

刪除與失敗節點關聯的釋出

引數

struct net *net

關聯的網路名稱空間

struct publication *p

要刪除的釋出

u32 addr

失敗節點的地址

描述

為新失敗節點發布的每個釋出呼叫。從名稱表中刪除釋出結構並刪除它。

bool tipc_update_nametbl(struct net *net, struct distr_item *i, u32 node, u32 dtype)

嘗試處理名稱表更新並通知訂閱者

引數

struct net *net

關聯的網路名稱空間

struct distr_item *i

訊息中專案的位置

u32 node

節點地址

u32 dtype

名稱分發器訊息型別

描述

必須持有 tipc_nametbl_lock。

返回

如果成功,則為釋出項;否則為 NULL。

void tipc_named_rcv(struct net *net, struct sk_buff_head *namedq, u16 *rcv_nxt, bool *open)

處理另一個節點發送的名稱表更新訊息

引數

struct net *net

關聯的網路名稱空間

struct sk_buff_head *namedq

要從中接收的佇列

u16 *rcv_nxt

在此處儲存上次收到的 seqno

bool *open

已收到上次批次訊息 (FIXME)

void tipc_named_reinit(struct net *net)

重新初始化本地釋出

引數

struct net *net

關聯的網路名稱空間

描述

每當啟用 TIPC 網路時,都會呼叫此例程。由此節點發布的所有名稱表條目都會更新,以反映該節點的新網路地址。

TIPC 節點管理介面

struct tipc_node

TIPC 節點結構

定義:

struct tipc_node {
    u32 addr;
    struct kref kref;
    rwlock_t lock;
    struct net *net;
    struct hlist_node hash;
    int active_links[2];
    struct tipc_link_entry links[MAX_BEARERS];
    struct tipc_bclink_entry bc_entry;
    int action_flags;
    struct list_head list;
    int state;
    bool preliminary;
    bool failover_sent;
    u16 sync_point;
    int link_cnt;
    u16 working_links;
    u16 capabilities;
    u32 signature;
    u32 link_id;
    u8 peer_id[16];
    char peer_id_string[NODE_ID_STR_LEN];
    struct list_head publ_list;
    struct list_head conn_sks;
    unsigned long keepalive_intv;
    struct timer_list timer;
    struct rcu_head rcu;
    unsigned long delete_at;
    struct net *peer_net;
    u32 peer_hash_mix;
#ifdef CONFIG_TIPC_CRYPTO;
    struct tipc_crypto *crypto_rx;
#endif;
};

成員

addr

節點的網路地址

kref

節點物件的引用計數器

lock

控制結構訪問的 rwlock

net

適用的網路名稱空間

雜湊

指向未排序雜湊鏈中相鄰節點的連結

active_links

活動連結的承載 ID,用作 links[] 陣列的索引

連結

包含對節點的所有連結的引用的陣列

bc_entry

廣播連結條目

action_flags

不同型別的節點操作的位掩碼

list

指向叢集節點排序列表中的相鄰節點的連結

state

與對等節點的連線狀態

preliminary

是否為初步節點

failover_sent

是否已傳送故障轉移

sync_point

同步/故障轉移完成的序列號

link_cnt

到節點的連結數

working_links

到節點的工作連結數(活動和備用)

capabilities

點陣圖,指示對等節點的功能

signature

節點例項識別符號

link_id

更改連結的本地和遠端承載 ID(如果有)

peer_id

對等方的 128 位 ID

peer_id_string

對等方的 ID 字串

publ_list

釋出列表

conn_sks

連線列表 (FIXME)

keepalive_intv

保持活動間隔(毫秒)

timer

節點的保持活動計時器

rcu

tipc_node 的 rcu struct

delete_at

指示刪除關閉節點的時間

peer_net

對等方的網路名稱空間

peer_hash_mix

此對等方的雜湊 (FIXME)

crypto_rx

RX 加密處理程式

struct tipc_crypto *tipc_node_crypto_rx(struct tipc_node *__n)

從節點檢索加密 RX 控制代碼

引數

struct tipc_node *__n

目標 tipc_node

注意

必須首先持有節點 ref 計數器!

處理連結的新增

引數

struct tipc_node *n

目標 tipc_node

int bearer_id

承載的 ID

struct sk_buff_head *xmitq

佇列,用於在節點鎖定時要傳輸的訊息必須由呼叫方持有連結變為活動(單獨或共享)或備用,具體取決於其優先順序。

處理連結的新增

引數

struct tipc_node *n

目標 tipc_node

int bearer_id

承載的 ID

struct sk_buff_head *xmitq

佇列,用於在 上傳輸訊息

描述

連結變為活動(單獨或共享)或備用,具體取決於其優先順序。

在“半故障轉移”情況下啟動故障轉移

引數

struct tipc_node *n

tipc 節點結構

struct tipc_link *l

連結對等方終結點正在進行故障轉移(- 可以為 NULL)

struct tipc_link *tnl

隧道鏈路

struct sk_buff_head *xmitq

佇列,用於稍後在 tnl 連結上傳輸訊息

描述

此函式僅在一種非常特殊的情況下呼叫,即連結故障轉移可能已在對等節點上啟動,但未在此節點上啟動。例如,當

1. Both links <1A-2A>, <1B-2B> down
2. Link endpoint 2A up, but 1A still down (e.g. due to network
disturbance, wrong session, etc.)
3. Link <1B-2B> up
4. Link endpoint 2A down (e.g. due to link tolerance timeout)
5. Node 2 starts failover onto link <1B-2B>

==> Node 1 does never start link/node failover!

處理連結丟失

引數

struct tipc_node *n

目標 tipc_node

int *bearer_id

承載的 ID

struct sk_buff_head *xmitq

佇列,用於在 上傳輸訊息

struct tipc_media_addr **maddr

承載的輸出媒體地址

int tipc_node_get_linkname(struct net *net, u32 bearer_id, u32 addr, char *linkname, size_t len)

獲取連結的名稱

引數

struct net *net

適用的網路名稱空間

u32 bearer_id

承載的 ID

u32 addr

對等節點地址

char *linkname

連結名稱輸出緩衝區

size_t len

linkname 輸出緩衝區的大小

返回

成功時為 0

int tipc_node_xmit(struct net *net, struct sk_buff_head *list, u32 dnode, int selector)

用於訊息傳送的通用鏈路級別函式

引數

struct net *net

適用的網路名稱空間

struct sk_buff_head *list

包含訊息的緩衝區鏈

u32 dnode

目標節點的地址

int selector

用於確定性連結選擇的數字 使用緩衝區鏈。

返回

如果成功,則為 0;否則:-ELINKCONG,-EHOSTUNREACH,-EMSGSIZE,-ENOBUF

void tipc_node_bc_rcv(struct net *net, struct sk_buff *skb, int bearer_id)

處理從節點外到達的 TIPC 廣播資料包

引數

struct net *net

適用的網路名稱空間

struct sk_buff *skb

TIPC 資料包

int bearer_id

訊息到達的承載的 ID

描述

在不持有任何鎖的情況下呼叫。

bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb, int bearer_id, struct sk_buff_head *xmitq)

檢查並在必要時更新節點狀態

引數

struct tipc_node *n

目標 tipc_node

struct sk_buff *skb

TIPC 資料包

int bearer_id

傳遞資料包的承載的標識

struct sk_buff_head *xmitq

佇列,用於在 上傳輸訊息

返回

如果狀態和訊息正常,則為 true;否則為 false

void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b)

處理從節點外到達的 TIPC 資料包/訊息

引數

struct net *net

適用的網路名稱空間

struct sk_buff *skb

TIPC 資料包

struct tipc_bearer *b

指向訊息到達的承載的指標

描述

在不持有任何鎖的情況下呼叫。承載指標必須指向有效的承載結構(即不能為 NULL),但承載可以不活動。

int tipc_node_dump(struct tipc_node *n, bool more, char *buf)

轉儲 TIPC 節點資料

引數

struct tipc_node *n

要轉儲的 tipc 節點

bool more

要轉儲更多內容嗎?- false:僅轉儲 tipc 節點資料 - true:同時轉儲節點連結資料

char *buf

轉儲資料的返回緩衝區格式

TIPC 套接字介面

struct tipc_sock

TIPC 套接字結構

定義:

struct tipc_sock {
    struct sock sk;
    u32 max_pkt;
    u32 maxnagle;
    u32 portid;
    struct tipc_msg phdr;
    struct list_head cong_links;
    struct list_head publications;
    u32 pub_count;
    atomic_t dupl_rcvcnt;
    u16 conn_timeout;
    bool probe_unacked;
    u16 cong_link_cnt;
    u16 snt_unacked;
    u16 snd_win;
    u16 peer_caps;
    u16 rcv_unacked;
    u16 rcv_win;
    struct sockaddr_tipc peer;
    struct rhash_head node;
    struct tipc_mc_method mc_method;
    struct rcu_head rcu;
    struct tipc_group *group;
    u32 oneway;
    u32 nagle_start;
    u16 snd_backlog;
    u16 msg_acc;
    u16 pkt_cnt;
    bool expect_ack;
    bool nodelay;
    bool group_is_open;
    bool published;
    u8 conn_addrtype;
};

成員

sk

套接字 - 透過套接字 API 與“埠”以及使用者互動

max_pkt

構建埠傳送的訊息時使用的最大資料包大小“提示”

maxnagle

可以進行 nagle 處理的最大訊息大小

portid

TIPC 套接字雜湊表中的唯一埠標識

phdr

傳送訊息時使用的預格式化訊息標頭

cong_links

擁塞連結列表

publications

埠的釋出列表

pub_count

埠在其生命週期內釋出的所有釋出總數

dupl_rcvcnt

在 backlog 和 rcv 佇列中重複計算的位元組數

conn_timeout

我們可以等待未響應的設定請求的時間

probe_unacked

探測尚未收到 ack

cong_link_cnt

擁塞連結數

snt_unacked

套接字傳送但尚未得到對等方確認的訊息數

snd_win

傳送視窗大小

peer_caps

對等方功能掩碼

rcv_unacked

使用者讀取但尚未確認回對等方的訊息的 #

rcv_win

接收視窗大小

peer

dgram/rdm 的“已連線”對等方

節點

雜湊表節點

mc_method

套接字和廣播層之間使用的 Cookie

rcu

tipc_sock 的 rcu struct

group

TIPC 通訊組

oneway

一個方向上的訊息計數 (FIXME)

nagle_start

當前 nagle 值

snd_backlog

傳送 backlog 計數

msg_acc

已接受的訊息;用於管理 backlog 和 nagle

pkt_cnt

TIPC 套接字資料包計數

expect_ack

此 TIPC 套接字是否期望收到 ack

nodelay

setsockopt() TIPC_NODELAY 設定

group_is_open

TIPC 套接字組已完全開啟 (FIXME)

published

如果埠具有一個或多個關聯名稱,則為 true

conn_addrtype

建立連線時使用的地址型別

void tsk_advance_rx_queue(struct sock *sk)

丟棄套接字接收佇列中的第一個緩衝區

引數

struct sock *sk

網路套接字

描述

呼叫方必須持有套接字鎖

void tsk_rej_rx_queue(struct sock *sk, int error)

拒絕套接字接收佇列中的所有緩衝區

引數

struct sock *sk

網路套接字

int error

響應錯誤程式碼

描述

呼叫方必須持有套接字鎖

int tipc_sk_create(struct net *net, struct socket *sock, int protocol, int kern)

建立 TIPC 套接字

引數

struct net *net

網路名稱空間(必須是預設網路)

struct socket *sock

預分配的套接字結構

int protocol

協議指示符(必須為 0)

int kern

是由核心還是使用者空間引起的?

描述

此例程建立 TIPC 套接字使用的其他資料結構,對其進行初始化,並將它們連結在一起。

返回

成功時為 0,否則為 errno

int tipc_release(struct socket *sock)

銷燬 TIPC 套接字

引數

struct socket *sock

要銷燬的套接字

描述

此例程清除仍在套接字上排隊的任何訊息。對於 DGRAM 和 RDM 套接字型別,所有排隊的訊息都被拒絕。對於 SEQPACKET 和 STREAM 套接字型別,第一個訊息被拒絕,任何其他訊息都被丟棄。(如果 STREAM 套接字上的第一個訊息是部分讀取的,則丟棄該訊息,並拒絕下一個訊息。)

注意

被拒絕的訊息不一定會返回給傳送方!根據傳送方為訊息指定的“目標可丟棄”設定返回或丟棄這些訊息。

返回

成功時為 0,否則為 errno

int __tipc_bind(struct socket *sock, struct sockaddr *skaddr, int alen)

將 TIPC 名稱與套接字關聯或取消關聯

引數

struct socket *sock

套接字結構

struct sockaddr *skaddr

描述名稱和所需操作的套接字地址

int alen

套接字地址資料結構的大小

描述

使用正範圍值指示名稱和名稱序列繫結;負範圍值取消繫結指定的名稱。指定無名稱(即套接字地址長度為 0)將從套接字取消繫結所有名稱。

返回

成功時為 0,否則為 errno

注意

此例程不需要獲取套接字鎖,因為它不

訪問任何非常量套接字資訊。

int tipc_getname(struct socket *sock, struct sockaddr *uaddr, int peer)

獲取套接字或對等套接字的埠 ID

引數

struct socket *sock

套接字結構

struct sockaddr *uaddr

返回的套接字地址的區域

int peer

0 = 自己的 ID,1 = 當前對等 ID,2 = 當前/以前的對等 ID

返回

成功時為 0,否則為 errno

注意

此例程不需要獲取套接字鎖,因為它僅

訪問不變的(或以完全可預測的方式變化的)套接字資訊。

__poll_t tipc_poll(struct file *file, struct socket *sock, poll_table *wait)

讀取 pollmask 並在 pollmask 上可能阻塞

引數

struct file *file

與套接字關聯的檔案結構

struct socket *sock

要計算輪詢位的套接字

poll_table *wait

???

返回

pollmask 值

描述

評論:似乎通常的套接字鎖定機制在此處沒有用,因為輪詢掩碼資訊在例程退出時可能會過時。TCP 和其他協議似乎依賴於更高級別的輪詢例程來處理任何可避免的競爭條件,因此 TIPC 也會這樣做……

重要提示:指示讀取或寫入操作並不意味著該操作會成功,而只是意味著應該執行該操作且不會阻塞。

int tipc_sendmcast(struct socket *sock, struct tipc_uaddr *ua, struct msghdr *msg, size_t dlen, long timeout)

傳送多播訊息

引數

struct socket *sock

套接字結構

struct tipc_uaddr *ua

目標地址 struct

struct msghdr *msg

要傳送的訊息

size_t dlen

要傳送的資料長度

long timeout

等待喚醒的超時

描述

從函式 tipc_sendmsg() 呼叫,該函式已完成所有健全性檢查

返回

成功時傳送的位元組數,或 errno

int tipc_send_group_msg(struct net *net, struct tipc_sock *tsk, struct msghdr *m, struct tipc_member *mb, u32 dnode, u32 dport, int dlen)

向群組中的成員傳送訊息

引數

struct net *net

網路名稱空間

struct tipc_sock *tsk

TIPC 套接字

struct msghdr *m

要傳送的訊息

struct tipc_member *mb

群組成員

u32 dnode

目標節點

u32 dport

目標埠

int dlen

訊息資料的總長度

int tipc_send_group_unicast(struct socket *sock, struct msghdr *m, int dlen, long timeout)

向群組中的一個成員傳送訊息

引數

struct socket *sock

套接字結構

struct msghdr *m

要傳送的訊息

int dlen

訊息資料的總長度

long timeout

等待喚醒的超時

描述

從函式 tipc_sendmsg() 呼叫,該函式已完成所有健全性檢查

返回

成功時傳送的位元組數,或 errno

int tipc_send_group_anycast(struct socket *sock, struct msghdr *m, int dlen, long timeout)

向具有給定身份的任何成員傳送訊息

引數

struct socket *sock

套接字結構

struct msghdr *m

要傳送的訊息

int dlen

訊息資料的總長度

long timeout

等待喚醒的超時

描述

從函式 tipc_sendmsg() 呼叫,該函式已完成所有健全性檢查

返回

成功時傳送的位元組數,或 errno

int tipc_send_group_bcast(struct socket *sock, struct msghdr *m, int dlen, long timeout)

向通訊組中的所有成員傳送訊息

引數

struct socket *sock

套接字結構

struct msghdr *m

要傳送的訊息

int dlen

訊息資料的總長度

long timeout

等待喚醒的超時

描述

從函式 tipc_sendmsg() 呼叫,該函式已完成所有健全性檢查

返回

成功時傳送的位元組數,或 errno

int tipc_send_group_mcast(struct socket *sock, struct msghdr *m, int dlen, long timeout)

向具有給定身份的所有成員傳送訊息

引數

struct socket *sock

套接字結構

struct msghdr *m

要傳送的訊息

int dlen

訊息資料的總長度

long timeout

等待喚醒的超時

描述

從函式 tipc_sendmsg() 呼叫,該函式已完成所有健全性檢查

返回

成功時傳送的位元組數,或 errno

void tipc_sk_mcast_rcv(struct net *net, struct sk_buff_head *arrvq, struct sk_buff_head *inputq)

將多播訊息傳遞到所有目標套接字

引數

struct net *net

關聯的網路名稱空間

struct sk_buff_head *arrvq

帶有到達訊息的佇列,在目標查詢後克隆

struct sk_buff_head *inputq

帶有克隆訊息的佇列,在目標查詢後傳遞到套接字

描述

多執行緒:可能發生引用相同佇列的並行呼叫

void tipc_sk_conn_proto_rcv(struct tipc_sock *tsk, struct sk_buff *skb, struct sk_buff_head *inputq, struct sk_buff_head *xmitq)

接收連線管理協議訊息

引數

struct tipc_sock *tsk

接收套接字

struct sk_buff *skb

指向訊息緩衝區的指標。

struct sk_buff_head *inputq

包含緩衝區的緩衝區列表

struct sk_buff_head *xmitq

輸出訊息區域

int tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz)

以無連線方式傳送訊息

引數

struct socket *sock

套接字結構

struct msghdr *m

要傳送的訊息

size_t dsz

要傳送的使用者資料量

描述

訊息必須顯式指定目標。用於 SOCK_RDM 和 SOCK_DGRAM 訊息,以及 SOCK_SEQPACKET 和 SOCK_STREAM 連線上的“SYN”訊息。(注意:SOCK_STREAM 上禁止使用“SYN+”。)

返回

成功傳送的位元組數,否則為 errno

int tipc_sendstream(struct socket *sock, struct msghdr *m, size_t dsz)

傳送面向流的資料

引數

struct socket *sock

套接字結構

struct msghdr *m

要傳送的資料

size_t dsz

要傳輸的資料總長度

描述

用於 SOCK_STREAM 資料。

返回

成功傳送(或部分成功)的位元組數,如果沒有傳送資料,則為 errno

int tipc_send_packet(struct socket *sock, struct msghdr *m, size_t dsz)

傳送面向連線的訊息

引數

struct socket *sock

套接字結構

struct msghdr *m

要傳送的訊息

size_t dsz

要傳輸的資料長度

描述

用於 SOCK_SEQPACKET 訊息。

返回

成功傳送的位元組數,否則為 errno

void tipc_sk_set_orig_addr(struct msghdr *m, struct sk_buff *skb)

捕獲接收訊息的傳送者地址

引數

struct msghdr *m

訊息資訊描述符

struct sk_buff *skb

接收的訊息

注意

如果接收者未請求,則不會捕獲地址。

int tipc_sk_anc_data_recv(struct msghdr *m, struct sk_buff *skb, struct tipc_sock *tsk)

可選地捕獲接收訊息的輔助資料

引數

struct msghdr *m

訊息資訊描述符

struct sk_buff *skb

接收的訊息緩衝區

struct tipc_sock *tsk

與訊息關聯的 TIPC 埠

注意

如果接收者未請求,則不會捕獲輔助資料。

返回

成功則返回 0,否則返回 errno

int tipc_recvmsg(struct socket *sock, struct msghdr *m, size_t buflen, int flags)

接收面向資料包的訊息

引數

struct socket *sock

網路套接字

struct msghdr *m

訊息資訊描述符

size_t buflen

使用者緩衝區區域的長度

int flags

接收標誌

描述

用於 SOCK_DGRAM、SOCK_RDM 和 SOCK_SEQPACKET 訊息。如果完整訊息不適合使用者區域,則截斷它。

返回

返回訊息資料的大小,否則為 errno

int tipc_recvstream(struct socket *sock, struct msghdr *m, size_t buflen, int flags)

接收面向流的資料

引數

struct socket *sock

網路套接字

struct msghdr *m

訊息資訊描述符

size_t buflen

使用者緩衝區區域的總大小

int flags

接收標誌

描述

僅用於 SOCK_STREAM 訊息。如果沒有足夠的資料可用,可以選擇等待更多資料;永遠不會截斷資料。

返回

返回訊息資料的大小,否則為 errno

void tipc_write_space(struct sock *sk)

如果埠擁塞已釋放,則喚醒執行緒

引數

struct sock *sk

套接字

void tipc_data_ready(struct sock *sk)

喚醒執行緒以指示已收到訊息

引數

struct sock *sk

套接字

bool tipc_sk_filter_connect(struct tipc_sock *tsk, struct sk_buff *skb, struct sk_buff_head *xmitq)

檢查基於連線的套接字的傳入訊息

引數

struct tipc_sock *tsk

TIPC 套接字

struct sk_buff *skb

指向訊息緩衝區的指標。

struct sk_buff_head *xmitq

如果有任何 Nagle ACK

返回

如果訊息應新增到接收佇列,則為 true,否則為 false

unsigned int rcvbuf_limit(struct sock *sk, struct sk_buff *skb)

獲取套接字接收佇列的正確過載限制

引數

struct sock *sk

套接字

struct sk_buff *skb

訊息

描述

對於面向連線的訊息,無論重要性如何,預設佇列限制為 2 MB。

對於無連線訊息,佇列限制基於訊息重要性,如下所示

TIPC_LOW_IMPORTANCE (2 MB) TIPC_MEDIUM_IMPORTANCE (4 MB) TIPC_HIGH_IMPORTANCE (8 MB) TIPC_CRITICAL_IMPORTANCE (16 MB)

返回

根據相應訊息重要性的過載限制

void tipc_sk_filter_rcv(struct sock *sk, struct sk_buff *skb, struct sk_buff_head *xmitq)

驗證傳入訊息

引數

struct sock *sk

套接字

struct sk_buff *skb

指向訊息的指標。

struct sk_buff_head *xmitq

輸出訊息區域 (FIXME)

描述

如果訊息可接受,則將其排隊到接收佇列中;可選地處理已連線套接字的斷開連線指示。

在已獲取套接字鎖的情況下呼叫

int tipc_sk_backlog_rcv(struct sock *sk, struct sk_buff *skb)

處理來自積壓佇列的傳入訊息

引數

struct sock *sk

套接字

struct sk_buff *skb

訊息

描述

呼叫方必須持有套接字鎖

void tipc_sk_enqueue(struct sk_buff_head *inputq, struct sock *sk, u32 dport, struct sk_buff_head *xmitq)

從 inputq 中提取所有目標為“dport”的緩衝區,並嘗試將它們新增到套接字或積壓佇列

引數

struct sk_buff_head *inputq

傳入緩衝區列表,可能具有不同的目標

struct sock *sk

應該將緩衝區排隊的套接字

u32 dport

套接字的埠號

struct sk_buff_head *xmitq

輸出佇列

描述

呼叫方必須持有套接字鎖

void tipc_sk_rcv(struct net *net, struct sk_buff_head *inputq)

處理傳入緩衝區鏈

引數

struct net *net

關聯的網路名稱空間

struct sk_buff_head *inputq

包含緩衝區的緩衝區列表,消耗列表中的所有緩衝區,直到 inputq 為空

注意

可以在引用同一佇列的多個執行緒中呼叫

int tipc_connect(struct socket *sock, struct sockaddr *dest, int destlen, int flags)

建立與另一個 TIPC 埠的連線

引數

struct socket *sock

套接字結構

struct sockaddr *dest

目標埠的套接字地址

int destlen

套接字地址資料結構的大小

int flags

與套接字關聯的與檔案相關的標誌

返回

成功時為 0,否則為 errno

int tipc_listen(struct socket *sock, int len)

允許套接字偵聽傳入連線

引數

struct socket *sock

套接字結構

int len

(未使用)

返回

成功時為 0,否則為 errno

int tipc_accept(struct socket *sock, struct socket *new_sock, struct proto_accept_arg *arg)

等待連線請求

引數

struct socket *sock

偵聽套接字

struct socket *new_sock

要連線的新套接字

struct proto_accept_arg *arg

接受的引數

返回

成功時為 0,否則為 errno

int tipc_shutdown(struct socket *sock, int how)

關閉套接字連線

引數

struct socket *sock

套接字結構

int how

要關閉的方向(必須是 SHUT_RDWR)

描述

終止連線(如果需要),然後清除套接字的接收佇列。

返回

成功時為 0,否則為 errno

int tipc_setsockopt(struct socket *sock, int lvl, int opt, sockptr_t ov, unsigned int ol)

設定套接字選項

引數

struct socket *sock

套接字結構

int lvl

選項級別

int opt

選項識別符號

sockptr_t ov

指向新選項值的指標

unsigned int ol

選項值的長度

描述

僅對於流套接字,接受並忽略所有 IPPROTO_TCP 選項(以簡化相容性)。

返回

成功時為 0,否則為 errno

int tipc_getsockopt(struct socket *sock, int lvl, int opt, char __user *ov, int __user *ol)

獲取套接字選項

引數

struct socket *sock

套接字結構

int lvl

選項級別

int opt

選項識別符號

char __user *ov

選項值的容器

int __user *ol

選項值長度的容器

描述

僅對於流套接字,為所有 IPPROTO_TCP 選項返回 0 長度結果(以簡化相容性)。

返回

成功時為 0,否則為 errno

int tipc_socket_init(void)

初始化 TIPC 套接字介面

引數

void

無引數

返回

成功時為 0,否則為 errno

void tipc_socket_stop(void)

停止 TIPC 套接字介面

引數

void

無引數

bool tipc_sk_filtering(struct sock *sk)

檢查是否應跟蹤套接字

引數

struct sock *sk

要檢查的套接字

描述

sysctl_tipc_sk_filter 用作過濾的套接字元組:(埠 ID、套接字型別、名稱型別、名稱下限、名稱上限)

返回

如果套接字滿足套接字元組資料(值 0 = “任何”)或沒有元組集(全部 = 0),則為 true,否則為 false

bool tipc_sk_overlimit1(struct sock *sk, struct sk_buff *skb)

檢查套接字 rx 佇列是否即將過載,同時考慮 rcv 和積壓佇列

引數

struct sock *sk

要檢查的 tipc sk

struct sk_buff *skb

要檢查的 tipc 訊息

返回

如果套接字 rx 佇列分配 > 90%,則為 true,否則為 false

bool tipc_sk_overlimit2(struct sock *sk, struct sk_buff *skb)

檢查套接字 rx 佇列是否即將過載,僅考慮 rcv 佇列

引數

struct sock *sk

要檢查的 tipc sk

struct sk_buff *skb

要檢查的 tipc 訊息

返回

如果套接字 rx 佇列分配 > 90%,則為 true,否則為 false

int tipc_sk_dump(struct sock *sk, u16 dqueues, char *buf)

轉儲 TIPC 套接字

引數

struct sock *sk

要轉儲的 tipc sk

u16 dqueues

位掩碼,用於決定是否轉儲任何套接字佇列? - TIPC_DUMP_NONE:不轉儲套接字佇列 - TIPC_DUMP_SK_SNDQ:轉儲套接字傳送佇列 - TIPC_DUMP_SK_RCVQ:轉儲套接字接收佇列 - TIPC_DUMP_SK_BKLGQ:轉儲套接字積壓佇列 - TIPC_DUMP_ALL:轉儲以上所有套接字佇列

char *buf

轉儲資料的返回緩衝區格式

TIPC 網路拓撲介面

bool tipc_sub_check_overlap(struct tipc_service_range *subscribed, struct tipc_service_range *found)

測試訂閱是否與給定值重疊

引數

struct tipc_service_range *subscribed

已訂閱的服務範圍

struct tipc_service_range *found

我們正在檢查匹配的服務範圍

描述

如果存在重疊,則返回 true,否則返回 false。

TIPC 伺服器介面

struct tipc_topsrv

TIPC 伺服器結構

定義:

struct tipc_topsrv {
    struct idr conn_idr;
    spinlock_t idr_lock;
    int idr_in_use;
    struct net *net;
    struct work_struct awork;
    struct workqueue_struct *rcv_wq;
    struct workqueue_struct *send_wq;
    struct socket *listener;
    char name[TIPC_SERVER_NAME_LEN];
};

成員

conn_idr

連線的識別符號集合

idr_lock

保護連線識別符號集合

idr_in_use

已分配識別符號條目的數量

net

網路名稱空間例項

awork

接受工作項

rcv_wq

接收工作佇列

send_wq

傳送工作佇列

listener

topsrv 監聽器套接字

name

伺服器名稱

struct tipc_conn

TIPC 連線結構

定義:

struct tipc_conn {
    struct kref kref;
    int conid;
    struct socket *sock;
    unsigned long flags;
    struct tipc_topsrv *server;
    struct list_head sub_list;
    spinlock_t sub_lock;
    struct work_struct rwork;
    struct list_head outqueue;
    spinlock_t outqueue_lock;
    struct work_struct swork;
};

成員

kref

連線物件的引用計數器

conid

連線識別符號

sock

與連線關聯的套接字處理程式

flags

指示連線狀態

server

指向已連線伺服器的指標

sub_list

lsit 到所有相關的訂閱

sub_lock

保護訂閱列表的鎖

rwork

接收工作項

outqueue

指向佇列中第一個出站訊息的指標

outqueue_lock

控制對 outqueue 的訪問

swork

傳送工作項

TIPC 跟蹤介面

int tipc_skb_dump(struct sk_buff *skb, bool more, char *buf)

轉儲 TIPC skb 資料

引數

struct sk_buff *skb

要轉儲的 skb

bool more

轉儲更多? - false:僅轉儲 tipc msg 資料 - true:也轉儲核心相關的 skb 資料和 tipc cb[] 陣列

char *buf

轉儲資料的返回緩衝區格式

int tipc_list_dump(struct sk_buff_head *list, bool more, char *buf)

轉儲 TIPC skb 列表/佇列

引數

struct sk_buff_head *list

要轉儲的 skb 列表

bool more

轉儲更多? - false:僅轉儲頭部和尾部 skb - true:轉儲前 5 個和後 5 個 skb

char *buf

轉儲資料的返回緩衝區格式