




已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Linux vlan知識總結(jié)(beta 1) by moonflow qq:171932120 (總結(jié)自互聯(lián)網(wǎng)) 目錄前言3第一章 vlan的基本概念41.1 vlan的作用41.2 vlan的實(shí)現(xiàn)原理41.3 vlan的分類41.4 vlan幀結(jié)構(gòu)4第二章 重要結(jié)構(gòu)62.1 /include/linux/if_vlan.h6第三章 主要函數(shù)203.1 vlan_proto_init net8021qvlan.c203.2 register_pernet_subsys net8021qvlan.c213.3 register_netdevice_notifier /net/core/dev.c213.4 dev_add_pack /net/core/dev.c213.5 vlan_skb_recv /net/core/dev.c223.5 vlan_ioctl_set /net/socket.c25第四章 總結(jié)26參考資料27前言此文檔是本人這段時(shí)間內(nèi)學(xué)習(xí)Linux網(wǎng)絡(luò)協(xié)議棧vlan功能相關(guān)知識,總結(jié)并且整理出來的文檔。本文中的參考內(nèi)核代碼為2.6.24(相關(guān)的資料較多,便于開展),當(dāng)然也是對互聯(lián)網(wǎng)資源的整合。參考了銳捷的一份文檔,并且參考了網(wǎng)上很多資源??梢哉f基本上總結(jié)自互聯(lián)網(wǎng)。參考中附上我學(xué)習(xí)時(shí)參考的資料,很多,而且他們寫的都非常好,導(dǎo)致我都不知道寫啥了。不過僅僅只是為了借這次總結(jié)的機(jī)會,讓個(gè)人對Linux vlan部分更加深入。因?yàn)楸救顺鯇W(xué)Linux協(xié)議棧,對很多部分都還很迷茫,所以很多地方會出現(xiàn)失誤或者不夠清楚。我接觸Linux時(shí)間很短,但是非常喜愛Linux,同時(shí)對網(wǎng)絡(luò)部分非常喜愛,希望大家喜歡并且與我交流,共同進(jìn)步。第一章 vlan的基本概念1.1 vlan的作用虛擬局域網(wǎng)VLAN是一組邏輯上的設(shè)備和用戶,這些設(shè)備和用戶并不受物理網(wǎng)段的限制,可以根據(jù)功能、部門及應(yīng)用等因素將它們組織起來,相互之間的通信就好像它們在同一個(gè)網(wǎng)段中一樣,由此得名虛擬局域網(wǎng)。VLAN是一種比較新的技術(shù),工作在OSI參考模型的第2層和第3層,一個(gè)VLAN就是一個(gè)廣播域,VLAN之間的通信是通過第3層的路由器來完成的。 1.2 vlan的實(shí)現(xiàn)原理當(dāng)VLAN交換機(jī)從工作站接收到數(shù)據(jù)后,會對數(shù)據(jù)的部分內(nèi)容進(jìn)行檢查,并與一個(gè)VLAN配置數(shù)據(jù)庫(該數(shù)據(jù)庫含有靜態(tài)配置的或者動態(tài)學(xué)習(xí)而得到的MAC地址等信息)中的內(nèi)容進(jìn)行比較后,確定數(shù)據(jù)去向,如果數(shù)據(jù)要發(fā)往一個(gè)VLAN設(shè)備(VLAN-aware),一個(gè)標(biāo)記(Tag)或者VLAN標(biāo)識就被加到這個(gè)數(shù)據(jù)上,根據(jù)VLAN標(biāo)識和目的地址,VLAN交換機(jī)就可以將該數(shù)據(jù)轉(zhuǎn)發(fā)到同一VLAN上適當(dāng)?shù)哪康牡兀蝗绻麛?shù)據(jù)發(fā)往非VLAN設(shè)備(VLAN-unaware),則VLAN交換機(jī)發(fā)送不帶VLAN標(biāo)識的數(shù)據(jù)。 1.3 vlan的分類a.基于端口的VLAN b.基于MAC地址的VLAN c.基于路由的VLAN d.基于策略的VLAN 1.4 vlan幀結(jié)構(gòu)每一個(gè)支持802.1Q協(xié)議的主機(jī),在發(fā)送數(shù)據(jù)包時(shí),都在原來的以太網(wǎng)楨頭中的源地址后增加了一個(gè)4字節(jié)的802.1Q楨頭,之后接原來以太網(wǎng)的長度或類型域,關(guān)于以太網(wǎng)楨頭的封裝格式,參見以太網(wǎng)方面的培訓(xùn)教材。圖1 帶有802.1Q標(biāo)簽頭的以太網(wǎng)楨 這4個(gè)字節(jié)的802.1Q標(biāo)簽頭包含了2個(gè)字節(jié)的標(biāo)簽協(xié)議標(biāo)(TPID-Tag Protocol Identifier,它的值是8100),和兩個(gè)字節(jié)的標(biāo)簽控制信息(TCI-Tag Control Information),TPID是IEEE定義的新的類型,表明這是一個(gè)加了802.1Q標(biāo)簽的本文,圖2顯示了802.1Q標(biāo)簽頭的詳細(xì)內(nèi)容。圖2 802.1Q標(biāo)簽頭 該標(biāo)簽頭中的信息解釋如下: LAN Identified( VLAN ID ): 這是一個(gè)12位的域,指明VLAN的ID,一共4096個(gè),每個(gè)支持802.1Q協(xié)議的主機(jī)發(fā)送出來的數(shù)據(jù)包都會包含這個(gè)域,以指明自己屬于哪一個(gè)VLAN,目前TNETX 3270只支持32個(gè)VLAN。Canonical Format Indicator( cfi ):這一位主要用于總線型的以太網(wǎng)與FDDI、令牌環(huán)網(wǎng)交換數(shù)據(jù)時(shí)的楨格式,TNETX 3270忽略此位。Priority:這3 位指明楨的優(yōu)先級。一共有8種優(yōu)先級,主要用于當(dāng)交換機(jī)阻塞時(shí),優(yōu)先發(fā)送哪個(gè)數(shù)據(jù)包。TNETX 3270和TNETX 4090只支持一種優(yōu)先級,所以這一位也沒有用,第2章 重要結(jié)構(gòu)2.1 /include/linux/if_vlan.h在/include/linux/if_vlan.h中定義vlan相關(guān)的基本數(shù)據(jù)結(jié)構(gòu)/每一個(gè)支持802.1q協(xié)議的主機(jī),在發(fā)送數(shù)據(jù)包時(shí),都在原來的以太網(wǎng)幀頭中的源地址后增加了一個(gè)4字節(jié)的802.1q幀頭#define VLAN_HLEN 4 /* The additional bytes (on top of the Ethernet header) * that VLAN requires. */VLAN以太網(wǎng)頭部的地址長度字節(jié)#define VLAN_ETH_ALEN 6 /* Octets in one ethernet addr */VLAN以太網(wǎng)頭部的長度字節(jié)#define VLAN_ETH_HLEN 18 /* Total octets in header. */VLAN以太網(wǎng)不含CRC校驗(yàn)的數(shù)據(jù)最小長度#define VLAN_ETH_ZLEN 64 /* Min. octets in frame sans FCS */*備注以太網(wǎng)的情況#define ETH_ALEN 6 /*以太網(wǎng)地址,即MAC地址,6字節(jié)*/#define ETH_HLEN 14 /*以太網(wǎng)頭部的總長度*/#define ETH_ZLEN 60 /*不含CRC校驗(yàn)的數(shù)據(jù)最小長度*/#define ETH_DATA_LEN 1500 /*幀內(nèi)數(shù)據(jù)的最大長度*/#define ETH_FRAME_LEN 1514 /*不含CRC校驗(yàn)和的最大以太網(wǎng)數(shù)據(jù)長度*/*/* * According to 802.3ac, the packet can be 4 bytes longer. -Klika Jan */VLAN幀內(nèi)數(shù)據(jù)的最大長度#define VLAN_ETH_DATA_LEN 1500 /* Max. octets in payload */VLAN中不含CRC校驗(yàn)和的最大以太網(wǎng)數(shù)據(jù)長度#define VLAN_ETH_FRAME_LEN 1518 /* Max. octets in frame sans FCS */* * struct vlan_hdr - vlan header * h_vlan_TCI: priority and VLAN ID *h_vlan_encapsulated_proto: packet type ID or len */struct vlan_hdr _be16 h_vlan_TCI; /TCI:802.1q標(biāo)簽頭部分的priority and vlan id,標(biāo)簽控制信息 _be16 h_vlan_encapsulated_proto; /包類型ID或者長度;/* *struct vlan_ethhdr - vlan ethernet header (ethhdr + vlan_hdr) *h_dest: destination ethernet address *h_source: source ethernet address *h_vlan_proto: ethernet protocol (always 0x8100) *h_vlan_TCI: priority and VLAN ID *h_vlan_encapsulated_proto: packet type ID or len */struct vlan_ethhdr unsigned char h_destETH_ALEN; /目的地址 unsigned char h_sourceETH_ALEN; /源地址 _be16 h_vlan_proto; /以太網(wǎng)協(xié)議 _be16 h_vlan_TCI; /標(biāo)簽控制信息 _be16 h_vlan_encapsulated_proto;/包類型ID或者長度;#include static inline struct vlan_ethhdr *vlan_eth_hdr(const struct sk_buff *skb) return (struct vlan_ethhdr *)skb_mac_header(skb);#define VLAN_PRIO_MASK 0xe000 /* Priority Code Point */#define VLAN_PRIO_SHIFT 13#define VLAN_CFI_MASK 0x1000 /* Canonical Format Indicator */#define VLAN_TAG_PRESENT VLAN_CFI_MASK /這一位主要用于總線型的以太網(wǎng)與FDDI、令牌環(huán)網(wǎng)交換數(shù)據(jù)時(shí)的楨格式,TNETX 3270忽略此位#define VLAN_VID_MASK 0x0fff /* VLAN Identifier */ /VLAN標(biāo)識符#define VLAN_N_VID 4096 /VLAN ID總共4096個(gè)/* found in socket.c */extern void vlan_ioctl_set(int (*hook)(struct net *, void _user *);/* if this changes, algorithm will have to be reworked because this * depends on completely exhausting the VLAN identifier space. Thus * it gives constant time look-up, but in many cases it wastes memory. */#define VLAN_GROUP_ARRAY_SPLIT_PARTS 8#define VLAN_GROUP_ARRAY_PART_LEN (VLAN_N_VID/VLAN_GROUP_ARRAY_SPLIT_PARTS)struct vlan_group struct net_device *real_dev; /* The ethernet(like) device * the vlan is attached to. */ unsigned int nr_vlans; int killall; struct hlist_node hlist; /* linked list */ struct net_device *vlan_devices_arraysVLAN_GROUP_ARRAY_SPLIT_PARTS; struct rcu_head rcu; /rcu鎖;/獲取vlan組里設(shè)備static inline struct net_device *vlan_group_get_device(struct vlan_group *vg, u16 vlan_id) struct net_device *array; array = vg-vlan_devices_arraysvlan_id / VLAN_GROUP_ARRAY_PART_LEN; return array ? arrayvlan_id % VLAN_GROUP_ARRAY_PART_LEN : NULL;/設(shè)置vlan組設(shè)備static inline void vlan_group_set_device(struct vlan_group *vg, u16 vlan_id, struct net_device *dev) struct net_device *array; if (!vg) return; array = vg-vlan_devices_arraysvlan_id / VLAN_GROUP_ARRAY_PART_LEN; arrayvlan_id % VLAN_GROUP_ARRAY_PART_LEN = dev;/vlan下硬件加速處理#define vlan_tx_tag_present(_skb) (_skb)-vlan_tci & VLAN_TAG_PRESENT)#define vlan_tx_tag_get(_skb) (_skb)-vlan_tci & VLAN_TAG_PRESENT)#if defined(CONFIG_VLAN_8021Q) | defined(CONFIG_VLAN_8021Q_MODULE)/* Must be invoked with rcu_read_lock or with RTNL. */static inline struct net_device *vlan_find_dev(struct net_device *real_dev, u16 vlan_id) struct vlan_group *grp = rcu_dereference_rtnl(real_dev-vlgrp); if (grp) return vlan_group_get_device(grp, vlan_id); return NULL;extern struct net_device *vlan_dev_real_dev(const struct net_device *dev);extern u16 vlan_dev_vlan_id(const struct net_device *dev);extern int _vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, u16 vlan_tci, int polling);extern bool vlan_hwaccel_do_receive(struct sk_buff *skb);extern gro_result_tvlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, unsigned int vlan_tci, struct sk_buff *skb);extern gro_result_tvlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp, unsigned int vlan_tci);#elsestatic inline struct net_device *vlan_find_dev(struct net_device *real_dev, u16 vlan_id) return NULL;static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev) BUG(); return NULL;static inline u16 vlan_dev_vlan_id(const struct net_device *dev) BUG(); return 0;static inline int _vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, u16 vlan_tci, int polling) BUG(); return NET_XMIT_SUCCESS;static inline bool vlan_hwaccel_do_receive(struct sk_buff *skb) if (*skb)-vlan_tci & VLAN_VID_MASK) (*skb)-pkt_type = PACKET_OTHERHOST; return false;static inline gro_result_tvlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, unsigned int vlan_tci, struct sk_buff *skb) return GRO_DROP;static inline gro_result_tvlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp, unsigned int vlan_tci) return GRO_DROP;#endif/* * vlan_hwaccel_rx - netif_rx wrapper for VLAN RX acceleration * skb: buffer * grp: vlan group * vlan_tci: VLAN TCI as received from the card */static inline int vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, u16 vlan_tci) return _vlan_hwaccel_rx(skb, grp, vlan_tci, 0);/* * vlan_hwaccel_receive_skb - netif_receive_skb wrapper for VLAN RX acceleration * skb: buffer * grp: vlan group * vlan_tci: VLAN TCI as received from the card */static inline int vlan_hwaccel_receive_skb(struct sk_buff *skb, struct vlan_group *grp, u16 vlan_tci) return _vlan_hwaccel_rx(skb, grp, vlan_tci, 1);/* * _vlan_put_tag - regular VLAN tag inserting * skb: skbuff to tag * vlan_tci: VLAN TCI to insert * * Inserts the VLAN tag into skb as part of the payload * Returns a VLAN tagged skb. If a new skb is created, skb is freed. * * Following the skb_unshare() example, in case of error, the calling function * doesnt have to worry about freeing the original skb. */static inline struct sk_buff *_vlan_put_tag(struct sk_buff *skb, u16 vlan_tci) struct vlan_ethhdr *veth; if (skb_cow_head(skb, VLAN_HLEN) data, skb-data + VLAN_HLEN, 2 * VLAN_ETH_ALEN); skb-mac_header -= VLAN_HLEN; /* first, the ethernet type */ veth-h_vlan_proto = htons(ETH_P_8021Q); /* now, the TCI */ veth-h_vlan_TCI = htons(vlan_tci); skb-protocol = htons(ETH_P_8021Q); return skb;/* * _vlan_hwaccel_put_tag - hardware accelerated VLAN inserting * skb: skbuff to tag * vlan_tci: VLAN TCI to insert * * Puts the VLAN TCI in skb-vlan_tci and lets the device do the rest */static inline struct sk_buff *_vlan_hwaccel_put_tag(struct sk_buff *skb, u16 vlan_tci) skb-vlan_tci = VLAN_TAG_PRESENT | vlan_tci; return skb;#define HAVE_VLAN_PUT_TAG/* * vlan_put_tag - inserts VLAN tag according to device features * skb: skbuff to tag * vlan_tci: VLAN TCI to insert * * Assumes skb-dev is the target that will xmit this frame. * Returns a VLAN tagged skb. */static inline struct sk_buff *vlan_put_tag(struct sk_buff *skb, u16 vlan_tci) if (skb-dev-features & NETIF_F_HW_VLAN_TX) return _vlan_hwaccel_put_tag(skb, vlan_tci); else return _vlan_put_tag(skb, vlan_tci); /* * _vlan_get_tag - get the VLAN ID that is part of the payload * skb: skbuff to query * vlan_tci: buffer to store vlaue * * Returns error if the skb is not of VLAN type */static inline int _vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci) struct vlan_ethhdr *veth = (struct vlan_ethhdr *)skb-data; if (veth-h_vlan_proto != htons(ETH_P_8021Q) return -EINVAL; *vlan_tci = ntohs(veth-h_vlan_TCI); return 0;/* * _vlan_hwaccel_get_tag - get the VLAN ID that is in skb-cb * skb: skbuff to query * vlan_tci: buffer to store vlaue * * Returns error if skb-vlan_tci is not set correctly */static inline int _vlan_hwaccel_get_tag(const struct sk_buff *skb, u16 *vlan_tci) if (vlan_tx_tag_present(skb) *vlan_tci = vlan_tx_tag_get(skb); return 0; else *vlan_tci = 0; return -EINVAL; #define HAVE_VLAN_GET_TAG/* * vlan_get_tag - get the VLAN ID from the skb * skb: skbuff to query * vlan_tci: buffer to store vlaue * * Returns error if the skb is not VLAN tagged */static inline int vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci) if (skb-dev-features & NETIF_F_HW_VLAN_TX) return _vlan_hwaccel_get_tag(skb, vlan_tci); else return _vlan_get_tag(skb, vlan_tci); /* * vlan_get_protocol - get protocol EtherType. * skb: skbuff to query * * Returns the EtherType of the packet, regardless of whether it is * vlan encapsulated (normal or hardware accelerated) or not. */static inline _be16 vlan_get_protocol(const struct sk_buff *skb) _be16 protocol = 0; if (vlan_tx_tag_present(skb) | skb-protocol != cpu_to_be16(ETH_P_8021Q) protocol = skb-protocol; else _be16 proto, *protop; protop = skb_header_pointer(skb, offsetof(struct vlan_ethhdr, h_vlan_encapsulated_proto), sizeof(proto), &proto); if (likely(protop) protocol = *protop; return protocol;#endif /* _KERNEL_ */* VLAN IOCTLs are found in sockios.h */* Passed in vlan_ioctl_args structure to determine behaviour. */enum vlan_ioctl_cmds ADD_VLAN_CMD, DEL_VLAN_CMD, SET_VLAN_INGRESS_PRIORITY_CMD, SET_VLAN_EGRESS_PRIORITY_CMD, GET_VLAN_INGRESS_PRIORITY_CMD, GET_VLAN_EGRESS_PRIORITY_CMD, SET_VLAN_NAME_TYPE_CMD, SET_VLAN_FLAG_CMD, GET_VLAN_REALDEV_NAME_CMD, /* If this works, you know its a VLAN device, btw */ GET_VLAN_VID_CMD /* Get the VID of this VLAN (specified by name) */;enum vlan_flags VLAN_FLAG_REORDER_HDR = 0x1, VLAN_FLAG_GVRP = 0x2, VLAN_FLAG_LOOSE_BINDING = 0x4,;enum vlan_name_types VLAN_NAME_TYPE_PLUS_VID, /* Name will look like: vlan0005 */ VLAN_NAME_TYPE_RAW_PLUS_VID, /* name will look like: eth1.0005 */ VLAN_NAME_TYPE_PLUS_VID_NO_PAD, /* Name will look like: vlan5 */ VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD, /* Name will look like: eth0.5 */ VLAN_NAME_TYPE_HIGHEST;struct vlan_ioctl_args int cmd; /* Should be one of the vlan_ioctl_cmds enum above. */ char device124; union char device224; int VID; unsigned int skb_priority; unsigned int name_type; unsigned int bind_type; unsigned int flag; /* Matches vlan_dev_info flags */ u; short vlan_qos; ;#endif /* !(_LINUX_IF_VLAN_H_) */;第3章 主要函數(shù)vlan_proto_init-register_netdevice_notifier(&vlan_notifier_bock) 把vlan_device_event函數(shù)掛接到netdev_chain鏈表上 -dev_add_pack(&vlan_packet_type) -vlan_ioctl_set(vlan_ioctl_handler) 讓vlan_ioctl_hook指向此函數(shù) sock_ioctl-SIOCSIFVLAN/SIOCGIFVLAN-vlan_ioctl_hook(就是函數(shù)vlan_ioctl_handler)-DEL_VLAN_CMD-unregister_vlan_device -ADD_VLAN_CMD-register_vlan_device3.1 vlan_proto_init net8021qvlan.cvlan模塊的初始化vlan_proto_init,注冊vlan網(wǎng)絡(luò)系統(tǒng)子空間。 static int _init vlan_proto_init(void) . err = register_pernet_subsys(&vlan_net_ops); /注冊vlan網(wǎng)絡(luò)系統(tǒng)子空間 . err = register_netdevice_notifier(&vlan_notifier_block); /注冊vlan_notifier_block到netdev_chain中,然后通知事件NETDEV_REGISTER和NETDEV_UP事件到網(wǎng)絡(luò)系統(tǒng)的中的每個(gè)設(shè)備: . err = vlan_gvrp_init(); /初始化gvrp協(xié)議 . err = vlan_netlink_init(); /初始化netlink . dev_add_pack(&vlan_packet_type); /添加協(xié)議模塊vlan_packet_type到ptype_base中 vlan_ioctl_set(vlan_ioctl_handler); /添加ioctl供用戶空間調(diào)用 .3.2 register_pernet_subsys net8021qvlan.cregister_pernet_subsys函數(shù)調(diào)用關(guān)系:register_pernet_subsys()-register_pernet_operations()-ida_get_new_above()而ida_get_new_above的作用如它注釋所描述的。分配一個(gè)新的ID大于等于一個(gè)起始IDida_get_new_above():ida_get_new_above - allocate new ID above or equal to a start id。另外register_pernet_operations()中通過調(diào)用 _register_pernet_operations函數(shù),再通過調(diào)用ops_init(ops, &init_net),調(diào)用會調(diào)用子空間的初始化函數(shù)vlan_init_net(),而vlan_init_net()的作用就是有關(guān)vlan的proc文件系統(tǒng)信息。即register_pernet_operations()的調(diào)用關(guān)系如下:register_pernet_operations()-_register_pernet_operations()-ops_init()-vlan_init_net()3.3 register_netdevice_notifier /net/core/dev.c當(dāng)使用SIOCBRADDBR調(diào)用ioctl時(shí),會通過br_add_bridge函數(shù)創(chuàng)建新的網(wǎng)橋。在這err = register_netdevice_notifier(&vlan_notifier_block); static struct notifier_block vlan_notifier_block _read_mostly = .notifier_call = vlan_device_event, ; 參考/qy532846454/article/details/6529166,分析的很詳細(xì)3.4 dev_add_pack /net/core/dev.cvoid dev_add_pack(struct packet_type *pt) struct list_head *head = ptype_head(pt); spin_lock(&ptype_lock); list_add_rcu(&pt-list, head); spin_unlock(&ptype_lock);static struct packet_type vlan_packet_type _read_mostly = .type = cpu_to_be16(ETH_P_8021Q), .func = vlan_skb_recv, /* VLAN receive method */;參考/qy532846454/article/details/6529166,里面相關(guān)部分很詳細(xì)3.5 vlan_skb_recv /net/core/dev.cint vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *ptype, struct net_device *orig_dev) struct vlan_hdr *vhdr; struct vlan_pcpu_stats *rx_stats; struct net_device *vlan_dev; u16 vlan_id; u16 vlan_tci; skb = skb_share_check(skb, GFP_ATOM
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆葉城縣三上數(shù)學(xué)期末預(yù)測試題含解析
- 知識產(chǎn)權(quán)管理規(guī)范課件
- 2025屆內(nèi)蒙古莫力達(dá)瓦達(dá)斡爾族自治旗鐵堅(jiān)中心校三上數(shù)學(xué)期末達(dá)標(biāo)檢測試題含解析
- 響應(yīng)式Web開發(fā)項(xiàng)目教程(HTML5 CSS3 Bootstrap)(第3版) 課件 第8章 Bootstrap基礎(chǔ)入門
- 軟件界面設(shè)計(jì)分析
- 語言教育的組織與實(shí)施
- 互聯(lián)網(wǎng)教育平臺開發(fā)合作框架合同
- 農(nóng)業(yè)經(jīng)濟(jì)園區(qū)管理協(xié)議
- 股東合作協(xié)議書的和建議
- 農(nóng)業(yè)機(jī)械合作使用及維護(hù)合同
- 血液凈化標(biāo)準(zhǔn)操作規(guī)程 2021 版
- 婚戀平臺合同協(xié)議書
- 保護(hù)患者隱私權(quán)醫(yī)療AI技術(shù)的倫理要求與實(shí)踐
- 權(quán)益配置與代理關(guān)系的成本效益分析
- 2025年貴州省貴陽市云巖區(qū)中考模擬語文檢測試題(含答案)
- 空地或鋪面出租合同協(xié)議
- 2025餐飲轉(zhuǎn)讓合同協(xié)議書 餐飲轉(zhuǎn)讓合同協(xié)議書范本
- 新課標(biāo)(水平三)體育與健康《籃球》大單元教學(xué)計(jì)劃及配套教案(18課時(shí))
- DL∕T 5210.6-2019 電力建設(shè)施工質(zhì)量驗(yàn)收規(guī)程 第6部分:調(diào)整試驗(yàn)
- (完整版)培訓(xùn)學(xué)校電話話術(shù)(初中)
- 大貓英語分級閱讀 二級2 Let's go shopping 課件
評論
0/150
提交評論