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
如何使用 TIPC 程式設計
如何為 TIPC 做出貢獻
有關 TIPC 規範的更多詳細資訊
實現¶
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_idTIPC 媒體型別識別符號
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_idTIPC 媒體識別符號
hwaddr_lenTIPC 媒體地址長度
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承載的資料包型別
rcutipc_bearer 的 rcu 結構
priority承載的預設鏈路優先順序
min_win宣告鏈路擁塞之前的最小視窗(以資料包為單位)
max_win宣告鏈路擁塞之前的最大視窗(以資料包為單位)
tolerance承載的預設鏈路容差
domain可以建立鏈路的網路域
identity此承載在 TIPC 承載陣列中的陣列索引
disc指向鏈路設定請求的指標
net_plane當前與承載關聯的網路平面(“A”到“H”)
encap_hlen封裝標頭長度
up承載啟動標誌(位 0)
refcnttipc_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釋出埠引用
keypublication 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 *extacknetlink 擴充套件確認
-
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_idIPv6 範圍 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密碼控制代碼/金鑰
listTFM 的連結串列
-
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)
模式應用於金鑰的加密模式
提示使用者金鑰的提示
rcustruct rcu_head
keyAEAD 金鑰
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;
};
成員
netstruct net
節點TIPC 節點(RX)
aead指向用於加密/解密的 AEAD 金鑰的指標陣列
peer_rx_active複製的對等 RX 活動金鑰索引
key_genTX/RX 金鑰生成
key金鑰狀態
skey_mode會話金鑰的模式
skey接收到的會話金鑰
wqTX 加密的通用工作佇列
workTX/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組合標誌欄位
locktipc_key 鎖
-
int tipc_aead_key_validate(struct tipc_aead_key *ukey, struct genl_info *info)¶
驗證 AEAD 使用者金鑰
引數
struct tipc_aead_key *ukey指向使用者金鑰資料的指標
struct genl_info *infoNetlink 資訊指標
-
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 *rprcu 頭指標
引數
struct tipc_aead *aeadAEAD 金鑰指標
引數
struct tipc_aead **aead返回的新 TIPC AEAD 金鑰控制代碼指標
struct tipc_aead_key *ukey指向使用者金鑰資料的指標
u8 mode金鑰模式
描述
如果有效,則使用特定使用者金鑰資料分配新的密碼轉換 (TFM)(或列表)。可以透過 sysfs “net/tipc/max_tfms” 首先設定已分配 TFM 的數量。此外,還會初始化所有其他 AEAD 資料。
返回
如果啟動成功,則為 0,否則:< 0
引數
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 *bTIPC 承載,訊息加密後將在此處傳遞
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 *netstruct net
struct tipc_aead *aead用於訊息解密的 TIPC AEAD
struct sk_buff *skb輸入/輸出 skb
struct tipc_bearer *bTIPC 承載,訊息已在此處接收
返回
0:如果解密已完成
-EINPROGRESS/-EBUSY:如果將執行回撥
< 0:解密失敗
引數
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 *netstruct 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 *rxRX 加密控制代碼
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 *txTX 加密控制代碼
struct tipc_crypto *rxRX 加密控制代碼(可以為 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 *rxRX 加密控制代碼
struct sk_buff *skbTIPCv2 訊息緩衝區(包括來自對等方的 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 *netstruct 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 *netstruct net
struct tipc_crypto *rxRX 加密控制代碼
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:由於其他原因導致解密失敗
引數
struct net *netnet 結構
struct sk_buff *skb接收訊息緩衝區
-
int tipc_crypto_key_distr(struct tipc_crypto *tx, u8 key, struct tipc_node *dest)¶
分發 TX 金鑰
引數
struct tipc_crypto *txTX 加密
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 *netnet 結構
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 *rxRX 加密
struct tipc_msg *hdrTIPC v2 訊息,包括資料中接收的會話金鑰
描述
此函式檢索來自對等方的訊息中的會話金鑰,然後安排 RX 工作,將金鑰附加到相應的 RX 加密。
返回
如果金鑰已安排用於附加,則為“true”,否則為“false”。
-
void tipc_crypto_work_rx(struct work_struct *work)¶
已安排的 RX 工作處理程式
引數
struct work_struct *workstruct RX 工作
描述
該函式處理先前安排的工作,即分發 TX 金鑰或將接收的會話金鑰附加到 RX 加密。
-
void tipc_crypto_rekeying_sched(struct tipc_crypto *tx, bool changed, u32 new_intv)¶
(重新)安排重新金鑰,無需新間隔
引數
struct tipc_crypto *txTX 加密
bool changed如果需要使用新間隔重新安排重新金鑰
u32 new_intv新的重新金鑰間隔(當“changed” = true 時)
-
void tipc_crypto_work_tx(struct work_struct *work)¶
已安排的 TX 工作處理程式
引數
struct work_struct *workstruct 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 鏈路介面¶
-
struct tipc_link¶
TIPC 鏈路資料結構
定義:
struct tipc_link {
u32 addr;
char name[TIPC_MAX_LINK_NAME];
struct net *net;
u16 peer_session;
u16 session;
u16 snd_nxt_state;
u16 rcv_nxt_state;
u32 peer_bearer_id;
u32 bearer_id;
u32 tolerance;
u32 abort_limit;
u32 state;
u16 peer_caps;
bool in_session;
bool active;
u32 silent_intv_cnt;
char if_name[TIPC_MAX_IF_NAME];
u32 priority;
char net_plane;
struct tipc_mon_state mon_state;
u16 rst_cnt;
u16 drop_point;
struct sk_buff *failover_reasm_skb;
struct sk_buff_head failover_deferdq;
u16 mtu;
u16 advertised_mtu;
struct sk_buff_head transmq;
struct sk_buff_head backlogq;
struct {
u16 len;
u16 limit;
struct sk_buff *target_bskb;
} backlog[5];
u16 snd_nxt;
u16 rcv_nxt;
u32 rcv_unacked;
struct sk_buff_head deferdq;
struct sk_buff_head *inputq;
struct sk_buff_head *namedq;
struct sk_buff_head wakeupq;
u16 window;
u16 min_win;
u16 ssthresh;
u16 max_win;
u16 cong_acks;
u16 checkpoint;
struct sk_buff *reasm_buf;
struct sk_buff *reasm_tnlmsg;
u16 ackers;
u16 acked;
u16 last_gap;
struct tipc_gap_ack_blks *last_ga;
struct tipc_link *bc_rcvlink;
struct tipc_link *bc_sndlink;
u8 nack_state;
bool bc_peer_is_up;
struct tipc_stats stats;
};
成員
addr鏈路的對等節點網路地址
name鏈路名稱字串
net指向名稱空間結構的指標
peer_session鏈路對等端正在使用的鏈路會話 #
session鏈路要使用的會話
snd_nxt_state下一個傳送序列號
rcv_nxt_state下一個接收序列號
peer_bearer_id鏈路的對等端點使用的承載 ID
bearer_id鏈路使用的本地承載 ID
tolerance重置鏈路所需的最小鏈路連續性丟失 [以毫秒為單位]
abort_limit重置鏈路所需的未確認連續性探測的 #
state鏈路 FSM 的當前狀態
peer_caps描述對等節點功能的點陣圖
in_session已從對等方接收 ACTIVATE_MSG
active鏈路處於活動狀態
silent_intv_cnt沒有從對等方接收的計時器間隔的 #
if_name關聯的介面名稱
priority當前鏈路優先順序
net_plane當前鏈路網路平面(“A”到“H”)
mon_state帶有鏈路監視器所需資訊的 cookie
rst_cnt鏈路重置計數器
drop_point用於故障轉移處理的序列號(FIXME)
failover_reasm_skb儲存的故障轉移訊息 ptr (FIXME)
failover_deferdq用於故障轉移處理的延遲訊息佇列 (FIXME)
mtu此鏈路的當前最大資料包大小
advertised_mtu正在建立鏈路時通告的自身 mtu
transmq鏈路的傳輸佇列
backlogq等待發送的訊息佇列
backlog按優先順序(重要性)的鏈路積壓
snd_nxt要使用的下一個序列號
rcv_nxt入站訊息的下一個預期序列號
rcv_unacked使用者讀取但尚未確認回對等方的訊息的 #
deferdq延遲接收佇列
inputq要向上傳遞的訊息的緩衝區佇列
namedq要向上傳遞的名稱表訊息的緩衝區佇列
wakeupq等待鏈路擁塞減輕的喚醒訊息的連結串列
window用於擁塞處理的滑動視窗大小
min_win鏈路要使用的最小發送視窗
ssthresh用於擁塞處理的慢啟動閾值
max_win鏈路要使用的最大發送視窗
cong_acks用於避免擁塞的擁塞確認 (FIXME)
checkpoint用於擁塞視窗大小處理的序列號
reasm_buf部分重新組裝的入站訊息片段的頭部
reasm_tnlmsg隧道協議訊息的碎片/重組區域
ackers在釋放每個資料包之前需要確認資料包的對等方的 #
acked# 由特定對等方確認的最後一個數據包。用於廣播。
last_gapbcast 的最後一個間隙 ack 塊 (FIXME)
last_ga指向間隙 ack 塊的指標
bc_rcvlink用於廣播接收的特定於對等方的鏈路
bc_sndlink用於廣播發送的名稱空間全域性鏈路
nack_statebcast nack 狀態
bc_peer_is_up對等方已確認 bcast init 訊息
stats收集有關鏈路活動的統計資訊
-
bool tipc_link_create(struct net *net, char *if_name, int bearer_id, int tolerance, char net_plane, u32 mtu, int priority, u32 min_win, u32 max_win, u32 session, u32 self, u32 peer, u8 *peer_id, u16 peer_caps, struct tipc_link *bc_sndlink, struct tipc_link *bc_rcvlink, struct sk_buff_head *inputq, struct sk_buff_head *namedq, struct tipc_link **link)¶
建立新鏈路
引數
struct net *net指向關聯的網路名稱空間的指標
char *if_name關聯的介面名稱
int bearer_id關聯的承載的 ID(索引)
int tolerance鏈路要使用的鏈路容差
char net_plane此鏈路所屬的網路平面 (A,B,c..)
u32 mtu鏈路要通告的 mtu
int priority鏈路要使用的優先順序
u32 min_win鏈路要使用的最小發送視窗
u32 max_win鏈路要使用的最大發送視窗
u32 session鏈路要使用的會話
u32 self本地單播鏈路 ID
u32 peer對等節點的節點 ID
u8 *peer_id對等方的 128 位 ID
u16 peer_caps描述對等節點功能的點陣圖
struct tipc_link *bc_sndlink用於廣播發送的名稱空間全域性鏈路
struct tipc_link *bc_rcvlink用於廣播接收的特定於對等方的鏈路
struct sk_buff_head *inputq用於放置準備好傳遞的訊息的佇列
struct sk_buff_head *namedq用於放置繫結表更新訊息的佇列,準備好傳遞
struct tipc_link **link返回值,指向放置建立的鏈路的指標
返回
如果建立了鏈路,則為 true,否則為 false
-
bool tipc_link_bc_create(struct net *net, u32 ownnode, u32 peer, u8 *peer_id, int mtu, u32 min_win, u32 max_win, u16 peer_caps, struct sk_buff_head *inputq, struct sk_buff_head *namedq, struct tipc_link *bc_sndlink, struct tipc_link **link)¶
建立用於廣播的新鏈路
引數
struct net *net指向關聯的網路名稱空間的指標
u32 ownnode自身節點的標識
u32 peer對等節點的節點 ID
u8 *peer_id對等方的 128 位 ID
int mtu如果沒有對等方,則最初要使用的 mtu
u32 min_win鏈路要使用的最小發送視窗
u32 max_win鏈路要使用的最大發送視窗
u16 peer_caps描述對等節點功能的點陣圖
struct sk_buff_head *inputq用於放置準備好傳遞的訊息的佇列
struct sk_buff_head *namedq用於放置繫結表更新訊息的佇列,準備好傳遞
struct tipc_link *bc_sndlink用於廣播發送的名稱空間全域性鏈路
struct tipc_link **link返回值,指向放置建立的鏈路的指標
返回
如果建立了鏈路,則為 true,否則為 false
引數
struct tipc_link *l指向鏈路的指標
int evt要處理的狀態機事件
引數
struct tipc_link *l要檢查的 tipc 鏈路
返回
如果鏈路 ‘silent_intv_cnt’ 即將達到 ‘abort_limit’ 值,則為 true,否則為 false
引數
struct tipc_link *l擁塞鏈路
struct tipc_msg *hdr傳送的訊息的頭部。在擁塞消退時建立偽訊息傳送回用戶
引數
struct tipc_link *l擁塞鏈路。根據傳送佇列中的可用空間,喚醒一些等待使用者
-
void tipc_link_set_skb_retransmit_time(struct sk_buff *skb, struct tipc_link *l)¶
設定下次應嘗試重新傳輸給定 skb 的時間
引數
struct sk_buff *skb要設定未來重新傳輸時間的 skb
struct tipc_link *lskb 將在其上傳輸的鏈路
-
int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list, struct sk_buff_head *xmitq)¶
根據佇列情況將緩衝區列表排隊
引數
struct tipc_link *l要使用的鏈路
struct sk_buff_head *list包含訊息的緩衝區鏈
struct sk_buff_head *xmitq呼叫方要傳送的資料包的返回列表
描述
消耗緩衝區鏈。始終接受 TIPC_SYSTEM_IMPORTANCE 訊息
返回
如果成功,則為 0,或者為 errno: -ELINKCONG、-EMSGSIZE 或 -ENOBUFS
引數
struct tipc_link *ltipc 鏈路傳送者
struct tipc_link *rtipc 鏈路接收者(在單播情況下 = l)
int *rc返回的程式碼
返回
如果發生重複的重新傳輸失敗,則為 true,否則為 false
-
u16 tipc_get_gap_ack_blks(struct tipc_gap_ack_blks **ga, struct tipc_link *l, struct tipc_msg *hdr, bool uc)¶
從 PROTOCOL/STATE_MSG 獲取 Gap ACK 塊
引數
struct tipc_gap_ack_blks **ga指向 Gap ACK 塊的返回指標(如果有)
struct tipc_link *ltipc 連結
struct tipc_msg *hdrPROTOCOL/STATE_MSG 標頭
bool uc所需的 Gap ACK 塊型別,即單播 (= 1) 或廣播 (= 0)
返回
Gap ACK 塊的總大小
-
void tipc_link_failover_prepare(struct tipc_link *l, struct tipc_link *tnl, struct sk_buff_head *xmitq)¶
為鏈路故障切換準備 tnl
引數
struct tipc_link *l故障切換鏈路
struct tipc_link *tnl隧道鏈路
struct sk_buff_head *xmitq訊息的待發送佇列
描述
這是 precursor - tipc_link_tnl_prepare() 的特殊版本,詳見 tipc_node_link_failover()
引數
struct tipc_link *l指向鏈路的指標
引數
struct tipc_link *l要轉儲的 tipc 鏈路
u16 dqueues位掩碼,用於確定是否要轉儲任何鏈路佇列? - TIPC_DUMP_NONE: 不要轉儲鏈路佇列 - TIPC_DUMP_TRANSMQ: 轉儲鏈路 transmq 佇列 - TIPC_DUMP_BACKLOGQ: 轉儲鏈路 backlog 佇列 - TIPC_DUMP_DEFERDQ: 轉儲鏈路 deferd 佇列 - TIPC_DUMP_INPUTQ: 轉儲鏈路 input 佇列 - TIPC_DUMP_WAKEUP: 轉儲鏈路 wakeup 佇列 - TIPC_DUMP_ALL: 轉儲上述所有鏈路佇列
char *buf轉儲資料的返回緩衝區格式
TIPC msg 介面¶
引數
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 *skbTIPC 訊息 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
引數
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”。
引數
struct sk_buff *skb要從中提取的緩衝區。
struct sk_buff **iskb提取的內部緩衝區,要返回
int *pos要提取的訊息的外部訊息中的位置。 返回下一個訊息的位置。 提取最後一個數據包時會消耗外部緩衝區
返回
存在提取的緩衝區時為 true,否則為 false
引數
u32 own_node反向訊息的原始節點 ID
struct sk_buff **skb包含要反向的訊息的緩衝區;將被消耗
int err要在訊息中設定的錯誤程式碼(如果有)。成功時,使用新緩衝區替換消耗的緩衝區
返回
如果成功,則為 true,否則為 false
引數
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 *nrbtree 中從中開始搜尋的服務範圍節點
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 keypublication 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 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此訊息的序列號
引數
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)
引數
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節點的保持活動計時器
rcutipc_node 的 rcu struct
delete_at指示刪除關閉節點的時間
peer_net對等方的網路名稱空間
peer_hash_mix此對等方的雜湊 (FIXME)
crypto_rxRX 加密處理程式
-
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佇列,用於在 上傳輸訊息
描述
連結變為活動(單獨或共享)或備用,具體取決於其優先順序。
-
void tipc_node_link_failover(struct tipc_node *n, struct tipc_link *l, struct tipc_link *tnl, struct sk_buff_head *xmitq)¶
在“半故障轉移”情況下啟動故障轉移
引數
struct tipc_node *ntipc 節點結構
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!
-
void __tipc_node_link_down(struct tipc_node *n, int *bearer_id, struct sk_buff_head *xmitq, struct tipc_media_addr **maddr)¶
處理連結丟失
引數
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 lenlinkname 輸出緩衝區的大小
返回
成功時為 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
引數
struct net *net適用的網路名稱空間
struct sk_buff *skbTIPC 資料包
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 *skbTIPC 資料包
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 *skbTIPC 資料包
struct tipc_bearer *b指向訊息到達的承載的指標
描述
在不持有任何鎖的情況下呼叫。承載指標必須指向有效的承載結構(即不能為 NULL),但承載可以不活動。
引數
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 處理的最大訊息大小
portidTIPC 套接字雜湊表中的唯一埠標識
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接收視窗大小
peerdgram/rdm 的“已連線”對等方
節點雜湊表節點
mc_method套接字和廣播層之間使用的 Cookie
rcutipc_sock 的 rcu struct
groupTIPC 通訊組
oneway一個方向上的訊息計數 (FIXME)
nagle_start當前 nagle 值
snd_backlog傳送 backlog 計數
msg_acc已接受的訊息;用於管理 backlog 和 nagle
pkt_cntTIPC 套接字資料包計數
expect_ack此 TIPC 套接字是否期望收到 ack
nodelaysetsockopt() TIPC_NODELAY 設定
group_is_openTIPC 套接字組已完全開啟 (FIXME)
published如果埠具有一個或多個關聯名稱,則為 true
conn_addrtype建立連線時使用的地址型別
引數
struct sock *sk網路套接字
描述
呼叫方必須持有套接字鎖
引數
struct sock *sk網路套接字
int error響應錯誤程式碼
描述
呼叫方必須持有套接字鎖
引數
struct net *net網路名稱空間(必須是預設網路)
struct socket *sock預分配的套接字結構
int protocol協議指示符(必須為 0)
int kern是由核心還是使用者空間引起的?
描述
此例程建立 TIPC 套接字使用的其他資料結構,對其進行初始化,並將它們連結在一起。
返回
成功時為 0,否則為 errno
引數
struct socket *sock要銷燬的套接字
描述
此例程清除仍在套接字上排隊的任何訊息。對於 DGRAM 和 RDM 套接字型別,所有排隊的訊息都被拒絕。對於 SEQPACKET 和 STREAM 套接字型別,第一個訊息被拒絕,任何其他訊息都被丟棄。(如果 STREAM 套接字上的第一個訊息是部分讀取的,則丟棄該訊息,並拒絕下一個訊息。)
注意
被拒絕的訊息不一定會返回給傳送方!根據傳送方為訊息指定的“目標可丟棄”設定返回或丟棄這些訊息。
返回
成功時為 0,否則為 errno
引數
struct socket *sock套接字結構
struct sockaddr *skaddr描述名稱和所需操作的套接字地址
int alen套接字地址資料結構的大小
描述
使用正範圍值指示名稱和名稱序列繫結;負範圍值取消繫結指定的名稱。指定無名稱(即套接字地址長度為 0)將從套接字取消繫結所有名稱。
返回
成功時為 0,否則為 errno
注意
- 此例程不需要獲取套接字鎖,因為它不
訪問任何非常量套接字資訊。
引數
struct socket *sock套接字結構
struct sockaddr *uaddr返回的套接字地址的區域
int peer0 = 自己的 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 *tskTIPC 套接字
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輸出訊息區域
引數
struct socket *sock套接字結構
struct msghdr *m要傳送的訊息
size_t dsz要傳送的使用者資料量
描述
訊息必須顯式指定目標。用於 SOCK_RDM 和 SOCK_DGRAM 訊息,以及 SOCK_SEQPACKET 和 SOCK_STREAM 連線上的“SYN”訊息。(注意:SOCK_STREAM 上禁止使用“SYN+”。)
返回
成功傳送的位元組數,否則為 errno
引數
struct socket *sock套接字結構
struct msghdr *m要傳送的資料
size_t dsz要傳輸的資料總長度
描述
用於 SOCK_STREAM 資料。
返回
成功傳送(或部分成功)的位元組數,如果沒有傳送資料,則為 errno
引數
struct socket *sock套接字結構
struct msghdr *m要傳送的訊息
size_t dsz要傳輸的資料長度
描述
用於 SOCK_SEQPACKET 訊息。
返回
成功傳送的位元組數,否則為 errno
引數
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
引數
struct socket *sock網路套接字
struct msghdr *m訊息資訊描述符
size_t buflen使用者緩衝區區域的長度
int flags接收標誌
描述
用於 SOCK_DGRAM、SOCK_RDM 和 SOCK_SEQPACKET 訊息。如果完整訊息不適合使用者區域,則截斷它。
返回
返回訊息資料的大小,否則為 errno
引數
struct socket *sock網路套接字
struct msghdr *m訊息資訊描述符
size_t buflen使用者緩衝區區域的總大小
int flags接收標誌
描述
僅用於 SOCK_STREAM 訊息。如果沒有足夠的資料可用,可以選擇等待更多資料;永遠不會截斷資料。
返回
返回訊息資料的大小,否則為 errno
引數
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 *tskTIPC 套接字
struct sk_buff *skb指向訊息緩衝區的指標。
struct sk_buff_head *xmitq如果有任何 Nagle ACK
返回
如果訊息應新增到接收佇列,則為 true,否則為 false
引數
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)
返回
根據相應訊息重要性的過載限制
引數
struct sock *sk套接字
struct sk_buff *skb指向訊息的指標。
struct sk_buff_head *xmitq輸出訊息區域 (FIXME)
描述
如果訊息可接受,則將其排隊到接收佇列中;可選地處理已連線套接字的斷開連線指示。
在已獲取套接字鎖的情況下呼叫
引數
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輸出佇列
描述
呼叫方必須持有套接字鎖
引數
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
引數
struct socket *sock套接字結構
int len(未使用)
返回
成功時為 0,否則為 errno
引數
struct socket *sock偵聽套接字
struct socket *new_sock要連線的新套接字
struct proto_accept_arg *arg接受的引數
返回
成功時為 0,否則為 errno
引數
struct socket *sock套接字結構
int how要關閉的方向(必須是 SHUT_RDWR)
描述
終止連線(如果需要),然後清除套接字的接收佇列。
返回
成功時為 0,否則為 errno
引數
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無引數
引數
struct sock *sk要檢查的套接字
描述
sysctl_tipc_sk_filter 用作過濾的套接字元組:(埠 ID、套接字型別、名稱型別、名稱下限、名稱上限)
返回
如果套接字滿足套接字元組資料(值 0 = “任何”)或沒有元組集(全部 = 0),則為 true,否則為 false
引數
struct sock *sk要檢查的 tipc sk
struct sk_buff *skb要檢查的 tipc 訊息
返回
如果套接字 rx 佇列分配 > 90%,則為 true,否則為 false
引數
struct sock *sk要檢查的 tipc sk
struct sk_buff *skb要檢查的 tipc 訊息
返回
如果套接字 rx 佇列分配 > 90%,則為 true,否則為 false
引數
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傳送工作佇列
listenertopsrv 監聽器套接字
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_listlsit 到所有相關的訂閱
sub_lock保護訂閱列表的鎖
rwork接收工作項
outqueue指向佇列中第一個出站訊息的指標
outqueue_lock控制對 outqueue 的訪問
swork傳送工作項
TIPC 跟蹤介面¶
引數
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轉儲資料的返回緩衝區格式