Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

+1010 -735
+19 -13
drivers/connector/cn_queue.c
··· 31 #include <linux/connector.h> 32 #include <linux/delay.h> 33 34 - static void cn_queue_wrapper(void *data) 35 { 36 - struct cn_callback_entry *cbq = data; 37 38 - cbq->cb->callback(cbq->cb->priv); 39 - cbq->destruct_data(cbq->ddata); 40 - cbq->ddata = NULL; 41 } 42 43 - static struct cn_callback_entry *cn_queue_alloc_callback_entry(struct cn_callback *cb) 44 { 45 struct cn_callback_entry *cbq; 46 ··· 53 return NULL; 54 } 55 56 - cbq->cb = cb; 57 - INIT_WORK(&cbq->work, &cn_queue_wrapper, cbq); 58 return cbq; 59 } 60 ··· 74 return ((i1->idx == i2->idx) && (i1->val == i2->val)); 75 } 76 77 - int cn_queue_add_callback(struct cn_queue_dev *dev, struct cn_callback *cb) 78 { 79 struct cn_callback_entry *cbq, *__cbq; 80 int found = 0; 81 82 - cbq = cn_queue_alloc_callback_entry(cb); 83 if (!cbq) 84 return -ENOMEM; 85 ··· 88 89 spin_lock_bh(&dev->queue_lock); 90 list_for_each_entry(__cbq, &dev->queue_list, callback_entry) { 91 - if (cn_cb_equal(&__cbq->cb->id, &cb->id)) { 92 found = 1; 93 break; 94 } ··· 105 106 cbq->nls = dev->nls; 107 cbq->seq = 0; 108 - cbq->group = cbq->cb->id.idx; 109 110 return 0; 111 } ··· 117 118 spin_lock_bh(&dev->queue_lock); 119 list_for_each_entry_safe(cbq, n, &dev->queue_list, callback_entry) { 120 - if (cn_cb_equal(&cbq->cb->id, id)) { 121 list_del(&cbq->callback_entry); 122 found = 1; 123 break;
··· 31 #include <linux/connector.h> 32 #include <linux/delay.h> 33 34 + void cn_queue_wrapper(void *data) 35 { 36 + struct cn_callback_data *d = data; 37 38 + d->callback(d->callback_priv); 39 + 40 + d->destruct_data(d->ddata); 41 + d->ddata = NULL; 42 + 43 + kfree(d->free); 44 } 45 46 + static struct cn_callback_entry *cn_queue_alloc_callback_entry(char *name, struct cb_id *id, void (*callback)(void *)) 47 { 48 struct cn_callback_entry *cbq; 49 ··· 50 return NULL; 51 } 52 53 + snprintf(cbq->id.name, sizeof(cbq->id.name), "%s", name); 54 + memcpy(&cbq->id.id, id, sizeof(struct cb_id)); 55 + cbq->data.callback = callback; 56 + 57 + INIT_WORK(&cbq->work, &cn_queue_wrapper, &cbq->data); 58 return cbq; 59 } 60 ··· 68 return ((i1->idx == i2->idx) && (i1->val == i2->val)); 69 } 70 71 + int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(void *)) 72 { 73 struct cn_callback_entry *cbq, *__cbq; 74 int found = 0; 75 76 + cbq = cn_queue_alloc_callback_entry(name, id, callback); 77 if (!cbq) 78 return -ENOMEM; 79 ··· 82 83 spin_lock_bh(&dev->queue_lock); 84 list_for_each_entry(__cbq, &dev->queue_list, callback_entry) { 85 + if (cn_cb_equal(&__cbq->id.id, id)) { 86 found = 1; 87 break; 88 } ··· 99 100 cbq->nls = dev->nls; 101 cbq->seq = 0; 102 + cbq->group = cbq->id.id.idx; 103 104 return 0; 105 } ··· 111 112 spin_lock_bh(&dev->queue_lock); 113 list_for_each_entry_safe(cbq, n, &dev->queue_list, callback_entry) { 114 + if (cn_cb_equal(&cbq->id.id, id)) { 115 list_del(&cbq->callback_entry); 116 found = 1; 117 break;
+38 -36
drivers/connector/connector.c
··· 84 spin_lock_bh(&dev->cbdev->queue_lock); 85 list_for_each_entry(__cbq, &dev->cbdev->queue_list, 86 callback_entry) { 87 - if (cn_cb_equal(&__cbq->cb->id, &msg->id)) { 88 found = 1; 89 group = __cbq->group; 90 } ··· 127 { 128 struct cn_callback_entry *__cbq; 129 struct cn_dev *dev = &cdev; 130 - int found = 0; 131 132 spin_lock_bh(&dev->cbdev->queue_lock); 133 list_for_each_entry(__cbq, &dev->cbdev->queue_list, callback_entry) { 134 - if (cn_cb_equal(&__cbq->cb->id, &msg->id)) { 135 - /* 136 - * Let's scream if there is some magic and the 137 - * data will arrive asynchronously here. 138 - * [i.e. netlink messages will be queued]. 139 - * After the first warning I will fix it 140 - * quickly, but now I think it is 141 - * impossible. --zbr (2004_04_27). 142 - */ 143 if (likely(!test_bit(0, &__cbq->work.pending) && 144 - __cbq->ddata == NULL)) { 145 - __cbq->cb->priv = msg; 146 147 - __cbq->ddata = data; 148 - __cbq->destruct_data = destruct_data; 149 150 if (queue_work(dev->cbdev->cn_queue, 151 &__cbq->work)) 152 - found = 1; 153 } else { 154 - printk("%s: cbq->data=%p, " 155 - "work->pending=%08lx.\n", 156 - __func__, __cbq->ddata, 157 - __cbq->work.pending); 158 - WARN_ON(1); 159 } 160 break; 161 } 162 } 163 spin_unlock_bh(&dev->cbdev->queue_lock); 164 165 - return found ? 0 : -ENODEV; 166 } 167 168 /* ··· 305 { 306 int err; 307 struct cn_dev *dev = &cdev; 308 - struct cn_callback *cb; 309 310 - cb = kzalloc(sizeof(*cb), GFP_KERNEL); 311 - if (!cb) 312 - return -ENOMEM; 313 - 314 - scnprintf(cb->name, sizeof(cb->name), "%s", name); 315 - 316 - memcpy(&cb->id, id, sizeof(cb->id)); 317 - cb->callback = callback; 318 - 319 - err = cn_queue_add_callback(dev->cbdev, cb); 320 - if (err) { 321 - kfree(cb); 322 return err; 323 - } 324 325 cn_notify(id, 0); 326
··· 84 spin_lock_bh(&dev->cbdev->queue_lock); 85 list_for_each_entry(__cbq, &dev->cbdev->queue_list, 86 callback_entry) { 87 + if (cn_cb_equal(&__cbq->id.id, &msg->id)) { 88 found = 1; 89 group = __cbq->group; 90 } ··· 127 { 128 struct cn_callback_entry *__cbq; 129 struct cn_dev *dev = &cdev; 130 + int err = -ENODEV; 131 132 spin_lock_bh(&dev->cbdev->queue_lock); 133 list_for_each_entry(__cbq, &dev->cbdev->queue_list, callback_entry) { 134 + if (cn_cb_equal(&__cbq->id.id, &msg->id)) { 135 if (likely(!test_bit(0, &__cbq->work.pending) && 136 + __cbq->data.ddata == NULL)) { 137 + __cbq->data.callback_priv = msg; 138 139 + __cbq->data.ddata = data; 140 + __cbq->data.destruct_data = destruct_data; 141 142 if (queue_work(dev->cbdev->cn_queue, 143 &__cbq->work)) 144 + err = 0; 145 } else { 146 + struct work_struct *w; 147 + struct cn_callback_data *d; 148 + 149 + w = kzalloc(sizeof(*w) + sizeof(*d), GFP_ATOMIC); 150 + if (w) { 151 + d = (struct cn_callback_data *)(w+1); 152 + 153 + d->callback_priv = msg; 154 + d->callback = __cbq->data.callback; 155 + d->ddata = data; 156 + d->destruct_data = destruct_data; 157 + d->free = w; 158 + 159 + INIT_LIST_HEAD(&w->entry); 160 + w->pending = 0; 161 + w->func = &cn_queue_wrapper; 162 + w->data = d; 163 + init_timer(&w->timer); 164 + 165 + if (queue_work(dev->cbdev->cn_queue, w)) 166 + err = 0; 167 + else { 168 + kfree(w); 169 + err = -EINVAL; 170 + } 171 + } else 172 + err = -ENOMEM; 173 } 174 break; 175 } 176 } 177 spin_unlock_bh(&dev->cbdev->queue_lock); 178 179 + return err; 180 } 181 182 /* ··· 291 { 292 int err; 293 struct cn_dev *dev = &cdev; 294 295 + err = cn_queue_add_callback(dev->cbdev, name, id, callback); 296 + if (err) 297 return err; 298 299 cn_notify(id, 0); 300
+15 -6
include/linux/connector.h
··· 104 struct sock *nls; 105 }; 106 107 - struct cn_callback { 108 unsigned char name[CN_CBQ_NAMELEN]; 109 - 110 struct cb_id id; 111 void (*callback) (void *); 112 - void *priv; 113 }; 114 115 struct cn_callback_entry { ··· 125 struct work_struct work; 126 struct cn_queue_dev *pdev; 127 128 - void (*destruct_data) (void *); 129 - void *ddata; 130 131 int seq, group; 132 struct sock *nls; ··· 151 void cn_del_callback(struct cb_id *); 152 int cn_netlink_send(struct cn_msg *, u32, int); 153 154 - int cn_queue_add_callback(struct cn_queue_dev *dev, struct cn_callback *cb); 155 void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id); 156 157 struct cn_queue_dev *cn_queue_alloc_dev(char *name, struct sock *); 158 void cn_queue_free_dev(struct cn_queue_dev *dev); 159 160 int cn_cb_equal(struct cb_id *, struct cb_id *); 161 162 extern int cn_already_initialized; 163
··· 104 struct sock *nls; 105 }; 106 107 + struct cn_callback_id { 108 unsigned char name[CN_CBQ_NAMELEN]; 109 struct cb_id id; 110 + }; 111 + 112 + struct cn_callback_data { 113 + void (*destruct_data) (void *); 114 + void *ddata; 115 + 116 + void *callback_priv; 117 void (*callback) (void *); 118 + 119 + void *free; 120 }; 121 122 struct cn_callback_entry { ··· 118 struct work_struct work; 119 struct cn_queue_dev *pdev; 120 121 + struct cn_callback_id id; 122 + struct cn_callback_data data; 123 124 int seq, group; 125 struct sock *nls; ··· 144 void cn_del_callback(struct cb_id *); 145 int cn_netlink_send(struct cn_msg *, u32, int); 146 147 + int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(void *)); 148 void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id); 149 150 struct cn_queue_dev *cn_queue_alloc_dev(char *name, struct sock *); 151 void cn_queue_free_dev(struct cn_queue_dev *dev); 152 153 int cn_cb_equal(struct cb_id *, struct cb_id *); 154 + 155 + void cn_queue_wrapper(void *data); 156 157 extern int cn_already_initialized; 158
+5 -7
include/linux/netfilter_ipv4/ip_nat_core.h
··· 5 6 /* This header used to share core functionality between the standalone 7 NAT module, and the compatibility layer's use of NAT for masquerading. */ 8 - extern int ip_nat_init(void); 9 - extern void ip_nat_cleanup(void); 10 11 - extern unsigned int nat_packet(struct ip_conntrack *ct, 12 enum ip_conntrack_info conntrackinfo, 13 unsigned int hooknum, 14 struct sk_buff **pskb); 15 16 - extern int icmp_reply_translation(struct sk_buff **pskb, 17 - struct ip_conntrack *ct, 18 - enum ip_nat_manip_type manip, 19 - enum ip_conntrack_dir dir); 20 #endif /* _IP_NAT_CORE_H */
··· 5 6 /* This header used to share core functionality between the standalone 7 NAT module, and the compatibility layer's use of NAT for masquerading. */ 8 9 + extern unsigned int ip_nat_packet(struct ip_conntrack *ct, 10 enum ip_conntrack_info conntrackinfo, 11 unsigned int hooknum, 12 struct sk_buff **pskb); 13 14 + extern int ip_nat_icmp_reply_translation(struct sk_buff **pskb, 15 + struct ip_conntrack *ct, 16 + enum ip_nat_manip_type manip, 17 + enum ip_conntrack_dir dir); 18 #endif /* _IP_NAT_CORE_H */
+25 -1
include/linux/sysctl.h
··· 202 NET_TR=14, 203 NET_DECNET=15, 204 NET_ECONET=16, 205 - NET_SCTP=17, 206 }; 207 208 /* /proc/sys/kernel/random */ ··· 523 NET_IPX_FORWARDING=2 524 }; 525 526 527 /* /proc/sys/net/appletalk */ 528 enum {
··· 202 NET_TR=14, 203 NET_DECNET=15, 204 NET_ECONET=16, 205 + NET_SCTP=17, 206 + NET_LLC=18, 207 }; 208 209 /* /proc/sys/kernel/random */ ··· 522 NET_IPX_FORWARDING=2 523 }; 524 525 + /* /proc/sys/net/llc */ 526 + enum { 527 + NET_LLC2=1, 528 + NET_LLC_STATION=2, 529 + }; 530 + 531 + /* /proc/sys/net/llc/llc2 */ 532 + enum { 533 + NET_LLC2_TIMEOUT=1, 534 + }; 535 + 536 + /* /proc/sys/net/llc/station */ 537 + enum { 538 + NET_LLC_STATION_ACK_TIMEOUT=1, 539 + }; 540 + 541 + /* /proc/sys/net/llc/llc2/timeout */ 542 + enum { 543 + NET_LLC2_ACK_TIMEOUT=1, 544 + NET_LLC2_P_TIMEOUT=2, 545 + NET_LLC2_REJ_TIMEOUT=3, 546 + NET_LLC2_BUSY_TIMEOUT=4, 547 + }; 548 549 /* /proc/sys/net/appletalk */ 550 enum {
+30
include/net/llc.h
··· 17 #include <linux/list.h> 18 #include <linux/spinlock.h> 19 20 struct net_device; 21 struct packet_type; 22 struct sk_buff; ··· 46 unsigned char state; 47 unsigned char p_bit; 48 unsigned char f_bit; 49 int (*rcv_func)(struct sk_buff *skb, 50 struct net_device *dev, 51 struct packet_type *pt, ··· 84 struct net_device *dev, 85 struct packet_type *pt, 86 struct net_device *orig_dev)); 87 extern void llc_sap_close(struct llc_sap *sap); 88 89 extern struct llc_sap *llc_sap_find(unsigned char sap_value); 90 91 extern int llc_build_and_send_ui_pkt(struct llc_sap *sap, struct sk_buff *skb, 92 unsigned char *dmac, unsigned char dsap); 93 94 extern int llc_station_init(void); 95 extern void llc_station_exit(void); ··· 115 #define llc_proc_init() (0) 116 #define llc_proc_exit() do { } while(0) 117 #endif /* CONFIG_PROC_FS */ 118 #endif /* LLC_H */
··· 17 #include <linux/list.h> 18 #include <linux/spinlock.h> 19 20 + #include <asm/atomic.h> 21 + 22 struct net_device; 23 struct packet_type; 24 struct sk_buff; ··· 44 unsigned char state; 45 unsigned char p_bit; 46 unsigned char f_bit; 47 + atomic_t refcnt; 48 int (*rcv_func)(struct sk_buff *skb, 49 struct net_device *dev, 50 struct packet_type *pt, ··· 81 struct net_device *dev, 82 struct packet_type *pt, 83 struct net_device *orig_dev)); 84 + static inline void llc_sap_hold(struct llc_sap *sap) 85 + { 86 + atomic_inc(&sap->refcnt); 87 + } 88 + 89 extern void llc_sap_close(struct llc_sap *sap); 90 + 91 + static inline void llc_sap_put(struct llc_sap *sap) 92 + { 93 + if (atomic_dec_and_test(&sap->refcnt)) 94 + llc_sap_close(sap); 95 + } 96 97 extern struct llc_sap *llc_sap_find(unsigned char sap_value); 98 99 extern int llc_build_and_send_ui_pkt(struct llc_sap *sap, struct sk_buff *skb, 100 unsigned char *dmac, unsigned char dsap); 101 + 102 + extern void llc_sap_handler(struct llc_sap *sap, struct sk_buff *skb); 103 + extern void llc_conn_handler(struct llc_sap *sap, struct sk_buff *skb); 104 105 extern int llc_station_init(void); 106 extern void llc_station_exit(void); ··· 98 #define llc_proc_init() (0) 99 #define llc_proc_exit() do { } while(0) 100 #endif /* CONFIG_PROC_FS */ 101 + #ifdef CONFIG_SYSCTL 102 + extern int llc_sysctl_init(void); 103 + extern void llc_sysctl_exit(void); 104 + 105 + extern int sysctl_llc2_ack_timeout; 106 + extern int sysctl_llc2_busy_timeout; 107 + extern int sysctl_llc2_p_timeout; 108 + extern int sysctl_llc2_rej_timeout; 109 + extern int sysctl_llc_station_ack_timeout; 110 + #else 111 + #define llc_sysctl_init() (0) 112 + #define llc_sysctl_exit() do { } while(0) 113 + #endif /* CONFIG_SYSCTL */ 114 #endif /* LLC_H */
+8 -7
include/net/llc_conn.h
··· 19 #define LLC_EVENT 1 20 #define LLC_PACKET 2 21 22 - #define LLC_P_TIME 2 23 - #define LLC_ACK_TIME 1 24 - #define LLC_REJ_TIME 3 25 - #define LLC_BUSY_TIME 3 26 27 struct llc_timer { 28 struct timer_list timer; 29 - u16 expire; /* timer expire time */ 30 }; 31 32 struct llc_sock { ··· 38 struct llc_addr laddr; /* lsap/mac pair */ 39 struct llc_addr daddr; /* dsap/mac pair */ 40 struct net_device *dev; /* device to send to remote */ 41 u8 retry_count; /* number of retries */ 42 u8 ack_must_be_send; 43 u8 first_pdu_Ns; ··· 93 return skb->cb[sizeof(skb->cb) - 1]; 94 } 95 96 - extern struct sock *llc_sk_alloc(int family, int priority, struct proto *prot); 97 extern void llc_sk_free(struct sock *sk); 98 99 extern void llc_sk_reset(struct sock *sk); ··· 117 118 extern u8 llc_data_accept_state(u8 state); 119 extern void llc_build_offset_table(void); 120 - extern int llc_release_sockets(struct llc_sap *sap); 121 #endif /* LLC_CONN_H */
··· 19 #define LLC_EVENT 1 20 #define LLC_PACKET 2 21 22 + #define LLC2_P_TIME 2 23 + #define LLC2_ACK_TIME 1 24 + #define LLC2_REJ_TIME 3 25 + #define LLC2_BUSY_TIME 3 26 27 struct llc_timer { 28 struct timer_list timer; 29 + unsigned long expire; /* timer expire time */ 30 }; 31 32 struct llc_sock { ··· 38 struct llc_addr laddr; /* lsap/mac pair */ 39 struct llc_addr daddr; /* dsap/mac pair */ 40 struct net_device *dev; /* device to send to remote */ 41 + u32 copied_seq; /* head of yet unread data */ 42 u8 retry_count; /* number of retries */ 43 u8 ack_must_be_send; 44 u8 first_pdu_Ns; ··· 92 return skb->cb[sizeof(skb->cb) - 1]; 93 } 94 95 + extern struct sock *llc_sk_alloc(int family, unsigned int __nocast priority, 96 + struct proto *prot); 97 extern void llc_sk_free(struct sock *sk); 98 99 extern void llc_sk_reset(struct sock *sk); ··· 115 116 extern u8 llc_data_accept_state(u8 state); 117 extern void llc_build_offset_table(void); 118 #endif /* LLC_CONN_H */
+6 -2
include/net/llc_sap.h
··· 12 * See the GNU General Public License for more details. 13 */ 14 struct llc_sap; 15 struct sk_buff; 16 17 extern void llc_sap_rtn_pdu(struct llc_sap *sap, struct sk_buff *skb); 18 - extern void llc_save_primitive(struct sk_buff* skb, unsigned char prim); 19 - extern struct sk_buff *llc_alloc_frame(void); 20 21 extern void llc_build_and_send_test_pkt(struct llc_sap *sap, 22 struct sk_buff *skb,
··· 12 * See the GNU General Public License for more details. 13 */ 14 struct llc_sap; 15 + struct net_device; 16 struct sk_buff; 17 + struct sock; 18 19 extern void llc_sap_rtn_pdu(struct llc_sap *sap, struct sk_buff *skb); 20 + extern void llc_save_primitive(struct sock *sk, struct sk_buff* skb, 21 + unsigned char prim); 22 + extern struct sk_buff *llc_alloc_frame(struct sock *sk, 23 + struct net_device *dev); 24 25 extern void llc_build_and_send_test_pkt(struct llc_sap *sap, 26 struct sk_buff *skb,
+1 -1
net/802/p8022.c
··· 56 57 void unregister_8022_client(struct datalink_proto *proto) 58 { 59 - llc_sap_close(proto->sap); 60 kfree(proto); 61 } 62
··· 56 57 void unregister_8022_client(struct datalink_proto *proto) 58 { 59 + llc_sap_put(proto->sap); 60 kfree(proto); 61 } 62
+1 -1
net/802/psnap.c
··· 106 107 static void __exit snap_exit(void) 108 { 109 - llc_sap_close(snap_sap); 110 } 111 112 module_exit(snap_exit);
··· 106 107 static void __exit snap_exit(void) 108 { 109 + llc_sap_put(snap_sap); 110 } 111 112 module_exit(snap_exit);
+1 -1
net/802/tr.c
··· 238 return trllc->ethertype; 239 } 240 241 - return ntohs(ETH_P_802_2); 242 } 243 244 /*
··· 238 return trllc->ethertype; 239 } 240 241 + return ntohs(ETH_P_TR_802_2); 242 } 243 244 /*
+2
net/core/dev.c
··· 574 return dev; 575 } 576 577 struct net_device *dev_getfirstbyhwtype(unsigned short type) 578 { 579 struct net_device *dev;
··· 574 return dev; 575 } 576 577 + EXPORT_SYMBOL(dev_getbyhwaddr); 578 + 579 struct net_device *dev_getfirstbyhwtype(unsigned short type) 580 { 581 struct net_device *dev;
+3 -2
net/ipv4/netfilter/Makefile
··· 4 5 # objects for the standalone - connection tracking / NAT 6 ip_conntrack-objs := ip_conntrack_standalone.o ip_conntrack_core.o ip_conntrack_proto_generic.o ip_conntrack_proto_tcp.o ip_conntrack_proto_udp.o ip_conntrack_proto_icmp.o 7 - iptable_nat-objs := ip_nat_standalone.o ip_nat_rule.o ip_nat_core.o ip_nat_helper.o ip_nat_proto_unknown.o ip_nat_proto_tcp.o ip_nat_proto_udp.o ip_nat_proto_icmp.o 8 9 ip_conntrack_pptp-objs := ip_conntrack_helper_pptp.o ip_conntrack_proto_gre.o 10 ip_nat_pptp-objs := ip_nat_helper_pptp.o ip_nat_proto_gre.o ··· 41 # the three instances of ip_tables 42 obj-$(CONFIG_IP_NF_FILTER) += iptable_filter.o 43 obj-$(CONFIG_IP_NF_MANGLE) += iptable_mangle.o 44 - obj-$(CONFIG_IP_NF_NAT) += iptable_nat.o 45 obj-$(CONFIG_IP_NF_RAW) += iptable_raw.o 46 47 # matches
··· 4 5 # objects for the standalone - connection tracking / NAT 6 ip_conntrack-objs := ip_conntrack_standalone.o ip_conntrack_core.o ip_conntrack_proto_generic.o ip_conntrack_proto_tcp.o ip_conntrack_proto_udp.o ip_conntrack_proto_icmp.o 7 + ip_nat-objs := ip_nat_core.o ip_nat_helper.o ip_nat_proto_unknown.o ip_nat_proto_tcp.o ip_nat_proto_udp.o ip_nat_proto_icmp.o 8 + iptable_nat-objs := ip_nat_rule.o ip_nat_standalone.o 9 10 ip_conntrack_pptp-objs := ip_conntrack_helper_pptp.o ip_conntrack_proto_gre.o 11 ip_nat_pptp-objs := ip_nat_helper_pptp.o ip_nat_proto_gre.o ··· 40 # the three instances of ip_tables 41 obj-$(CONFIG_IP_NF_FILTER) += iptable_filter.o 42 obj-$(CONFIG_IP_NF_MANGLE) += iptable_mangle.o 43 + obj-$(CONFIG_IP_NF_NAT) += iptable_nat.o ip_nat.o 44 obj-$(CONFIG_IP_NF_RAW) += iptable_raw.o 45 46 # matches
+24 -11
net/ipv4/netfilter/ip_nat_core.c
··· 74 75 return p; 76 } 77 78 void 79 ip_nat_proto_put(struct ip_nat_protocol *p) 80 { 81 module_put(p->me); 82 } 83 84 /* We keep an extra hash for each conntrack, for fast searching. */ 85 static inline unsigned int ··· 113 return csum_fold(csum_partial((char *)diffs, sizeof(diffs), 114 oldcheck^0xFFFF)); 115 } 116 117 /* Is this tuple already taken? (not by us) */ 118 int ··· 130 invert_tuplepr(&reply, tuple); 131 return ip_conntrack_tuple_taken(&reply, ignored_conntrack); 132 } 133 134 /* If we source map this tuple so reply looks like reply_tuple, will 135 * that meet the constraints of range. */ ··· 351 352 return NF_ACCEPT; 353 } 354 355 /* Returns true if succeeded. */ 356 static int ··· 392 } 393 394 /* Do packet manipulations according to ip_nat_setup_info. */ 395 - unsigned int nat_packet(struct ip_conntrack *ct, 396 - enum ip_conntrack_info ctinfo, 397 - unsigned int hooknum, 398 - struct sk_buff **pskb) 399 { 400 enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo); 401 unsigned long statusbit; ··· 422 } 423 return NF_ACCEPT; 424 } 425 426 /* Dir is direction ICMP is coming from (opposite to packet it contains) */ 427 - int icmp_reply_translation(struct sk_buff **pskb, 428 - struct ip_conntrack *ct, 429 - enum ip_nat_manip_type manip, 430 - enum ip_conntrack_dir dir) 431 { 432 struct { 433 struct icmphdr icmp; ··· 515 516 return 1; 517 } 518 519 /* Protocol registration. */ 520 int ip_nat_protocol_register(struct ip_nat_protocol *proto) ··· 532 write_unlock_bh(&ip_nat_lock); 533 return ret; 534 } 535 536 /* Noone stores the protocol anywhere; simply delete it. */ 537 void ip_nat_protocol_unregister(struct ip_nat_protocol *proto) ··· 544 /* Someone could be still looking at the proto in a bh. */ 545 synchronize_net(); 546 } 547 548 #if defined(CONFIG_IP_NF_CONNTRACK_NETLINK) || \ 549 defined(CONFIG_IP_NF_CONNTRACK_NETLINK_MODULE) ··· 591 EXPORT_SYMBOL_GPL(ip_nat_port_range_to_nfattr); 592 #endif 593 594 - int __init ip_nat_init(void) 595 { 596 size_t i; 597 ··· 633 return 0; 634 } 635 636 - /* Not __exit: called from ip_nat_standalone.c:init_or_cleanup() --RR */ 637 - void ip_nat_cleanup(void) 638 { 639 ip_ct_iterate_cleanup(&clean_nat, NULL); 640 ip_conntrack_destroyed = NULL; 641 vfree(bysource); 642 }
··· 74 75 return p; 76 } 77 + EXPORT_SYMBOL_GPL(ip_nat_proto_find_get); 78 79 void 80 ip_nat_proto_put(struct ip_nat_protocol *p) 81 { 82 module_put(p->me); 83 } 84 + EXPORT_SYMBOL_GPL(ip_nat_proto_put); 85 86 /* We keep an extra hash for each conntrack, for fast searching. */ 87 static inline unsigned int ··· 111 return csum_fold(csum_partial((char *)diffs, sizeof(diffs), 112 oldcheck^0xFFFF)); 113 } 114 + EXPORT_SYMBOL(ip_nat_cheat_check); 115 116 /* Is this tuple already taken? (not by us) */ 117 int ··· 127 invert_tuplepr(&reply, tuple); 128 return ip_conntrack_tuple_taken(&reply, ignored_conntrack); 129 } 130 + EXPORT_SYMBOL(ip_nat_used_tuple); 131 132 /* If we source map this tuple so reply looks like reply_tuple, will 133 * that meet the constraints of range. */ ··· 347 348 return NF_ACCEPT; 349 } 350 + EXPORT_SYMBOL(ip_nat_setup_info); 351 352 /* Returns true if succeeded. */ 353 static int ··· 387 } 388 389 /* Do packet manipulations according to ip_nat_setup_info. */ 390 + unsigned int ip_nat_packet(struct ip_conntrack *ct, 391 + enum ip_conntrack_info ctinfo, 392 + unsigned int hooknum, 393 + struct sk_buff **pskb) 394 { 395 enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo); 396 unsigned long statusbit; ··· 417 } 418 return NF_ACCEPT; 419 } 420 + EXPORT_SYMBOL_GPL(ip_nat_packet); 421 422 /* Dir is direction ICMP is coming from (opposite to packet it contains) */ 423 + int ip_nat_icmp_reply_translation(struct sk_buff **pskb, 424 + struct ip_conntrack *ct, 425 + enum ip_nat_manip_type manip, 426 + enum ip_conntrack_dir dir) 427 { 428 struct { 429 struct icmphdr icmp; ··· 509 510 return 1; 511 } 512 + EXPORT_SYMBOL_GPL(ip_nat_icmp_reply_translation); 513 514 /* Protocol registration. */ 515 int ip_nat_protocol_register(struct ip_nat_protocol *proto) ··· 525 write_unlock_bh(&ip_nat_lock); 526 return ret; 527 } 528 + EXPORT_SYMBOL(ip_nat_protocol_register); 529 530 /* Noone stores the protocol anywhere; simply delete it. */ 531 void ip_nat_protocol_unregister(struct ip_nat_protocol *proto) ··· 536 /* Someone could be still looking at the proto in a bh. */ 537 synchronize_net(); 538 } 539 + EXPORT_SYMBOL(ip_nat_protocol_unregister); 540 541 #if defined(CONFIG_IP_NF_CONNTRACK_NETLINK) || \ 542 defined(CONFIG_IP_NF_CONNTRACK_NETLINK_MODULE) ··· 582 EXPORT_SYMBOL_GPL(ip_nat_port_range_to_nfattr); 583 #endif 584 585 + static int __init ip_nat_init(void) 586 { 587 size_t i; 588 ··· 624 return 0; 625 } 626 627 + static void __exit ip_nat_cleanup(void) 628 { 629 ip_ct_iterate_cleanup(&clean_nat, NULL); 630 ip_conntrack_destroyed = NULL; 631 vfree(bysource); 632 } 633 + 634 + MODULE_LICENSE("GPL"); 635 + 636 + module_init(ip_nat_init); 637 + module_exit(ip_nat_cleanup);
+4
net/ipv4/netfilter/ip_nat_helper.c
··· 199 } 200 return 1; 201 } 202 203 /* Generic function for mangling variable-length address changes inside 204 * NATed UDP connections (like the CONNECT DATA XXXXX MESG XXXXX INDEX XXXXX ··· 257 258 return 1; 259 } 260 261 /* Adjust one found SACK option including checksum correction */ 262 static void ··· 401 402 return 1; 403 } 404 405 /* Setup NAT on this expected conntrack so it follows master. */ 406 /* If we fail to get a free NAT slot, we'll get dropped on confirm */ ··· 428 /* hook doesn't matter, but it has to do destination manip */ 429 ip_nat_setup_info(ct, &range, NF_IP_PRE_ROUTING); 430 }
··· 199 } 200 return 1; 201 } 202 + EXPORT_SYMBOL(ip_nat_mangle_tcp_packet); 203 204 /* Generic function for mangling variable-length address changes inside 205 * NATed UDP connections (like the CONNECT DATA XXXXX MESG XXXXX INDEX XXXXX ··· 256 257 return 1; 258 } 259 + EXPORT_SYMBOL(ip_nat_mangle_udp_packet); 260 261 /* Adjust one found SACK option including checksum correction */ 262 static void ··· 399 400 return 1; 401 } 402 + EXPORT_SYMBOL(ip_nat_seq_adjust); 403 404 /* Setup NAT on this expected conntrack so it follows master. */ 405 /* If we fail to get a free NAT slot, we'll get dropped on confirm */ ··· 425 /* hook doesn't matter, but it has to do destination manip */ 426 ip_nat_setup_info(ct, &range, NF_IP_PRE_ROUTING); 427 } 428 + EXPORT_SYMBOL(ip_nat_follow_master);
+4 -21
net/ipv4/netfilter/ip_nat_standalone.c
··· 108 case IP_CT_RELATED: 109 case IP_CT_RELATED+IP_CT_IS_REPLY: 110 if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP) { 111 - if (!icmp_reply_translation(pskb, ct, maniptype, 112 - CTINFO2DIR(ctinfo))) 113 return NF_DROP; 114 else 115 return NF_ACCEPT; ··· 152 } 153 154 IP_NF_ASSERT(info); 155 - return nat_packet(ct, ctinfo, hooknum, pskb); 156 } 157 158 static unsigned int ··· 325 printk("ip_nat_init: can't setup rules.\n"); 326 goto cleanup_nothing; 327 } 328 - ret = ip_nat_init(); 329 - if (ret < 0) { 330 - printk("ip_nat_init: can't setup rules.\n"); 331 - goto cleanup_rule_init; 332 - } 333 ret = nf_register_hook(&ip_nat_in_ops); 334 if (ret < 0) { 335 printk("ip_nat_init: can't register in hook.\n"); 336 - goto cleanup_nat; 337 } 338 ret = nf_register_hook(&ip_nat_out_ops); 339 if (ret < 0) { ··· 369 nf_unregister_hook(&ip_nat_out_ops); 370 cleanup_inops: 371 nf_unregister_hook(&ip_nat_in_ops); 372 - cleanup_nat: 373 - ip_nat_cleanup(); 374 cleanup_rule_init: 375 ip_nat_rule_cleanup(); 376 cleanup_nothing: ··· 388 module_init(init); 389 module_exit(fini); 390 391 - EXPORT_SYMBOL(ip_nat_setup_info); 392 - EXPORT_SYMBOL(ip_nat_protocol_register); 393 - EXPORT_SYMBOL(ip_nat_protocol_unregister); 394 - EXPORT_SYMBOL_GPL(ip_nat_proto_find_get); 395 - EXPORT_SYMBOL_GPL(ip_nat_proto_put); 396 - EXPORT_SYMBOL(ip_nat_cheat_check); 397 - EXPORT_SYMBOL(ip_nat_mangle_tcp_packet); 398 - EXPORT_SYMBOL(ip_nat_mangle_udp_packet); 399 - EXPORT_SYMBOL(ip_nat_used_tuple); 400 - EXPORT_SYMBOL(ip_nat_follow_master); 401 MODULE_LICENSE("GPL");
··· 108 case IP_CT_RELATED: 109 case IP_CT_RELATED+IP_CT_IS_REPLY: 110 if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP) { 111 + if (!ip_nat_icmp_reply_translation(pskb, ct, maniptype, 112 + CTINFO2DIR(ctinfo))) 113 return NF_DROP; 114 else 115 return NF_ACCEPT; ··· 152 } 153 154 IP_NF_ASSERT(info); 155 + return ip_nat_packet(ct, ctinfo, hooknum, pskb); 156 } 157 158 static unsigned int ··· 325 printk("ip_nat_init: can't setup rules.\n"); 326 goto cleanup_nothing; 327 } 328 ret = nf_register_hook(&ip_nat_in_ops); 329 if (ret < 0) { 330 printk("ip_nat_init: can't register in hook.\n"); 331 + goto cleanup_rule_init; 332 } 333 ret = nf_register_hook(&ip_nat_out_ops); 334 if (ret < 0) { ··· 374 nf_unregister_hook(&ip_nat_out_ops); 375 cleanup_inops: 376 nf_unregister_hook(&ip_nat_in_ops); 377 cleanup_rule_init: 378 ip_nat_rule_cleanup(); 379 cleanup_nothing: ··· 395 module_init(init); 396 module_exit(fini); 397 398 MODULE_LICENSE("GPL");
+2
net/ipv6/addrconf.c
··· 3520 if (err) 3521 return err; 3522 3523 register_netdevice_notifier(&ipv6_dev_notf); 3524 3525 #ifdef CONFIG_IPV6_PRIVACY
··· 3520 if (err) 3521 return err; 3522 3523 + ip6_null_entry.rt6i_idev = in6_dev_get(&loopback_dev); 3524 + 3525 register_netdevice_notifier(&ipv6_dev_notf); 3526 3527 #ifdef CONFIG_IPV6_PRIVACY
+1
net/llc/Makefile
··· 22 llc_sap.o llc_s_ac.o llc_s_ev.o llc_s_st.o af_llc.o llc_station.o 23 24 llc2-$(CONFIG_PROC_FS) += llc_proc.o
··· 22 llc_sap.o llc_s_ac.o llc_s_ev.o llc_s_st.o af_llc.o llc_station.o 23 24 llc2-$(CONFIG_PROC_FS) += llc_proc.o 25 + llc2-$(CONFIG_SYSCTL) += sysctl_net_llc.o
+319 -216
net/llc/af_llc.c
··· 21 * See the GNU General Public License for more details. 22 */ 23 #include <linux/config.h> 24 #include <linux/kernel.h> 25 #include <linux/module.h> 26 #include <linux/rtnetlink.h> ··· 38 static struct sockaddr_llc llc_ui_addrnull; 39 static struct proto_ops llc_ui_ops; 40 41 - static int llc_ui_wait_for_conn(struct sock *sk, int timeout); 42 - static int llc_ui_wait_for_disc(struct sock *sk, int timeout); 43 - static int llc_ui_wait_for_data(struct sock *sk, int timeout); 44 - static int llc_ui_wait_for_busy_core(struct sock *sk, int timeout); 45 46 #if 0 47 #define dprintk(args...) printk(KERN_DEBUG args) ··· 116 struct llc_sock* llc = llc_sk(sk); 117 int rc = 0; 118 119 - if (llc_data_accept_state(llc->state) || llc->p_flag) { 120 - int timeout = sock_sndtimeo(sk, noblock); 121 122 rc = llc_ui_wait_for_busy_core(sk, timeout); 123 } 124 - if (!rc) 125 rc = llc_build_and_send_pkt(sk, skb); 126 return rc; 127 } ··· 155 struct sock *sk; 156 int rc = -ESOCKTNOSUPPORT; 157 158 - if (sock->type == SOCK_DGRAM || sock->type == SOCK_STREAM) { 159 rc = -ENOMEM; 160 sk = llc_sk_alloc(PF_LLC, GFP_KERNEL, &llc_proto); 161 if (sk) { ··· 177 struct sock *sk = sock->sk; 178 struct llc_sock *llc; 179 180 - if (!sk) 181 goto out; 182 sock_hold(sk); 183 lock_sock(sk); ··· 189 if (!sock_flag(sk, SOCK_ZAPPED)) 190 llc_sap_remove_socket(llc->sap, sk); 191 release_sock(sk); 192 - if (llc->sap && hlist_empty(&llc->sap->sk_list.list)) { 193 - llc_release_sockets(llc->sap); 194 - llc_sap_close(llc->sap); 195 - } 196 if (llc->dev) 197 dev_put(llc->dev); 198 sock_put(sk); ··· 217 llc_ui_sap_last_autoport = i + 2; 218 goto out; 219 } 220 } 221 llc_ui_sap_last_autoport = LLC_SAP_DYN_START; 222 tries++; ··· 228 } 229 230 /** 231 - * llc_ui_autobind - Bind a socket to a specific address. 232 - * @sk: Socket to bind an address to. 233 - * @addr: Address the user wants the socket bound to. 234 * 235 - * Bind a socket to a specific address. For llc a user is able to bind to 236 - * a specific sap only or mac + sap. If the user only specifies a sap and 237 - * a null dmac (all zeros) the user is attempting to bind to an entire 238 - * sap. This will stop anyone else on the local system from using that 239 - * sap. If someone else has a mac + sap open the bind to null + sap will 240 - * fail. 241 - * If the user desires to bind to a specific mac + sap, it is possible to 242 - * have multiple sap connections via multiple macs. 243 - * Bind and autobind for that matter must enforce the correct sap usage 244 - * otherwise all hell will break loose. 245 * Returns: 0 upon success, negative otherwise. 246 */ 247 static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr) ··· 275 * @addrlen: Length of the uaddr structure. 276 * 277 * Bind a socket to a specific address. For llc a user is able to bind to 278 - * a specific sap only or mac + sap. If the user only specifies a sap and 279 - * a null dmac (all zeros) the user is attempting to bind to an entire 280 - * sap. This will stop anyone else on the local system from using that 281 - * sap. If someone else has a mac + sap open the bind to null + sap will 282 - * fail. 283 * If the user desires to bind to a specific mac + sap, it is possible to 284 * have multiple sap connections via multiple macs. 285 * Bind and autobind for that matter must enforce the correct sap usage ··· 291 int rc = -EINVAL; 292 293 dprintk("%s: binding %02X\n", __FUNCTION__, addr->sllc_sap); 294 - if (!sock_flag(sk, SOCK_ZAPPED) || addrlen != sizeof(*addr)) 295 goto out; 296 rc = -EAFNOSUPPORT; 297 - if (addr->sllc_family != AF_LLC) 298 goto out; 299 if (!addr->sllc_sap) { 300 rc = -EUSERS; ··· 314 rc = -EBUSY; /* some other network layer is using the sap */ 315 if (!sap) 316 goto out; 317 } else { 318 struct llc_addr laddr, daddr; 319 struct sock *ask; ··· 331 ask = llc_lookup_established(sap, &daddr, &laddr); 332 if (ask) { 333 sock_put(ask); 334 - goto out; 335 } 336 } 337 llc->laddr.lsap = addr->sllc_sap; ··· 341 llc_sap_add_socket(sap, sk); 342 sock_reset_flag(sk, SOCK_ZAPPED); 343 rc = 0; 344 out: 345 return rc; 346 } ··· 364 int rc = -ENOTCONN; 365 366 lock_sock(sk); 367 - if (sk->sk_state != TCP_ESTABLISHED) 368 goto out; 369 rc = -EINVAL; 370 if (how != 2) ··· 399 struct sock *sk = sock->sk; 400 struct llc_sock *llc = llc_sk(sk); 401 struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr; 402 - struct net_device *dev; 403 int rc = -EINVAL; 404 405 lock_sock(sk); 406 - if (addrlen != sizeof(*addr)) 407 goto out; 408 rc = -EAFNOSUPPORT; 409 - if (addr->sllc_family != AF_LLC) 410 goto out; 411 /* bind connection to sap if user hasn't done it. */ 412 if (sock_flag(sk, SOCK_ZAPPED)) { ··· 418 rc = llc_ui_autobind(sock, addr); 419 if (rc) 420 goto out; 421 - llc->daddr.lsap = addr->sllc_sap; 422 - memcpy(llc->daddr.mac, addr->sllc_mac, IFHWADDRLEN); 423 } 424 - dev = llc->dev; 425 - if (sk->sk_type != SOCK_STREAM) 426 - goto out; 427 - rc = -EALREADY; 428 - if (sock->state == SS_CONNECTING) 429 - goto out; 430 sock->state = SS_CONNECTING; 431 sk->sk_state = TCP_SYN_SENT; 432 llc->link = llc_ui_next_link_no(llc->sap->laddr.lsap); 433 - rc = llc_establish_connection(sk, dev->dev_addr, 434 addr->sllc_mac, addr->sllc_sap); 435 if (rc) { 436 dprintk("%s: llc_ui_send_conn failed :-(\n", __FUNCTION__); ··· 432 sk->sk_state = TCP_CLOSE; 433 goto out; 434 } 435 - rc = llc_ui_wait_for_conn(sk, sk->sk_rcvtimeo); 436 - if (rc) 437 - dprintk("%s: llc_ui_wait_for_conn failed=%d\n", __FUNCTION__, rc); 438 out: 439 release_sock(sk); 440 return rc; 441 } 442 443 /** ··· 472 int rc = -EINVAL; 473 474 lock_sock(sk); 475 - if (sock->state != SS_UNCONNECTED) 476 goto out; 477 rc = -EOPNOTSUPP; 478 - if (sk->sk_type != SOCK_STREAM) 479 goto out; 480 rc = -EAGAIN; 481 if (sock_flag(sk, SOCK_ZAPPED)) ··· 494 return rc; 495 } 496 497 - static int llc_ui_wait_for_disc(struct sock *sk, int timeout) 498 { 499 - DECLARE_WAITQUEUE(wait, current); 500 - int rc; 501 - 502 - add_wait_queue_exclusive(sk->sk_sleep, &wait); 503 - for (;;) { 504 - __set_current_state(TASK_INTERRUPTIBLE); 505 - rc = 0; 506 - if (sk->sk_state != TCP_CLOSE) { 507 - release_sock(sk); 508 - timeout = schedule_timeout(timeout); 509 - lock_sock(sk); 510 - } else 511 - break; 512 - rc = -ERESTARTSYS; 513 - if (signal_pending(current)) 514 - break; 515 - rc = -EAGAIN; 516 - if (!timeout) 517 - break; 518 - } 519 - __set_current_state(TASK_RUNNING); 520 - remove_wait_queue(sk->sk_sleep, &wait); 521 - return rc; 522 - } 523 - 524 - static int llc_ui_wait_for_conn(struct sock *sk, int timeout) 525 - { 526 - DECLARE_WAITQUEUE(wait, current); 527 - int rc; 528 - 529 - add_wait_queue_exclusive(sk->sk_sleep, &wait); 530 - for (;;) { 531 - __set_current_state(TASK_INTERRUPTIBLE); 532 - rc = -EAGAIN; 533 - if (sk->sk_state == TCP_CLOSE) 534 - break; 535 - rc = 0; 536 - if (sk->sk_state != TCP_ESTABLISHED) { 537 - release_sock(sk); 538 - timeout = schedule_timeout(timeout); 539 - lock_sock(sk); 540 - } else 541 - break; 542 - rc = -ERESTARTSYS; 543 - if (signal_pending(current)) 544 - break; 545 - rc = -EAGAIN; 546 - if (!timeout) 547 - break; 548 - } 549 - __set_current_state(TASK_RUNNING); 550 - remove_wait_queue(sk->sk_sleep, &wait); 551 - return rc; 552 - } 553 - 554 - static int llc_ui_wait_for_data(struct sock *sk, int timeout) 555 - { 556 - DECLARE_WAITQUEUE(wait, current); 557 int rc = 0; 558 559 - add_wait_queue_exclusive(sk->sk_sleep, &wait); 560 - for (;;) { 561 - __set_current_state(TASK_INTERRUPTIBLE); 562 - if (sk->sk_shutdown & RCV_SHUTDOWN) 563 - break; 564 - /* 565 - * Well, if we have backlog, try to process it now. 566 - */ 567 - if (sk->sk_backlog.tail) { 568 - release_sock(sk); 569 - lock_sock(sk); 570 - } 571 - rc = 0; 572 - if (skb_queue_empty(&sk->sk_receive_queue)) { 573 - release_sock(sk); 574 - timeout = schedule_timeout(timeout); 575 - lock_sock(sk); 576 - } else 577 break; 578 rc = -ERESTARTSYS; 579 if (signal_pending(current)) ··· 509 rc = -EAGAIN; 510 if (!timeout) 511 break; 512 } 513 - __set_current_state(TASK_RUNNING); 514 - remove_wait_queue(sk->sk_sleep, &wait); 515 return rc; 516 } 517 518 - static int llc_ui_wait_for_busy_core(struct sock *sk, int timeout) 519 { 520 - DECLARE_WAITQUEUE(wait, current); 521 struct llc_sock *llc = llc_sk(sk); 522 int rc; 523 524 - add_wait_queue_exclusive(sk->sk_sleep, &wait); 525 - for (;;) { 526 - dprintk("%s: looping...\n", __FUNCTION__); 527 - __set_current_state(TASK_INTERRUPTIBLE); 528 - rc = -ENOTCONN; 529 - if (sk->sk_shutdown & RCV_SHUTDOWN) 530 - break; 531 rc = 0; 532 - if (llc_data_accept_state(llc->state) || llc->p_flag) { 533 - release_sock(sk); 534 - timeout = schedule_timeout(timeout); 535 - lock_sock(sk); 536 - } else 537 break; 538 rc = -ERESTARTSYS; 539 if (signal_pending(current)) ··· 551 if (!timeout) 552 break; 553 } 554 - __set_current_state(TASK_RUNNING); 555 - remove_wait_queue(sk->sk_sleep, &wait); 556 return rc; 557 } 558 ··· 602 dprintk("%s: accepting on %02X\n", __FUNCTION__, 603 llc_sk(sk)->laddr.lsap); 604 lock_sock(sk); 605 - if (sk->sk_type != SOCK_STREAM) 606 goto out; 607 rc = -EINVAL; 608 - if (sock->state != SS_UNCONNECTED || sk->sk_state != TCP_LISTEN) 609 goto out; 610 /* wait for a connection to arrive. */ 611 - rc = llc_ui_wait_for_data(sk, sk->sk_rcvtimeo); 612 - if (rc) 613 - goto out; 614 dprintk("%s: got a new connection on %02X\n", __FUNCTION__, 615 llc_sk(sk)->laddr.lsap); 616 skb = skb_dequeue(&sk->sk_receive_queue); ··· 635 /* put original socket back into a clean listen state. */ 636 sk->sk_state = TCP_LISTEN; 637 sk->sk_ack_backlog--; 638 - skb->sk = NULL; 639 dprintk("%s: ok success on %02X, client on %02X\n", __FUNCTION__, 640 llc_sk(sk)->addr.sllc_sap, newllc->daddr.lsap); 641 frees: ··· 648 * llc_ui_recvmsg - copy received data to the socket user. 649 * @sock: Socket to copy data from. 650 * @msg: Various user space related information. 651 - * @size: Size of user buffer. 652 * @flags: User specified flags. 653 * 654 * Copy received data to the socket user. 655 * Returns non-negative upon success, negative otherwise. 656 */ 657 static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, 658 - struct msghdr *msg, size_t size, int flags) 659 { 660 - struct sock *sk = sock->sk; 661 struct sockaddr_llc *uaddr = (struct sockaddr_llc *)msg->msg_name; 662 - struct sk_buff *skb; 663 size_t copied = 0; 664 - int rc = -ENOMEM, timeout; 665 - int noblock = flags & MSG_DONTWAIT; 666 667 - dprintk("%s: receiving in %02X from %02X\n", __FUNCTION__, 668 - llc_sk(sk)->laddr.lsap, llc_sk(sk)->daddr.lsap); 669 lock_sock(sk); 670 - timeout = sock_rcvtimeo(sk, noblock); 671 - rc = llc_ui_wait_for_data(sk, timeout); 672 - if (rc) { 673 - dprintk("%s: llc_ui_wait_for_data failed recv " 674 - "in %02X from %02X\n", __FUNCTION__, 675 - llc_sk(sk)->laddr.lsap, llc_sk(sk)->daddr.lsap); 676 goto out; 677 - } 678 - skb = skb_dequeue(&sk->sk_receive_queue); 679 - if (!skb) /* shutdown */ 680 - goto out; 681 - copied = skb->len; 682 - if (copied > size) 683 - copied = size; 684 - rc = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); 685 - if (rc) 686 - goto dgram_free; 687 - if (skb->len > copied) { 688 - skb_pull(skb, copied); 689 - skb_queue_head(&sk->sk_receive_queue, skb); 690 - } 691 - if (uaddr) 692 - memcpy(uaddr, llc_ui_skb_cb(skb), sizeof(*uaddr)); 693 - msg->msg_namelen = sizeof(*uaddr); 694 - if (!skb->next) { 695 - dgram_free: 696 - kfree_skb(skb); 697 - } 698 out: 699 release_sock(sk); 700 - return rc ? : copied; 701 } 702 703 /** ··· 828 struct sockaddr_llc *addr = (struct sockaddr_llc *)msg->msg_name; 829 int flags = msg->msg_flags; 830 int noblock = flags & MSG_DONTWAIT; 831 - struct net_device *dev; 832 struct sk_buff *skb; 833 size_t size = 0; 834 int rc = -EINVAL, copied = 0, hdrlen; ··· 850 if (rc) 851 goto release; 852 } 853 - dev = llc->dev; 854 - hdrlen = dev->hard_header_len + llc_ui_header_len(sk, addr); 855 size = hdrlen + len; 856 - if (size > dev->mtu) 857 - size = dev->mtu; 858 copied = size - hdrlen; 859 release_sock(sk); 860 skb = sock_alloc_send_skb(sk, size, noblock, &rc); 861 lock_sock(sk); 862 if (!skb) 863 goto release; 864 - skb->sk = sk; 865 - skb->dev = dev; 866 skb->protocol = llc_proto_type(addr->sllc_arphrd); 867 skb_reserve(skb, hdrlen); 868 rc = memcpy_fromiovec(skb_put(skb, copied), msg->msg_iov, copied); ··· 885 if (!(sk->sk_type == SOCK_STREAM && !addr->sllc_ua)) 886 goto out; 887 rc = llc_ui_send_data(sk, skb, noblock); 888 - if (rc) 889 - dprintk("%s: llc_ui_send_data failed: %d\n", __FUNCTION__, rc); 890 out: 891 - if (rc) 892 kfree_skb(skb); 893 release: 894 - if (rc) 895 dprintk("%s: failed sending from %02X to %02X: %d\n", 896 __FUNCTION__, llc->laddr.lsap, llc->daddr.lsap, rc); 897 release_sock(sk); 898 return rc ? : copied; 899 } ··· 978 int rc = -EINVAL, opt; 979 980 lock_sock(sk); 981 - if (level != SOL_LLC || optlen != sizeof(int)) 982 goto out; 983 rc = get_user(opt, (int __user *)optval); 984 if (rc) ··· 998 case LLC_OPT_ACK_TMR_EXP: 999 if (opt > LLC_OPT_MAX_ACK_TMR_EXP) 1000 goto out; 1001 - llc->ack_timer.expire = opt; 1002 break; 1003 case LLC_OPT_P_TMR_EXP: 1004 if (opt > LLC_OPT_MAX_P_TMR_EXP) 1005 goto out; 1006 - llc->pf_cycle_timer.expire = opt; 1007 break; 1008 case LLC_OPT_REJ_TMR_EXP: 1009 if (opt > LLC_OPT_MAX_REJ_TMR_EXP) 1010 goto out; 1011 - llc->rej_sent_timer.expire = opt; 1012 break; 1013 case LLC_OPT_BUSY_TMR_EXP: 1014 if (opt > LLC_OPT_MAX_BUSY_TMR_EXP) 1015 goto out; 1016 - llc->busy_state_timer.expire = opt; 1017 break; 1018 case LLC_OPT_TX_WIN: 1019 if (opt > LLC_OPT_MAX_WIN) ··· 1053 int val = 0, len = 0, rc = -EINVAL; 1054 1055 lock_sock(sk); 1056 - if (level != SOL_LLC) 1057 goto out; 1058 rc = get_user(len, optlen); 1059 if (rc) ··· 1063 goto out; 1064 switch (optname) { 1065 case LLC_OPT_RETRY: 1066 - val = llc->n2; break; 1067 case LLC_OPT_SIZE: 1068 - val = llc->n1; break; 1069 case LLC_OPT_ACK_TMR_EXP: 1070 - val = llc->ack_timer.expire; break; 1071 case LLC_OPT_P_TMR_EXP: 1072 - val = llc->pf_cycle_timer.expire; break; 1073 case LLC_OPT_REJ_TMR_EXP: 1074 - val = llc->rej_sent_timer.expire; break; 1075 case LLC_OPT_BUSY_TMR_EXP: 1076 - val = llc->busy_state_timer.expire; break; 1077 case LLC_OPT_TX_WIN: 1078 val = llc->k; break; 1079 case LLC_OPT_RX_WIN: ··· 1117 .sendpage = sock_no_sendpage, 1118 }; 1119 1120 - extern void llc_sap_handler(struct llc_sap *sap, struct sk_buff *skb); 1121 - extern void llc_conn_handler(struct llc_sap *sap, struct sk_buff *skb); 1122 1123 static int __init llc2_init(void) 1124 { ··· 1135 llc_station_init(); 1136 llc_ui_sap_last_autoport = LLC_SAP_DYN_START; 1137 rc = llc_proc_init(); 1138 - if (rc != 0) 1139 goto out_unregister_llc_proto; 1140 - sock_register(&llc_ui_family_ops); 1141 llc_add_pack(LLC_DEST_SAP, llc_sap_handler); 1142 llc_add_pack(LLC_DEST_CONN, llc_conn_handler); 1143 out: 1144 return rc; 1145 out_unregister_llc_proto: 1146 proto_unregister(&llc_proto); 1147 goto out; ··· 1169 llc_remove_pack(LLC_DEST_CONN); 1170 sock_unregister(PF_LLC); 1171 llc_proc_exit(); 1172 proto_unregister(&llc_proto); 1173 } 1174
··· 21 * See the GNU General Public License for more details. 22 */ 23 #include <linux/config.h> 24 + #include <linux/compiler.h> 25 #include <linux/kernel.h> 26 #include <linux/module.h> 27 #include <linux/rtnetlink.h> ··· 37 static struct sockaddr_llc llc_ui_addrnull; 38 static struct proto_ops llc_ui_ops; 39 40 + static int llc_ui_wait_for_conn(struct sock *sk, long timeout); 41 + static int llc_ui_wait_for_disc(struct sock *sk, long timeout); 42 + static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout); 43 44 #if 0 45 #define dprintk(args...) printk(KERN_DEBUG args) ··· 116 struct llc_sock* llc = llc_sk(sk); 117 int rc = 0; 118 119 + if (unlikely(llc_data_accept_state(llc->state) || llc->p_flag)) { 120 + long timeout = sock_sndtimeo(sk, noblock); 121 122 rc = llc_ui_wait_for_busy_core(sk, timeout); 123 } 124 + if (unlikely(!rc)) 125 rc = llc_build_and_send_pkt(sk, skb); 126 return rc; 127 } ··· 155 struct sock *sk; 156 int rc = -ESOCKTNOSUPPORT; 157 158 + if (likely(sock->type == SOCK_DGRAM || sock->type == SOCK_STREAM)) { 159 rc = -ENOMEM; 160 sk = llc_sk_alloc(PF_LLC, GFP_KERNEL, &llc_proto); 161 if (sk) { ··· 177 struct sock *sk = sock->sk; 178 struct llc_sock *llc; 179 180 + if (unlikely(sk == NULL)) 181 goto out; 182 sock_hold(sk); 183 lock_sock(sk); ··· 189 if (!sock_flag(sk, SOCK_ZAPPED)) 190 llc_sap_remove_socket(llc->sap, sk); 191 release_sock(sk); 192 if (llc->dev) 193 dev_put(llc->dev); 194 sock_put(sk); ··· 221 llc_ui_sap_last_autoport = i + 2; 222 goto out; 223 } 224 + llc_sap_put(sap); 225 } 226 llc_ui_sap_last_autoport = LLC_SAP_DYN_START; 227 tries++; ··· 231 } 232 233 /** 234 + * llc_ui_autobind - automatically bind a socket to a sap 235 + * @sock: socket to bind 236 + * @addr: address to connect to 237 * 238 + * Used by llc_ui_connect and llc_ui_sendmsg when the user hasn't 239 + * specifically used llc_ui_bind to bind to an specific address/sap 240 + * 241 * Returns: 0 upon success, negative otherwise. 242 */ 243 static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr) ··· 285 * @addrlen: Length of the uaddr structure. 286 * 287 * Bind a socket to a specific address. For llc a user is able to bind to 288 + * a specific sap only or mac + sap. 289 * If the user desires to bind to a specific mac + sap, it is possible to 290 * have multiple sap connections via multiple macs. 291 * Bind and autobind for that matter must enforce the correct sap usage ··· 305 int rc = -EINVAL; 306 307 dprintk("%s: binding %02X\n", __FUNCTION__, addr->sllc_sap); 308 + if (unlikely(!sock_flag(sk, SOCK_ZAPPED) || addrlen != sizeof(*addr))) 309 goto out; 310 rc = -EAFNOSUPPORT; 311 + if (unlikely(addr->sllc_family != AF_LLC)) 312 + goto out; 313 + rc = -ENODEV; 314 + rtnl_lock(); 315 + llc->dev = dev_getbyhwaddr(addr->sllc_arphrd, addr->sllc_mac); 316 + rtnl_unlock(); 317 + if (!llc->dev) 318 goto out; 319 if (!addr->sllc_sap) { 320 rc = -EUSERS; ··· 322 rc = -EBUSY; /* some other network layer is using the sap */ 323 if (!sap) 324 goto out; 325 + llc_sap_hold(sap); 326 } else { 327 struct llc_addr laddr, daddr; 328 struct sock *ask; ··· 338 ask = llc_lookup_established(sap, &daddr, &laddr); 339 if (ask) { 340 sock_put(ask); 341 + goto out_put; 342 } 343 } 344 llc->laddr.lsap = addr->sllc_sap; ··· 348 llc_sap_add_socket(sap, sk); 349 sock_reset_flag(sk, SOCK_ZAPPED); 350 rc = 0; 351 + out_put: 352 + llc_sap_put(sap); 353 out: 354 return rc; 355 } ··· 369 int rc = -ENOTCONN; 370 371 lock_sock(sk); 372 + if (unlikely(sk->sk_state != TCP_ESTABLISHED)) 373 goto out; 374 rc = -EINVAL; 375 if (how != 2) ··· 404 struct sock *sk = sock->sk; 405 struct llc_sock *llc = llc_sk(sk); 406 struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr; 407 int rc = -EINVAL; 408 409 lock_sock(sk); 410 + if (unlikely(addrlen != sizeof(*addr))) 411 goto out; 412 rc = -EAFNOSUPPORT; 413 + if (unlikely(addr->sllc_family != AF_LLC)) 414 + goto out; 415 + if (unlikely(sk->sk_type != SOCK_STREAM)) 416 + goto out; 417 + rc = -EALREADY; 418 + if (unlikely(sock->state == SS_CONNECTING)) 419 goto out; 420 /* bind connection to sap if user hasn't done it. */ 421 if (sock_flag(sk, SOCK_ZAPPED)) { ··· 419 rc = llc_ui_autobind(sock, addr); 420 if (rc) 421 goto out; 422 } 423 + llc->daddr.lsap = addr->sllc_sap; 424 + memcpy(llc->daddr.mac, addr->sllc_mac, IFHWADDRLEN); 425 sock->state = SS_CONNECTING; 426 sk->sk_state = TCP_SYN_SENT; 427 llc->link = llc_ui_next_link_no(llc->sap->laddr.lsap); 428 + rc = llc_establish_connection(sk, llc->dev->dev_addr, 429 addr->sllc_mac, addr->sllc_sap); 430 if (rc) { 431 dprintk("%s: llc_ui_send_conn failed :-(\n", __FUNCTION__); ··· 439 sk->sk_state = TCP_CLOSE; 440 goto out; 441 } 442 + 443 + if (sk->sk_state == TCP_SYN_SENT) { 444 + const long timeo = sock_sndtimeo(sk, flags & O_NONBLOCK); 445 + 446 + if (!timeo || !llc_ui_wait_for_conn(sk, timeo)) 447 + goto out; 448 + 449 + rc = sock_intr_errno(timeo); 450 + if (signal_pending(current)) 451 + goto out; 452 + } 453 + 454 + if (sk->sk_state == TCP_CLOSE) 455 + goto sock_error; 456 + 457 + sock->state = SS_CONNECTED; 458 + rc = 0; 459 out: 460 release_sock(sk); 461 return rc; 462 + sock_error: 463 + rc = sock_error(sk) ? : -ECONNABORTED; 464 + sock->state = SS_UNCONNECTED; 465 + goto out; 466 } 467 468 /** ··· 461 int rc = -EINVAL; 462 463 lock_sock(sk); 464 + if (unlikely(sock->state != SS_UNCONNECTED)) 465 goto out; 466 rc = -EOPNOTSUPP; 467 + if (unlikely(sk->sk_type != SOCK_STREAM)) 468 goto out; 469 rc = -EAGAIN; 470 if (sock_flag(sk, SOCK_ZAPPED)) ··· 483 return rc; 484 } 485 486 + static int llc_ui_wait_for_disc(struct sock *sk, long timeout) 487 { 488 + DEFINE_WAIT(wait); 489 int rc = 0; 490 491 + while (1) { 492 + prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); 493 + if (sk_wait_event(sk, &timeout, sk->sk_state == TCP_CLOSE)) 494 break; 495 rc = -ERESTARTSYS; 496 if (signal_pending(current)) ··· 570 rc = -EAGAIN; 571 if (!timeout) 572 break; 573 + rc = 0; 574 } 575 + finish_wait(sk->sk_sleep, &wait); 576 return rc; 577 } 578 579 + static int llc_ui_wait_for_conn(struct sock *sk, long timeout) 580 { 581 + DEFINE_WAIT(wait); 582 + 583 + while (1) { 584 + prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); 585 + if (sk_wait_event(sk, &timeout, sk->sk_state != TCP_SYN_SENT)) 586 + break; 587 + if (signal_pending(current) || !timeout) 588 + break; 589 + } 590 + finish_wait(sk->sk_sleep, &wait); 591 + return timeout; 592 + } 593 + 594 + static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout) 595 + { 596 + DEFINE_WAIT(wait); 597 struct llc_sock *llc = llc_sk(sk); 598 int rc; 599 600 + while (1) { 601 + prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); 602 rc = 0; 603 + if (sk_wait_event(sk, &timeout, 604 + (sk->sk_shutdown & RCV_SHUTDOWN) || 605 + (!llc_data_accept_state(llc->state) && 606 + !llc->p_flag))) 607 break; 608 rc = -ERESTARTSYS; 609 if (signal_pending(current)) ··· 603 if (!timeout) 604 break; 605 } 606 + finish_wait(sk->sk_sleep, &wait); 607 + return rc; 608 + } 609 + 610 + static int llc_wait_data(struct sock *sk, long timeo) 611 + { 612 + int rc; 613 + 614 + while (1) { 615 + /* 616 + * POSIX 1003.1g mandates this order. 617 + */ 618 + if (sk->sk_err) { 619 + rc = sock_error(sk); 620 + break; 621 + } 622 + rc = 0; 623 + if (sk->sk_shutdown & RCV_SHUTDOWN) 624 + break; 625 + rc = -EAGAIN; 626 + if (!timeo) 627 + break; 628 + rc = sock_intr_errno(timeo); 629 + if (signal_pending(current)) 630 + break; 631 + rc = 0; 632 + if (sk_wait_data(sk, &timeo)) 633 + break; 634 + } 635 return rc; 636 } 637 ··· 627 dprintk("%s: accepting on %02X\n", __FUNCTION__, 628 llc_sk(sk)->laddr.lsap); 629 lock_sock(sk); 630 + if (unlikely(sk->sk_type != SOCK_STREAM)) 631 goto out; 632 rc = -EINVAL; 633 + if (unlikely(sock->state != SS_UNCONNECTED || 634 + sk->sk_state != TCP_LISTEN)) 635 goto out; 636 /* wait for a connection to arrive. */ 637 + if (skb_queue_empty(&sk->sk_receive_queue)) { 638 + rc = llc_wait_data(sk, sk->sk_rcvtimeo); 639 + if (rc) 640 + goto out; 641 + } 642 dprintk("%s: got a new connection on %02X\n", __FUNCTION__, 643 llc_sk(sk)->laddr.lsap); 644 skb = skb_dequeue(&sk->sk_receive_queue); ··· 657 /* put original socket back into a clean listen state. */ 658 sk->sk_state = TCP_LISTEN; 659 sk->sk_ack_backlog--; 660 dprintk("%s: ok success on %02X, client on %02X\n", __FUNCTION__, 661 llc_sk(sk)->addr.sllc_sap, newllc->daddr.lsap); 662 frees: ··· 671 * llc_ui_recvmsg - copy received data to the socket user. 672 * @sock: Socket to copy data from. 673 * @msg: Various user space related information. 674 + * @len: Size of user buffer. 675 * @flags: User specified flags. 676 * 677 * Copy received data to the socket user. 678 * Returns non-negative upon success, negative otherwise. 679 */ 680 static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, 681 + struct msghdr *msg, size_t len, int flags) 682 { 683 struct sockaddr_llc *uaddr = (struct sockaddr_llc *)msg->msg_name; 684 + const int nonblock = flags & MSG_DONTWAIT; 685 + struct sk_buff *skb = NULL; 686 + struct sock *sk = sock->sk; 687 + struct llc_sock *llc = llc_sk(sk); 688 size_t copied = 0; 689 + u32 peek_seq = 0; 690 + u32 *seq; 691 + unsigned long used; 692 + int target; /* Read at least this many bytes */ 693 + long timeo; 694 695 lock_sock(sk); 696 + copied = -ENOTCONN; 697 + if (sk->sk_state == TCP_LISTEN) 698 goto out; 699 + 700 + timeo = sock_rcvtimeo(sk, nonblock); 701 + 702 + seq = &llc->copied_seq; 703 + if (flags & MSG_PEEK) { 704 + peek_seq = llc->copied_seq; 705 + seq = &peek_seq; 706 + } 707 + 708 + target = sock_rcvlowat(sk, flags & MSG_WAITALL, len); 709 + copied = 0; 710 + 711 + do { 712 + u32 offset; 713 + 714 + /* 715 + * We need to check signals first, to get correct SIGURG 716 + * handling. FIXME: Need to check this doesn't impact 1003.1g 717 + * and move it down to the bottom of the loop 718 + */ 719 + if (signal_pending(current)) { 720 + if (copied) 721 + break; 722 + copied = timeo ? sock_intr_errno(timeo) : -EAGAIN; 723 + break; 724 + } 725 + 726 + /* Next get a buffer. */ 727 + 728 + skb = skb_peek(&sk->sk_receive_queue); 729 + if (skb) { 730 + offset = *seq; 731 + goto found_ok_skb; 732 + } 733 + /* Well, if we have backlog, try to process it now yet. */ 734 + 735 + if (copied >= target && !sk->sk_backlog.tail) 736 + break; 737 + 738 + if (copied) { 739 + if (sk->sk_err || 740 + sk->sk_state == TCP_CLOSE || 741 + (sk->sk_shutdown & RCV_SHUTDOWN) || 742 + !timeo || 743 + (flags & MSG_PEEK)) 744 + break; 745 + } else { 746 + if (sock_flag(sk, SOCK_DONE)) 747 + break; 748 + 749 + if (sk->sk_err) { 750 + copied = sock_error(sk); 751 + break; 752 + } 753 + if (sk->sk_shutdown & RCV_SHUTDOWN) 754 + break; 755 + 756 + if (sk->sk_state == TCP_CLOSE) { 757 + if (!sock_flag(sk, SOCK_DONE)) { 758 + /* 759 + * This occurs when user tries to read 760 + * from never connected socket. 761 + */ 762 + copied = -ENOTCONN; 763 + break; 764 + } 765 + break; 766 + } 767 + if (!timeo) { 768 + copied = -EAGAIN; 769 + break; 770 + } 771 + } 772 + 773 + if (copied >= target) { /* Do not sleep, just process backlog. */ 774 + release_sock(sk); 775 + lock_sock(sk); 776 + } else 777 + sk_wait_data(sk, &timeo); 778 + 779 + if ((flags & MSG_PEEK) && peek_seq != llc->copied_seq) { 780 + if (net_ratelimit()) 781 + printk(KERN_DEBUG "LLC(%s:%d): Application " 782 + "bug, race in MSG_PEEK.\n", 783 + current->comm, current->pid); 784 + peek_seq = llc->copied_seq; 785 + } 786 + continue; 787 + found_ok_skb: 788 + /* Ok so how much can we use? */ 789 + used = skb->len - offset; 790 + if (len < used) 791 + used = len; 792 + 793 + if (!(flags & MSG_TRUNC)) { 794 + int rc = skb_copy_datagram_iovec(skb, offset, 795 + msg->msg_iov, used); 796 + if (rc) { 797 + /* Exception. Bailout! */ 798 + if (!copied) 799 + copied = -EFAULT; 800 + break; 801 + } 802 + } 803 + 804 + *seq += used; 805 + copied += used; 806 + len -= used; 807 + 808 + if (used + offset < skb->len) 809 + continue; 810 + 811 + if (!(flags & MSG_PEEK)) { 812 + sk_eat_skb(sk, skb); 813 + *seq = 0; 814 + } 815 + } while (len > 0); 816 + 817 + /* 818 + * According to UNIX98, msg_name/msg_namelen are ignored 819 + * on connected socket. -ANK 820 + * But... af_llc still doesn't have separate sets of methods for 821 + * SOCK_DGRAM and SOCK_STREAM :-( So we have to do this test, will 822 + * eventually fix this tho :-) -acme 823 + */ 824 + if (sk->sk_type == SOCK_DGRAM) 825 + goto copy_uaddr; 826 out: 827 release_sock(sk); 828 + return copied; 829 + copy_uaddr: 830 + if (uaddr != NULL && skb != NULL) { 831 + memcpy(uaddr, llc_ui_skb_cb(skb), sizeof(*uaddr)); 832 + msg->msg_namelen = sizeof(*uaddr); 833 + } 834 + goto out; 835 } 836 837 /** ··· 740 struct sockaddr_llc *addr = (struct sockaddr_llc *)msg->msg_name; 741 int flags = msg->msg_flags; 742 int noblock = flags & MSG_DONTWAIT; 743 struct sk_buff *skb; 744 size_t size = 0; 745 int rc = -EINVAL, copied = 0, hdrlen; ··· 763 if (rc) 764 goto release; 765 } 766 + hdrlen = llc->dev->hard_header_len + llc_ui_header_len(sk, addr); 767 size = hdrlen + len; 768 + if (size > llc->dev->mtu) 769 + size = llc->dev->mtu; 770 copied = size - hdrlen; 771 release_sock(sk); 772 skb = sock_alloc_send_skb(sk, size, noblock, &rc); 773 lock_sock(sk); 774 if (!skb) 775 goto release; 776 + skb->dev = llc->dev; 777 skb->protocol = llc_proto_type(addr->sllc_arphrd); 778 skb_reserve(skb, hdrlen); 779 rc = memcpy_fromiovec(skb_put(skb, copied), msg->msg_iov, copied); ··· 800 if (!(sk->sk_type == SOCK_STREAM && !addr->sllc_ua)) 801 goto out; 802 rc = llc_ui_send_data(sk, skb, noblock); 803 out: 804 + if (rc) { 805 kfree_skb(skb); 806 release: 807 dprintk("%s: failed sending from %02X to %02X: %d\n", 808 __FUNCTION__, llc->laddr.lsap, llc->daddr.lsap, rc); 809 + } 810 release_sock(sk); 811 return rc ? : copied; 812 } ··· 895 int rc = -EINVAL, opt; 896 897 lock_sock(sk); 898 + if (unlikely(level != SOL_LLC || optlen != sizeof(int))) 899 goto out; 900 rc = get_user(opt, (int __user *)optval); 901 if (rc) ··· 915 case LLC_OPT_ACK_TMR_EXP: 916 if (opt > LLC_OPT_MAX_ACK_TMR_EXP) 917 goto out; 918 + llc->ack_timer.expire = opt * HZ; 919 break; 920 case LLC_OPT_P_TMR_EXP: 921 if (opt > LLC_OPT_MAX_P_TMR_EXP) 922 goto out; 923 + llc->pf_cycle_timer.expire = opt * HZ; 924 break; 925 case LLC_OPT_REJ_TMR_EXP: 926 if (opt > LLC_OPT_MAX_REJ_TMR_EXP) 927 goto out; 928 + llc->rej_sent_timer.expire = opt * HZ; 929 break; 930 case LLC_OPT_BUSY_TMR_EXP: 931 if (opt > LLC_OPT_MAX_BUSY_TMR_EXP) 932 goto out; 933 + llc->busy_state_timer.expire = opt * HZ; 934 break; 935 case LLC_OPT_TX_WIN: 936 if (opt > LLC_OPT_MAX_WIN) ··· 970 int val = 0, len = 0, rc = -EINVAL; 971 972 lock_sock(sk); 973 + if (unlikely(level != SOL_LLC)) 974 goto out; 975 rc = get_user(len, optlen); 976 if (rc) ··· 980 goto out; 981 switch (optname) { 982 case LLC_OPT_RETRY: 983 + val = llc->n2; break; 984 case LLC_OPT_SIZE: 985 + val = llc->n1; break; 986 case LLC_OPT_ACK_TMR_EXP: 987 + val = llc->ack_timer.expire / HZ; break; 988 case LLC_OPT_P_TMR_EXP: 989 + val = llc->pf_cycle_timer.expire / HZ; break; 990 case LLC_OPT_REJ_TMR_EXP: 991 + val = llc->rej_sent_timer.expire / HZ; break; 992 case LLC_OPT_BUSY_TMR_EXP: 993 + val = llc->busy_state_timer.expire / HZ; break; 994 case LLC_OPT_TX_WIN: 995 val = llc->k; break; 996 case LLC_OPT_RX_WIN: ··· 1034 .sendpage = sock_no_sendpage, 1035 }; 1036 1037 + static char llc_proc_err_msg[] __initdata = 1038 + KERN_CRIT "LLC: Unable to register the proc_fs entries\n"; 1039 + static char llc_sysctl_err_msg[] __initdata = 1040 + KERN_CRIT "LLC: Unable to register the sysctl entries\n"; 1041 + static char llc_sock_err_msg[] __initdata = 1042 + KERN_CRIT "LLC: Unable to register the network family\n"; 1043 1044 static int __init llc2_init(void) 1045 { ··· 1048 llc_station_init(); 1049 llc_ui_sap_last_autoport = LLC_SAP_DYN_START; 1050 rc = llc_proc_init(); 1051 + if (rc != 0) { 1052 + printk(llc_proc_err_msg); 1053 goto out_unregister_llc_proto; 1054 + } 1055 + rc = llc_sysctl_init(); 1056 + if (rc) { 1057 + printk(llc_sysctl_err_msg); 1058 + goto out_proc; 1059 + } 1060 + rc = sock_register(&llc_ui_family_ops); 1061 + if (rc) { 1062 + printk(llc_sock_err_msg); 1063 + goto out_sysctl; 1064 + } 1065 llc_add_pack(LLC_DEST_SAP, llc_sap_handler); 1066 llc_add_pack(LLC_DEST_CONN, llc_conn_handler); 1067 out: 1068 return rc; 1069 + out_sysctl: 1070 + llc_sysctl_exit(); 1071 + out_proc: 1072 + llc_proc_exit(); 1073 out_unregister_llc_proto: 1074 proto_unregister(&llc_proto); 1075 goto out; ··· 1067 llc_remove_pack(LLC_DEST_CONN); 1068 sock_unregister(PF_LLC); 1069 llc_proc_exit(); 1070 + llc_sysctl_exit(); 1071 proto_unregister(&llc_proto); 1072 } 1073
+98 -173
net/llc/llc_c_ac.c
··· 60 61 int llc_conn_ac_conn_ind(struct sock *sk, struct sk_buff *skb) 62 { 63 - int rc = -ENOTCONN; 64 - u8 dsap; 65 - struct llc_sap *sap; 66 67 - llc_pdu_decode_dsap(skb, &dsap); 68 - sap = llc_sap_find(dsap); 69 - if (sap) { 70 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 71 - struct llc_sock *llc = llc_sk(sk); 72 - 73 - llc_pdu_decode_sa(skb, llc->daddr.mac); 74 - llc_pdu_decode_da(skb, llc->laddr.mac); 75 - llc->dev = skb->dev; 76 - ev->ind_prim = LLC_CONN_PRIM; 77 - rc = 0; 78 - } 79 - return rc; 80 } 81 82 int llc_conn_ac_conn_confirm(struct sock *sk, struct sk_buff *skb) ··· 107 reason = LLC_DISC_REASON_RX_DISC_CMD_PDU; 108 } else if (ev->type == LLC_CONN_EV_TYPE_ACK_TMR) 109 reason = LLC_DISC_REASON_ACK_TMR_EXP; 110 - else { 111 - reason = 0; 112 rc = -EINVAL; 113 - } 114 if (!rc) { 115 ev->reason = reason; 116 ev->ind_prim = LLC_DISC_PRIM; ··· 145 LLC_U_PDU_CMD(pdu) == LLC_2_PDU_CMD_SABME) { 146 reason = LLC_RESET_REASON_REMOTE; 147 rc = 0; 148 - } else { 149 - reason = 0; 150 - rc = 1; 151 } 152 break; 153 case LLC_CONN_EV_TYPE_ACK_TMR: ··· 154 if (llc->retry_count > llc->n2) { 155 reason = LLC_RESET_REASON_LOCAL; 156 rc = 0; 157 - } else 158 - rc = 1; 159 break; 160 } 161 if (!rc) { ··· 198 int llc_conn_ac_send_disc_cmd_p_set_x(struct sock *sk, struct sk_buff *skb) 199 { 200 int rc = -ENOBUFS; 201 - struct sk_buff *nskb = llc_alloc_frame(); 202 203 if (nskb) { 204 - struct llc_sock *llc = llc_sk(sk); 205 struct llc_sap *sap = llc->sap; 206 207 - nskb->dev = llc->dev; 208 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 209 llc->daddr.lsap, LLC_PDU_CMD); 210 llc_pdu_init_as_disc_cmd(nskb, 1); 211 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 212 - if (rc) 213 goto free; 214 llc_conn_send_pdu(sk, nskb); 215 llc_conn_ac_set_p_flag_1(sk, skb); ··· 223 int llc_conn_ac_send_dm_rsp_f_set_p(struct sock *sk, struct sk_buff *skb) 224 { 225 int rc = -ENOBUFS; 226 - struct sk_buff *nskb = llc_alloc_frame(); 227 228 if (nskb) { 229 - struct llc_sock *llc = llc_sk(sk); 230 struct llc_sap *sap = llc->sap; 231 u8 f_bit; 232 233 - nskb->dev = llc->dev; 234 llc_pdu_decode_pf_bit(skb, &f_bit); 235 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 236 llc->daddr.lsap, LLC_PDU_RSP); 237 llc_pdu_init_as_dm_rsp(nskb, f_bit); 238 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 239 - if (rc) 240 goto free; 241 llc_conn_send_pdu(sk, nskb); 242 } ··· 249 int llc_conn_ac_send_dm_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) 250 { 251 int rc = -ENOBUFS; 252 - struct sk_buff *nskb = llc_alloc_frame(); 253 254 if (nskb) { 255 - struct llc_sock *llc = llc_sk(sk); 256 struct llc_sap *sap = llc->sap; 257 - u8 f_bit = 1; 258 259 - nskb->dev = llc->dev; 260 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 261 llc->daddr.lsap, LLC_PDU_RSP); 262 - llc_pdu_init_as_dm_rsp(nskb, f_bit); 263 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 264 - if (rc) 265 goto free; 266 llc_conn_send_pdu(sk, nskb); 267 } ··· 283 llc_pdu_decode_pf_bit(skb, &f_bit); 284 else 285 f_bit = 0; 286 - nskb = llc_alloc_frame(); 287 if (nskb) { 288 struct llc_sap *sap = llc->sap; 289 290 - nskb->dev = llc->dev; 291 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 292 llc->daddr.lsap, LLC_PDU_RSP); 293 llc_pdu_init_as_frmr_rsp(nskb, pdu, f_bit, llc->vS, 294 llc->vR, INCORRECT); 295 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 296 - if (rc) 297 goto free; 298 llc_conn_send_pdu(sk, nskb); 299 } ··· 306 int llc_conn_ac_resend_frmr_rsp_f_set_0(struct sock *sk, struct sk_buff *skb) 307 { 308 int rc = -ENOBUFS; 309 - struct sk_buff *nskb = llc_alloc_frame(); 310 311 if (nskb) { 312 - u8 f_bit = 0; 313 - struct llc_sock *llc = llc_sk(sk); 314 struct llc_sap *sap = llc->sap; 315 struct llc_pdu_sn *pdu = (struct llc_pdu_sn *)&llc->rx_pdu_hdr; 316 317 - nskb->dev = llc->dev; 318 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 319 llc->daddr.lsap, LLC_PDU_RSP); 320 - llc_pdu_init_as_frmr_rsp(nskb, pdu, f_bit, llc->vS, 321 llc->vR, INCORRECT); 322 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 323 - if (rc) 324 goto free; 325 llc_conn_send_pdu(sk, nskb); 326 } ··· 334 u8 f_bit; 335 int rc = -ENOBUFS; 336 struct sk_buff *nskb; 337 338 llc_pdu_decode_pf_bit(skb, &f_bit); 339 - nskb = llc_alloc_frame(); 340 if (nskb) { 341 - struct llc_sock *llc = llc_sk(sk); 342 struct llc_sap *sap = llc->sap; 343 struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 344 345 - nskb->dev = llc->dev; 346 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 347 llc->daddr.lsap, LLC_PDU_RSP); 348 llc_pdu_init_as_frmr_rsp(nskb, pdu, f_bit, llc->vS, 349 llc->vR, INCORRECT); 350 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 351 - if (rc) 352 goto free; 353 llc_conn_send_pdu(sk, nskb); 354 } ··· 368 llc->daddr.lsap, LLC_PDU_CMD); 369 llc_pdu_init_as_i_cmd(skb, 1, llc->vS, llc->vR); 370 rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac); 371 - if (!rc) { 372 llc_conn_send_pdu(sk, skb); 373 llc_conn_ac_inc_vs_by_1(sk, skb); 374 } ··· 385 llc->daddr.lsap, LLC_PDU_CMD); 386 llc_pdu_init_as_i_cmd(skb, 0, llc->vS, llc->vR); 387 rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac); 388 - if (!rc) { 389 llc_conn_send_pdu(sk, skb); 390 llc_conn_ac_inc_vs_by_1(sk, skb); 391 } ··· 402 llc->daddr.lsap, LLC_PDU_CMD); 403 llc_pdu_init_as_i_cmd(skb, 0, llc->vS, llc->vR); 404 rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac); 405 - if (!rc) { 406 llc_conn_send_pdu(sk, skb); 407 llc_conn_ac_inc_vs_by_1(sk, skb); 408 } ··· 424 u8 nr; 425 struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 426 int rc = -ENOBUFS; 427 - struct sk_buff *nskb = llc_alloc_frame(); 428 429 if (nskb) { 430 - struct llc_sock *llc = llc_sk(sk); 431 struct llc_sap *sap = llc->sap; 432 433 - nskb->dev = llc->dev; 434 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 435 llc->daddr.lsap, LLC_PDU_RSP); 436 llc_pdu_init_as_rr_rsp(nskb, 0, llc->vR); 437 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 438 - if (!rc) 439 llc_conn_send_pdu(sk, nskb); 440 else 441 kfree_skb(skb); ··· 459 int llc_conn_ac_send_rej_cmd_p_set_1(struct sock *sk, struct sk_buff *skb) 460 { 461 int rc = -ENOBUFS; 462 - struct sk_buff *nskb = llc_alloc_frame(); 463 464 if (nskb) { 465 - struct llc_sock *llc = llc_sk(sk); 466 struct llc_sap *sap = llc->sap; 467 468 - nskb->dev = llc->dev; 469 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 470 llc->daddr.lsap, LLC_PDU_CMD); 471 llc_pdu_init_as_rej_cmd(nskb, 1, llc->vR); 472 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 473 - if (rc) 474 goto free; 475 llc_conn_send_pdu(sk, nskb); 476 } ··· 483 int llc_conn_ac_send_rej_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) 484 { 485 int rc = -ENOBUFS; 486 - struct sk_buff *nskb = llc_alloc_frame(); 487 488 if (nskb) { 489 - u8 f_bit = 1; 490 - struct llc_sock *llc = llc_sk(sk); 491 struct llc_sap *sap = llc->sap; 492 493 - nskb->dev = llc->dev; 494 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 495 llc->daddr.lsap, LLC_PDU_RSP); 496 - llc_pdu_init_as_rej_rsp(nskb, f_bit, llc->vR); 497 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 498 - if (rc) 499 goto free; 500 llc_conn_send_pdu(sk, nskb); 501 } ··· 507 int llc_conn_ac_send_rej_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) 508 { 509 int rc = -ENOBUFS; 510 - struct sk_buff *nskb = llc_alloc_frame(); 511 512 if (nskb) { 513 - struct llc_sock *llc = llc_sk(sk); 514 struct llc_sap *sap = llc->sap; 515 - u8 f_bit = 0; 516 517 - nskb->dev = llc->dev; 518 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 519 llc->daddr.lsap, LLC_PDU_RSP); 520 - llc_pdu_init_as_rej_rsp(nskb, f_bit, llc->vR); 521 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 522 - if (rc) 523 goto free; 524 llc_conn_send_pdu(sk, nskb); 525 } ··· 531 int llc_conn_ac_send_rnr_cmd_p_set_1(struct sock *sk, struct sk_buff *skb) 532 { 533 int rc = -ENOBUFS; 534 - struct sk_buff *nskb = llc_alloc_frame(); 535 536 if (nskb) { 537 - struct llc_sock *llc = llc_sk(sk); 538 struct llc_sap *sap = llc->sap; 539 540 - nskb->dev = llc->dev; 541 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 542 llc->daddr.lsap, LLC_PDU_CMD); 543 llc_pdu_init_as_rnr_cmd(nskb, 1, llc->vR); 544 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 545 - if (rc) 546 goto free; 547 llc_conn_send_pdu(sk, nskb); 548 } ··· 555 int llc_conn_ac_send_rnr_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) 556 { 557 int rc = -ENOBUFS; 558 - struct sk_buff *nskb = llc_alloc_frame(); 559 560 if (nskb) { 561 - struct llc_sock *llc = llc_sk(sk); 562 struct llc_sap *sap = llc->sap; 563 - u8 f_bit = 1; 564 565 - nskb->dev = llc->dev; 566 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 567 llc->daddr.lsap, LLC_PDU_RSP); 568 - llc_pdu_init_as_rnr_rsp(nskb, f_bit, llc->vR); 569 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 570 - if (rc) 571 goto free; 572 llc_conn_send_pdu(sk, nskb); 573 } ··· 579 int llc_conn_ac_send_rnr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) 580 { 581 int rc = -ENOBUFS; 582 - struct sk_buff *nskb = llc_alloc_frame(); 583 584 if (nskb) { 585 - u8 f_bit = 0; 586 - struct llc_sock *llc = llc_sk(sk); 587 struct llc_sap *sap = llc->sap; 588 589 - nskb->dev = llc->dev; 590 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 591 llc->daddr.lsap, LLC_PDU_RSP); 592 - llc_pdu_init_as_rnr_rsp(nskb, f_bit, llc->vR); 593 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 594 - if (rc) 595 goto free; 596 llc_conn_send_pdu(sk, nskb); 597 } ··· 607 if (!llc->remote_busy_flag) { 608 llc->remote_busy_flag = 1; 609 mod_timer(&llc->busy_state_timer.timer, 610 - jiffies + llc->busy_state_timer.expire * HZ); 611 } 612 return 0; 613 } ··· 615 int llc_conn_ac_opt_send_rnr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) 616 { 617 int rc = -ENOBUFS; 618 - struct sk_buff *nskb = llc_alloc_frame(); 619 620 if (nskb) { 621 - struct llc_sock *llc = llc_sk(sk); 622 struct llc_sap *sap = llc->sap; 623 624 - nskb->dev = llc->dev; 625 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 626 llc->daddr.lsap, LLC_PDU_RSP); 627 llc_pdu_init_as_rnr_rsp(nskb, 0, llc->vR); 628 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 629 - if (rc) 630 goto free; 631 llc_conn_send_pdu(sk, nskb); 632 } ··· 639 int llc_conn_ac_send_rr_cmd_p_set_1(struct sock *sk, struct sk_buff *skb) 640 { 641 int rc = -ENOBUFS; 642 - struct sk_buff *nskb = llc_alloc_frame(); 643 644 if (nskb) { 645 - struct llc_sock *llc = llc_sk(sk); 646 struct llc_sap *sap = llc->sap; 647 648 - nskb->dev = llc->dev; 649 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 650 llc->daddr.lsap, LLC_PDU_CMD); 651 llc_pdu_init_as_rr_cmd(nskb, 1, llc->vR); 652 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 653 - if (rc) 654 goto free; 655 llc_conn_send_pdu(sk, nskb); 656 } ··· 663 int llc_conn_ac_send_rr_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) 664 { 665 int rc = -ENOBUFS; 666 - struct sk_buff *nskb = llc_alloc_frame(); 667 668 if (nskb) { 669 - struct llc_sock *llc = llc_sk(sk); 670 struct llc_sap *sap = llc->sap; 671 u8 f_bit = 1; 672 673 - nskb->dev = llc->dev; 674 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 675 llc->daddr.lsap, LLC_PDU_RSP); 676 llc_pdu_init_as_rr_rsp(nskb, f_bit, llc->vR); 677 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 678 - if (rc) 679 goto free; 680 llc_conn_send_pdu(sk, nskb); 681 } ··· 688 int llc_conn_ac_send_ack_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) 689 { 690 int rc = -ENOBUFS; 691 - struct sk_buff *nskb = llc_alloc_frame(); 692 693 if (nskb) { 694 - struct llc_sock *llc = llc_sk(sk); 695 struct llc_sap *sap = llc->sap; 696 - u8 f_bit = 1; 697 698 - nskb->dev = llc->dev; 699 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 700 llc->daddr.lsap, LLC_PDU_RSP); 701 - llc_pdu_init_as_rr_rsp(nskb, f_bit, llc->vR); 702 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 703 - if (rc) 704 goto free; 705 llc_conn_send_pdu(sk, nskb); 706 } ··· 712 int llc_conn_ac_send_rr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) 713 { 714 int rc = -ENOBUFS; 715 - struct sk_buff *nskb = llc_alloc_frame(); 716 717 if (nskb) { 718 - struct llc_sock *llc = llc_sk(sk); 719 struct llc_sap *sap = llc->sap; 720 721 - nskb->dev = llc->dev; 722 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 723 llc->daddr.lsap, LLC_PDU_RSP); 724 llc_pdu_init_as_rr_rsp(nskb, 0, llc->vR); 725 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 726 - if (rc) 727 goto free; 728 llc_conn_send_pdu(sk, nskb); 729 } ··· 736 int llc_conn_ac_send_ack_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) 737 { 738 int rc = -ENOBUFS; 739 - struct sk_buff *nskb = llc_alloc_frame(); 740 741 if (nskb) { 742 - struct llc_sock *llc = llc_sk(sk); 743 struct llc_sap *sap = llc->sap; 744 745 - nskb->dev = llc->dev; 746 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 747 llc->daddr.lsap, LLC_PDU_RSP); 748 llc_pdu_init_as_rr_rsp(nskb, 0, llc->vR); 749 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 750 - if (rc) 751 goto free; 752 llc_conn_send_pdu(sk, nskb); 753 } ··· 770 int llc_conn_ac_send_sabme_cmd_p_set_x(struct sock *sk, struct sk_buff *skb) 771 { 772 int rc = -ENOBUFS; 773 - struct sk_buff *nskb = llc_alloc_frame(); 774 struct llc_sock *llc = llc_sk(sk); 775 776 if (nskb) { 777 struct llc_sap *sap = llc->sap; ··· 779 780 if (llc->dev->flags & IFF_LOOPBACK) 781 dmac = llc->dev->dev_addr; 782 - nskb->dev = llc->dev; 783 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 784 llc->daddr.lsap, LLC_PDU_CMD); 785 llc_pdu_init_as_sabme_cmd(nskb, 1); 786 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, dmac); 787 - if (rc) 788 goto free; 789 llc_conn_send_pdu(sk, nskb); 790 llc_conn_set_p_flag(sk, 1); ··· 799 { 800 u8 f_bit; 801 int rc = -ENOBUFS; 802 - struct sk_buff *nskb = llc_alloc_frame(); 803 804 llc_pdu_decode_pf_bit(skb, &f_bit); 805 if (nskb) { 806 - struct llc_sock *llc = llc_sk(sk); 807 struct llc_sap *sap = llc->sap; 808 809 nskb->dev = llc->dev; ··· 811 llc->daddr.lsap, LLC_PDU_RSP); 812 llc_pdu_init_as_ua_rsp(nskb, f_bit); 813 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 814 - if (rc) 815 goto free; 816 llc_conn_send_pdu(sk, nskb); 817 } ··· 840 841 llc_conn_set_p_flag(sk, 1); 842 mod_timer(&llc->pf_cycle_timer.timer, 843 - jiffies + llc->pf_cycle_timer.expire * HZ); 844 return 0; 845 } 846 ··· 911 llc->daddr.lsap, LLC_PDU_RSP); 912 llc_pdu_init_as_i_cmd(skb, llc->ack_pf, llc->vS, llc->vR); 913 rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac); 914 - if (!rc) { 915 llc_conn_send_pdu(sk, skb); 916 llc_conn_ac_inc_vs_by_1(sk, skb); 917 } ··· 955 struct sk_buff *skb) 956 { 957 int rc = -ENOBUFS; 958 - struct sk_buff *nskb = llc_alloc_frame(); 959 960 if (nskb) { 961 - struct llc_sock *llc = llc_sk(sk); 962 struct llc_sap *sap = llc->sap; 963 964 - nskb->dev = llc->dev; 965 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 966 llc->daddr.lsap, LLC_PDU_RSP); 967 llc_pdu_init_as_rr_rsp(nskb, llc->ack_pf, llc->vR); 968 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 969 - if (rc) 970 goto free; 971 llc_conn_send_pdu(sk, nskb); 972 } ··· 1118 { 1119 struct llc_sock *llc = llc_sk(sk); 1120 1121 - mod_timer(&llc->ack_timer.timer, jiffies + llc->ack_timer.expire * HZ); 1122 return 0; 1123 } 1124 ··· 1127 struct llc_sock *llc = llc_sk(sk); 1128 1129 mod_timer(&llc->rej_sent_timer.timer, 1130 - jiffies + llc->rej_sent_timer.expire * HZ); 1131 return 0; 1132 } 1133 ··· 1138 1139 if (!timer_pending(&llc->ack_timer.timer)) 1140 mod_timer(&llc->ack_timer.timer, 1141 - jiffies + llc->ack_timer.expire * HZ); 1142 return 0; 1143 } 1144 ··· 1186 } 1187 if (unacked) 1188 mod_timer(&llc->ack_timer.timer, 1189 - jiffies + llc->ack_timer.expire * HZ); 1190 } else if (llc->failed_data_req) { 1191 u8 f_bit; 1192 ··· 1307 return 0; 1308 } 1309 1310 - int llc_conn_ac_inc_vs_by_1(struct sock *sk, struct sk_buff *skb) 1311 { 1312 llc_sk(sk)->vS = (llc_sk(sk)->vS + 1) % 128; 1313 return 0; 1314 } 1315 1316 - void llc_conn_pf_cycle_tmr_cb(unsigned long timeout_data) 1317 { 1318 struct sock *sk = (struct sock *)timeout_data; 1319 struct sk_buff *skb = alloc_skb(0, GFP_ATOMIC); ··· 1322 if (skb) { 1323 struct llc_conn_state_ev *ev = llc_conn_ev(skb); 1324 1325 - skb->sk = sk; 1326 - ev->type = LLC_CONN_EV_TYPE_P_TMR; 1327 llc_process_tmr_ev(sk, skb); 1328 } 1329 bh_unlock_sock(sk); 1330 } 1331 1332 void llc_conn_busy_tmr_cb(unsigned long timeout_data) 1333 { 1334 - struct sock *sk = (struct sock *)timeout_data; 1335 - struct sk_buff *skb = alloc_skb(0, GFP_ATOMIC); 1336 - 1337 - bh_lock_sock(sk); 1338 - if (skb) { 1339 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 1340 - 1341 - skb->sk = sk; 1342 - ev->type = LLC_CONN_EV_TYPE_BUSY_TMR; 1343 - llc_process_tmr_ev(sk, skb); 1344 - } 1345 - bh_unlock_sock(sk); 1346 } 1347 1348 void llc_conn_ack_tmr_cb(unsigned long timeout_data) 1349 { 1350 - struct sock* sk = (struct sock *)timeout_data; 1351 - struct sk_buff *skb = alloc_skb(0, GFP_ATOMIC); 1352 - 1353 - bh_lock_sock(sk); 1354 - if (skb) { 1355 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 1356 - 1357 - skb->sk = sk; 1358 - ev->type = LLC_CONN_EV_TYPE_ACK_TMR; 1359 - llc_process_tmr_ev(sk, skb); 1360 - } 1361 - bh_unlock_sock(sk); 1362 } 1363 1364 void llc_conn_rej_tmr_cb(unsigned long timeout_data) 1365 { 1366 - struct sock *sk = (struct sock *)timeout_data; 1367 - struct sk_buff *skb = alloc_skb(0, GFP_ATOMIC); 1368 - 1369 - bh_lock_sock(sk); 1370 - if (skb) { 1371 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 1372 - 1373 - skb->sk = sk; 1374 - ev->type = LLC_CONN_EV_TYPE_REJ_TMR; 1375 - llc_process_tmr_ev(sk, skb); 1376 - } 1377 - bh_unlock_sock(sk); 1378 } 1379 1380 int llc_conn_ac_rst_vs(struct sock *sk, struct sk_buff *skb)
··· 60 61 int llc_conn_ac_conn_ind(struct sock *sk, struct sk_buff *skb) 62 { 63 + struct llc_conn_state_ev *ev = llc_conn_ev(skb); 64 65 + ev->ind_prim = LLC_CONN_PRIM; 66 + return 0; 67 } 68 69 int llc_conn_ac_conn_confirm(struct sock *sk, struct sk_buff *skb) ··· 120 reason = LLC_DISC_REASON_RX_DISC_CMD_PDU; 121 } else if (ev->type == LLC_CONN_EV_TYPE_ACK_TMR) 122 reason = LLC_DISC_REASON_ACK_TMR_EXP; 123 + else 124 rc = -EINVAL; 125 if (!rc) { 126 ev->reason = reason; 127 ev->ind_prim = LLC_DISC_PRIM; ··· 160 LLC_U_PDU_CMD(pdu) == LLC_2_PDU_CMD_SABME) { 161 reason = LLC_RESET_REASON_REMOTE; 162 rc = 0; 163 } 164 break; 165 case LLC_CONN_EV_TYPE_ACK_TMR: ··· 172 if (llc->retry_count > llc->n2) { 173 reason = LLC_RESET_REASON_LOCAL; 174 rc = 0; 175 + } 176 break; 177 } 178 if (!rc) { ··· 217 int llc_conn_ac_send_disc_cmd_p_set_x(struct sock *sk, struct sk_buff *skb) 218 { 219 int rc = -ENOBUFS; 220 + struct llc_sock *llc = llc_sk(sk); 221 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 222 223 if (nskb) { 224 struct llc_sap *sap = llc->sap; 225 226 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 227 llc->daddr.lsap, LLC_PDU_CMD); 228 llc_pdu_init_as_disc_cmd(nskb, 1); 229 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 230 + if (unlikely(rc)) 231 goto free; 232 llc_conn_send_pdu(sk, nskb); 233 llc_conn_ac_set_p_flag_1(sk, skb); ··· 243 int llc_conn_ac_send_dm_rsp_f_set_p(struct sock *sk, struct sk_buff *skb) 244 { 245 int rc = -ENOBUFS; 246 + struct llc_sock *llc = llc_sk(sk); 247 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 248 249 if (nskb) { 250 struct llc_sap *sap = llc->sap; 251 u8 f_bit; 252 253 llc_pdu_decode_pf_bit(skb, &f_bit); 254 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 255 llc->daddr.lsap, LLC_PDU_RSP); 256 llc_pdu_init_as_dm_rsp(nskb, f_bit); 257 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 258 + if (unlikely(rc)) 259 goto free; 260 llc_conn_send_pdu(sk, nskb); 261 } ··· 270 int llc_conn_ac_send_dm_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) 271 { 272 int rc = -ENOBUFS; 273 + struct llc_sock *llc = llc_sk(sk); 274 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 275 276 if (nskb) { 277 struct llc_sap *sap = llc->sap; 278 279 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 280 llc->daddr.lsap, LLC_PDU_RSP); 281 + llc_pdu_init_as_dm_rsp(nskb, 1); 282 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 283 + if (unlikely(rc)) 284 goto free; 285 llc_conn_send_pdu(sk, nskb); 286 } ··· 306 llc_pdu_decode_pf_bit(skb, &f_bit); 307 else 308 f_bit = 0; 309 + nskb = llc_alloc_frame(sk, llc->dev); 310 if (nskb) { 311 struct llc_sap *sap = llc->sap; 312 313 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 314 llc->daddr.lsap, LLC_PDU_RSP); 315 llc_pdu_init_as_frmr_rsp(nskb, pdu, f_bit, llc->vS, 316 llc->vR, INCORRECT); 317 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 318 + if (unlikely(rc)) 319 goto free; 320 llc_conn_send_pdu(sk, nskb); 321 } ··· 330 int llc_conn_ac_resend_frmr_rsp_f_set_0(struct sock *sk, struct sk_buff *skb) 331 { 332 int rc = -ENOBUFS; 333 + struct llc_sock *llc = llc_sk(sk); 334 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 335 336 if (nskb) { 337 struct llc_sap *sap = llc->sap; 338 struct llc_pdu_sn *pdu = (struct llc_pdu_sn *)&llc->rx_pdu_hdr; 339 340 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 341 llc->daddr.lsap, LLC_PDU_RSP); 342 + llc_pdu_init_as_frmr_rsp(nskb, pdu, 0, llc->vS, 343 llc->vR, INCORRECT); 344 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 345 + if (unlikely(rc)) 346 goto free; 347 llc_conn_send_pdu(sk, nskb); 348 } ··· 360 u8 f_bit; 361 int rc = -ENOBUFS; 362 struct sk_buff *nskb; 363 + struct llc_sock *llc = llc_sk(sk); 364 365 llc_pdu_decode_pf_bit(skb, &f_bit); 366 + nskb = llc_alloc_frame(sk, llc->dev); 367 if (nskb) { 368 struct llc_sap *sap = llc->sap; 369 struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 370 371 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 372 llc->daddr.lsap, LLC_PDU_RSP); 373 llc_pdu_init_as_frmr_rsp(nskb, pdu, f_bit, llc->vS, 374 llc->vR, INCORRECT); 375 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 376 + if (unlikely(rc)) 377 goto free; 378 llc_conn_send_pdu(sk, nskb); 379 } ··· 395 llc->daddr.lsap, LLC_PDU_CMD); 396 llc_pdu_init_as_i_cmd(skb, 1, llc->vS, llc->vR); 397 rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac); 398 + if (likely(!rc)) { 399 llc_conn_send_pdu(sk, skb); 400 llc_conn_ac_inc_vs_by_1(sk, skb); 401 } ··· 412 llc->daddr.lsap, LLC_PDU_CMD); 413 llc_pdu_init_as_i_cmd(skb, 0, llc->vS, llc->vR); 414 rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac); 415 + if (likely(!rc)) { 416 llc_conn_send_pdu(sk, skb); 417 llc_conn_ac_inc_vs_by_1(sk, skb); 418 } ··· 429 llc->daddr.lsap, LLC_PDU_CMD); 430 llc_pdu_init_as_i_cmd(skb, 0, llc->vS, llc->vR); 431 rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac); 432 + if (likely(!rc)) { 433 llc_conn_send_pdu(sk, skb); 434 llc_conn_ac_inc_vs_by_1(sk, skb); 435 } ··· 451 u8 nr; 452 struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 453 int rc = -ENOBUFS; 454 + struct llc_sock *llc = llc_sk(sk); 455 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 456 457 if (nskb) { 458 struct llc_sap *sap = llc->sap; 459 460 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 461 llc->daddr.lsap, LLC_PDU_RSP); 462 llc_pdu_init_as_rr_rsp(nskb, 0, llc->vR); 463 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 464 + if (likely(!rc)) 465 llc_conn_send_pdu(sk, nskb); 466 else 467 kfree_skb(skb); ··· 487 int llc_conn_ac_send_rej_cmd_p_set_1(struct sock *sk, struct sk_buff *skb) 488 { 489 int rc = -ENOBUFS; 490 + struct llc_sock *llc = llc_sk(sk); 491 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 492 493 if (nskb) { 494 struct llc_sap *sap = llc->sap; 495 496 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 497 llc->daddr.lsap, LLC_PDU_CMD); 498 llc_pdu_init_as_rej_cmd(nskb, 1, llc->vR); 499 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 500 + if (unlikely(rc)) 501 goto free; 502 llc_conn_send_pdu(sk, nskb); 503 } ··· 512 int llc_conn_ac_send_rej_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) 513 { 514 int rc = -ENOBUFS; 515 + struct llc_sock *llc = llc_sk(sk); 516 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 517 518 if (nskb) { 519 struct llc_sap *sap = llc->sap; 520 521 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 522 llc->daddr.lsap, LLC_PDU_RSP); 523 + llc_pdu_init_as_rej_rsp(nskb, 1, llc->vR); 524 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 525 + if (unlikely(rc)) 526 goto free; 527 llc_conn_send_pdu(sk, nskb); 528 } ··· 538 int llc_conn_ac_send_rej_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) 539 { 540 int rc = -ENOBUFS; 541 + struct llc_sock *llc = llc_sk(sk); 542 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 543 544 if (nskb) { 545 struct llc_sap *sap = llc->sap; 546 547 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 548 llc->daddr.lsap, LLC_PDU_RSP); 549 + llc_pdu_init_as_rej_rsp(nskb, 0, llc->vR); 550 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 551 + if (unlikely(rc)) 552 goto free; 553 llc_conn_send_pdu(sk, nskb); 554 } ··· 564 int llc_conn_ac_send_rnr_cmd_p_set_1(struct sock *sk, struct sk_buff *skb) 565 { 566 int rc = -ENOBUFS; 567 + struct llc_sock *llc = llc_sk(sk); 568 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 569 570 if (nskb) { 571 struct llc_sap *sap = llc->sap; 572 573 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 574 llc->daddr.lsap, LLC_PDU_CMD); 575 llc_pdu_init_as_rnr_cmd(nskb, 1, llc->vR); 576 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 577 + if (unlikely(rc)) 578 goto free; 579 llc_conn_send_pdu(sk, nskb); 580 } ··· 589 int llc_conn_ac_send_rnr_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) 590 { 591 int rc = -ENOBUFS; 592 + struct llc_sock *llc = llc_sk(sk); 593 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 594 595 if (nskb) { 596 struct llc_sap *sap = llc->sap; 597 598 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 599 llc->daddr.lsap, LLC_PDU_RSP); 600 + llc_pdu_init_as_rnr_rsp(nskb, 1, llc->vR); 601 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 602 + if (unlikely(rc)) 603 goto free; 604 llc_conn_send_pdu(sk, nskb); 605 } ··· 615 int llc_conn_ac_send_rnr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) 616 { 617 int rc = -ENOBUFS; 618 + struct llc_sock *llc = llc_sk(sk); 619 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 620 621 if (nskb) { 622 struct llc_sap *sap = llc->sap; 623 624 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 625 llc->daddr.lsap, LLC_PDU_RSP); 626 + llc_pdu_init_as_rnr_rsp(nskb, 0, llc->vR); 627 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 628 + if (unlikely(rc)) 629 goto free; 630 llc_conn_send_pdu(sk, nskb); 631 } ··· 645 if (!llc->remote_busy_flag) { 646 llc->remote_busy_flag = 1; 647 mod_timer(&llc->busy_state_timer.timer, 648 + jiffies + llc->busy_state_timer.expire); 649 } 650 return 0; 651 } ··· 653 int llc_conn_ac_opt_send_rnr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) 654 { 655 int rc = -ENOBUFS; 656 + struct llc_sock *llc = llc_sk(sk); 657 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 658 659 if (nskb) { 660 struct llc_sap *sap = llc->sap; 661 662 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 663 llc->daddr.lsap, LLC_PDU_RSP); 664 llc_pdu_init_as_rnr_rsp(nskb, 0, llc->vR); 665 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 666 + if (unlikely(rc)) 667 goto free; 668 llc_conn_send_pdu(sk, nskb); 669 } ··· 678 int llc_conn_ac_send_rr_cmd_p_set_1(struct sock *sk, struct sk_buff *skb) 679 { 680 int rc = -ENOBUFS; 681 + struct llc_sock *llc = llc_sk(sk); 682 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 683 684 if (nskb) { 685 struct llc_sap *sap = llc->sap; 686 687 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 688 llc->daddr.lsap, LLC_PDU_CMD); 689 llc_pdu_init_as_rr_cmd(nskb, 1, llc->vR); 690 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 691 + if (unlikely(rc)) 692 goto free; 693 llc_conn_send_pdu(sk, nskb); 694 } ··· 703 int llc_conn_ac_send_rr_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) 704 { 705 int rc = -ENOBUFS; 706 + struct llc_sock *llc = llc_sk(sk); 707 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 708 709 if (nskb) { 710 struct llc_sap *sap = llc->sap; 711 u8 f_bit = 1; 712 713 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 714 llc->daddr.lsap, LLC_PDU_RSP); 715 llc_pdu_init_as_rr_rsp(nskb, f_bit, llc->vR); 716 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 717 + if (unlikely(rc)) 718 goto free; 719 llc_conn_send_pdu(sk, nskb); 720 } ··· 729 int llc_conn_ac_send_ack_rsp_f_set_1(struct sock *sk, struct sk_buff *skb) 730 { 731 int rc = -ENOBUFS; 732 + struct llc_sock *llc = llc_sk(sk); 733 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 734 735 if (nskb) { 736 struct llc_sap *sap = llc->sap; 737 738 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 739 llc->daddr.lsap, LLC_PDU_RSP); 740 + llc_pdu_init_as_rr_rsp(nskb, 1, llc->vR); 741 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 742 + if (unlikely(rc)) 743 goto free; 744 llc_conn_send_pdu(sk, nskb); 745 } ··· 755 int llc_conn_ac_send_rr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) 756 { 757 int rc = -ENOBUFS; 758 + struct llc_sock *llc = llc_sk(sk); 759 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 760 761 if (nskb) { 762 struct llc_sap *sap = llc->sap; 763 764 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 765 llc->daddr.lsap, LLC_PDU_RSP); 766 llc_pdu_init_as_rr_rsp(nskb, 0, llc->vR); 767 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 768 + if (unlikely(rc)) 769 goto free; 770 llc_conn_send_pdu(sk, nskb); 771 } ··· 780 int llc_conn_ac_send_ack_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) 781 { 782 int rc = -ENOBUFS; 783 + struct llc_sock *llc = llc_sk(sk); 784 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 785 786 if (nskb) { 787 struct llc_sap *sap = llc->sap; 788 789 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 790 llc->daddr.lsap, LLC_PDU_RSP); 791 llc_pdu_init_as_rr_rsp(nskb, 0, llc->vR); 792 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 793 + if (unlikely(rc)) 794 goto free; 795 llc_conn_send_pdu(sk, nskb); 796 } ··· 815 int llc_conn_ac_send_sabme_cmd_p_set_x(struct sock *sk, struct sk_buff *skb) 816 { 817 int rc = -ENOBUFS; 818 struct llc_sock *llc = llc_sk(sk); 819 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 820 821 if (nskb) { 822 struct llc_sap *sap = llc->sap; ··· 824 825 if (llc->dev->flags & IFF_LOOPBACK) 826 dmac = llc->dev->dev_addr; 827 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, 828 llc->daddr.lsap, LLC_PDU_CMD); 829 llc_pdu_init_as_sabme_cmd(nskb, 1); 830 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, dmac); 831 + if (unlikely(rc)) 832 goto free; 833 llc_conn_send_pdu(sk, nskb); 834 llc_conn_set_p_flag(sk, 1); ··· 845 { 846 u8 f_bit; 847 int rc = -ENOBUFS; 848 + struct llc_sock *llc = llc_sk(sk); 849 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 850 851 llc_pdu_decode_pf_bit(skb, &f_bit); 852 if (nskb) { 853 struct llc_sap *sap = llc->sap; 854 855 nskb->dev = llc->dev; ··· 857 llc->daddr.lsap, LLC_PDU_RSP); 858 llc_pdu_init_as_ua_rsp(nskb, f_bit); 859 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 860 + if (unlikely(rc)) 861 goto free; 862 llc_conn_send_pdu(sk, nskb); 863 } ··· 886 887 llc_conn_set_p_flag(sk, 1); 888 mod_timer(&llc->pf_cycle_timer.timer, 889 + jiffies + llc->pf_cycle_timer.expire); 890 return 0; 891 } 892 ··· 957 llc->daddr.lsap, LLC_PDU_RSP); 958 llc_pdu_init_as_i_cmd(skb, llc->ack_pf, llc->vS, llc->vR); 959 rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac); 960 + if (likely(!rc)) { 961 llc_conn_send_pdu(sk, skb); 962 llc_conn_ac_inc_vs_by_1(sk, skb); 963 } ··· 1001 struct sk_buff *skb) 1002 { 1003 int rc = -ENOBUFS; 1004 + struct llc_sock *llc = llc_sk(sk); 1005 + struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev); 1006 1007 if (nskb) { 1008 struct llc_sap *sap = llc->sap; 1009 1010 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap, 1011 llc->daddr.lsap, LLC_PDU_RSP); 1012 llc_pdu_init_as_rr_rsp(nskb, llc->ack_pf, llc->vR); 1013 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac); 1014 + if (unlikely(rc)) 1015 goto free; 1016 llc_conn_send_pdu(sk, nskb); 1017 } ··· 1165 { 1166 struct llc_sock *llc = llc_sk(sk); 1167 1168 + mod_timer(&llc->ack_timer.timer, jiffies + llc->ack_timer.expire); 1169 return 0; 1170 } 1171 ··· 1174 struct llc_sock *llc = llc_sk(sk); 1175 1176 mod_timer(&llc->rej_sent_timer.timer, 1177 + jiffies + llc->rej_sent_timer.expire); 1178 return 0; 1179 } 1180 ··· 1185 1186 if (!timer_pending(&llc->ack_timer.timer)) 1187 mod_timer(&llc->ack_timer.timer, 1188 + jiffies + llc->ack_timer.expire); 1189 return 0; 1190 } 1191 ··· 1233 } 1234 if (unacked) 1235 mod_timer(&llc->ack_timer.timer, 1236 + jiffies + llc->ack_timer.expire); 1237 } else if (llc->failed_data_req) { 1238 u8 f_bit; 1239 ··· 1354 return 0; 1355 } 1356 1357 + static int llc_conn_ac_inc_vs_by_1(struct sock *sk, struct sk_buff *skb) 1358 { 1359 llc_sk(sk)->vS = (llc_sk(sk)->vS + 1) % 128; 1360 return 0; 1361 } 1362 1363 + static void llc_conn_tmr_common_cb(unsigned long timeout_data, u8 type) 1364 { 1365 struct sock *sk = (struct sock *)timeout_data; 1366 struct sk_buff *skb = alloc_skb(0, GFP_ATOMIC); ··· 1369 if (skb) { 1370 struct llc_conn_state_ev *ev = llc_conn_ev(skb); 1371 1372 + skb_set_owner_r(skb, sk); 1373 + ev->type = type; 1374 llc_process_tmr_ev(sk, skb); 1375 } 1376 bh_unlock_sock(sk); 1377 + } 1378 + 1379 + void llc_conn_pf_cycle_tmr_cb(unsigned long timeout_data) 1380 + { 1381 + llc_conn_tmr_common_cb(timeout_data, LLC_CONN_EV_TYPE_P_TMR); 1382 } 1383 1384 void llc_conn_busy_tmr_cb(unsigned long timeout_data) 1385 { 1386 + llc_conn_tmr_common_cb(timeout_data, LLC_CONN_EV_TYPE_BUSY_TMR); 1387 } 1388 1389 void llc_conn_ack_tmr_cb(unsigned long timeout_data) 1390 { 1391 + llc_conn_tmr_common_cb(timeout_data, LLC_CONN_EV_TYPE_ACK_TMR); 1392 } 1393 1394 void llc_conn_rej_tmr_cb(unsigned long timeout_data) 1395 { 1396 + llc_conn_tmr_common_cb(timeout_data, LLC_CONN_EV_TYPE_REJ_TMR); 1397 } 1398 1399 int llc_conn_ac_rst_vs(struct sock *sk, struct sk_buff *skb)
+68 -89
net/llc/llc_c_ev.c
··· 37 #include <net/llc_conn.h> 38 #include <net/llc_sap.h> 39 #include <net/sock.h> 40 #include <net/llc_c_ev.h> 41 #include <net/llc_pdu.h> 42 ··· 46 #else 47 #define dprintk(args...) 48 #endif 49 - 50 - extern u16 llc_circular_between(u8 a, u8 b, u8 c); 51 52 /** 53 * llc_util_ns_inside_rx_window - check if sequence number is in rx window ··· 98 99 int llc_conn_ev_conn_req(struct sock *sk, struct sk_buff *skb) 100 { 101 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 102 103 return ev->prim == LLC_CONN_PRIM && 104 ev->prim_type == LLC_PRIM_TYPE_REQ ? 0 : 1; ··· 106 107 int llc_conn_ev_data_req(struct sock *sk, struct sk_buff *skb) 108 { 109 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 110 111 return ev->prim == LLC_DATA_PRIM && 112 ev->prim_type == LLC_PRIM_TYPE_REQ ? 0 : 1; ··· 114 115 int llc_conn_ev_disc_req(struct sock *sk, struct sk_buff *skb) 116 { 117 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 118 119 return ev->prim == LLC_DISC_PRIM && 120 ev->prim_type == LLC_PRIM_TYPE_REQ ? 0 : 1; ··· 122 123 int llc_conn_ev_rst_req(struct sock *sk, struct sk_buff *skb) 124 { 125 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 126 127 return ev->prim == LLC_RESET_PRIM && 128 ev->prim_type == LLC_PRIM_TYPE_REQ ? 0 : 1; ··· 130 131 int llc_conn_ev_local_busy_detected(struct sock *sk, struct sk_buff *skb) 132 { 133 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 134 135 return ev->type == LLC_CONN_EV_TYPE_SIMPLE && 136 ev->prim_type == LLC_CONN_EV_LOCAL_BUSY_DETECTED ? 0 : 1; ··· 138 139 int llc_conn_ev_local_busy_cleared(struct sock *sk, struct sk_buff *skb) 140 { 141 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 142 143 return ev->type == LLC_CONN_EV_TYPE_SIMPLE && 144 ev->prim_type == LLC_CONN_EV_LOCAL_BUSY_CLEARED ? 0 : 1; ··· 151 152 int llc_conn_ev_rx_disc_cmd_pbit_set_x(struct sock *sk, struct sk_buff *skb) 153 { 154 - struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); 155 156 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_U(pdu) && 157 LLC_U_PDU_CMD(pdu) == LLC_2_PDU_CMD_DISC ? 0 : 1; ··· 159 160 int llc_conn_ev_rx_dm_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb) 161 { 162 - struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); 163 164 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_U(pdu) && 165 LLC_U_PDU_RSP(pdu) == LLC_2_PDU_RSP_DM ? 0 : 1; ··· 167 168 int llc_conn_ev_rx_frmr_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb) 169 { 170 - struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); 171 172 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_U(pdu) && 173 LLC_U_PDU_RSP(pdu) == LLC_2_PDU_RSP_FRMR ? 0 : 1; ··· 175 176 int llc_conn_ev_rx_i_cmd_pbit_set_0(struct sock *sk, struct sk_buff *skb) 177 { 178 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 179 180 return llc_conn_space(sk, skb) && 181 LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ··· 185 186 int llc_conn_ev_rx_i_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb) 187 { 188 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 189 190 return llc_conn_space(sk, skb) && 191 LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ··· 196 int llc_conn_ev_rx_i_cmd_pbit_set_0_unexpd_ns(struct sock *sk, 197 struct sk_buff *skb) 198 { 199 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 200 - u8 vr = llc_sk(sk)->vR; 201 - u8 ns = LLC_I_GET_NS(pdu); 202 203 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) && 204 LLC_I_PF_IS_0(pdu) && ns != vr && ··· 208 int llc_conn_ev_rx_i_cmd_pbit_set_1_unexpd_ns(struct sock *sk, 209 struct sk_buff *skb) 210 { 211 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 212 - u8 vr = llc_sk(sk)->vR; 213 - u8 ns = LLC_I_GET_NS(pdu); 214 215 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) && 216 LLC_I_PF_IS_1(pdu) && ns != vr && ··· 220 int llc_conn_ev_rx_i_cmd_pbit_set_x_inval_ns(struct sock *sk, 221 struct sk_buff *skb) 222 { 223 - struct llc_pdu_sn * pdu = llc_pdu_sn_hdr(skb); 224 - u8 vr = llc_sk(sk)->vR; 225 - u8 ns = LLC_I_GET_NS(pdu); 226 - u16 rc = LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ns != vr && 227 llc_util_ns_inside_rx_window(ns, vr, llc_sk(sk)->rw) ? 0 : 1; 228 if (!rc) 229 dprintk("%s: matched, state=%d, ns=%d, vr=%d\n", ··· 234 235 int llc_conn_ev_rx_i_rsp_fbit_set_0(struct sock *sk, struct sk_buff *skb) 236 { 237 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 238 239 return llc_conn_space(sk, skb) && 240 LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ··· 244 245 int llc_conn_ev_rx_i_rsp_fbit_set_1(struct sock *sk, struct sk_buff *skb) 246 { 247 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 248 249 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && 250 LLC_I_PF_IS_1(pdu) && ··· 253 254 int llc_conn_ev_rx_i_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb) 255 { 256 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 257 258 return llc_conn_space(sk, skb) && 259 LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ··· 263 int llc_conn_ev_rx_i_rsp_fbit_set_0_unexpd_ns(struct sock *sk, 264 struct sk_buff *skb) 265 { 266 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 267 - u8 vr = llc_sk(sk)->vR; 268 - u8 ns = LLC_I_GET_NS(pdu); 269 270 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && 271 LLC_I_PF_IS_0(pdu) && ns != vr && ··· 275 int llc_conn_ev_rx_i_rsp_fbit_set_1_unexpd_ns(struct sock *sk, 276 struct sk_buff *skb) 277 { 278 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 279 - u8 vr = llc_sk(sk)->vR; 280 - u8 ns = LLC_I_GET_NS(pdu); 281 282 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && 283 LLC_I_PF_IS_1(pdu) && ns != vr && ··· 287 int llc_conn_ev_rx_i_rsp_fbit_set_x_unexpd_ns(struct sock *sk, 288 struct sk_buff *skb) 289 { 290 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 291 - u8 vr = llc_sk(sk)->vR; 292 - u8 ns = LLC_I_GET_NS(pdu); 293 294 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ns != vr && 295 !llc_util_ns_inside_rx_window(ns, vr, llc_sk(sk)->rw) ? 0 : 1; ··· 298 int llc_conn_ev_rx_i_rsp_fbit_set_x_inval_ns(struct sock *sk, 299 struct sk_buff *skb) 300 { 301 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 302 - u8 vr = llc_sk(sk)->vR; 303 - u8 ns = LLC_I_GET_NS(pdu); 304 - u16 rc = LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ns != vr && 305 llc_util_ns_inside_rx_window(ns, vr, llc_sk(sk)->rw) ? 0 : 1; 306 if (!rc) 307 dprintk("%s: matched, state=%d, ns=%d, vr=%d\n", ··· 312 313 int llc_conn_ev_rx_rej_cmd_pbit_set_0(struct sock *sk, struct sk_buff *skb) 314 { 315 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 316 317 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 318 LLC_S_PF_IS_0(pdu) && ··· 321 322 int llc_conn_ev_rx_rej_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb) 323 { 324 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 325 326 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 327 LLC_S_PF_IS_1(pdu) && ··· 330 331 int llc_conn_ev_rx_rej_rsp_fbit_set_0(struct sock *sk, struct sk_buff *skb) 332 { 333 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 334 335 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 336 LLC_S_PF_IS_0(pdu) && ··· 339 340 int llc_conn_ev_rx_rej_rsp_fbit_set_1(struct sock *sk, struct sk_buff *skb) 341 { 342 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 343 344 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 345 LLC_S_PF_IS_1(pdu) && ··· 348 349 int llc_conn_ev_rx_rej_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb) 350 { 351 - struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); 352 353 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 354 LLC_S_PDU_RSP(pdu) == LLC_2_PDU_RSP_REJ ? 0 : 1; ··· 356 357 int llc_conn_ev_rx_rnr_cmd_pbit_set_0(struct sock *sk, struct sk_buff *skb) 358 { 359 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 360 361 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 362 LLC_S_PF_IS_0(pdu) && ··· 365 366 int llc_conn_ev_rx_rnr_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb) 367 { 368 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 369 370 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 371 LLC_S_PF_IS_1(pdu) && ··· 374 375 int llc_conn_ev_rx_rnr_rsp_fbit_set_0(struct sock *sk, struct sk_buff *skb) 376 { 377 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 378 379 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 380 LLC_S_PF_IS_0(pdu) && ··· 383 384 int llc_conn_ev_rx_rnr_rsp_fbit_set_1(struct sock *sk, struct sk_buff *skb) 385 { 386 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 387 388 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 389 LLC_S_PF_IS_1(pdu) && ··· 392 393 int llc_conn_ev_rx_rr_cmd_pbit_set_0(struct sock *sk, struct sk_buff *skb) 394 { 395 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 396 397 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 398 LLC_S_PF_IS_0(pdu) && ··· 401 402 int llc_conn_ev_rx_rr_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb) 403 { 404 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 405 406 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 407 LLC_S_PF_IS_1(pdu) && ··· 410 411 int llc_conn_ev_rx_rr_rsp_fbit_set_0(struct sock *sk, struct sk_buff *skb) 412 { 413 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 414 415 return llc_conn_space(sk, skb) && 416 LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) && ··· 420 421 int llc_conn_ev_rx_rr_rsp_fbit_set_1(struct sock *sk, struct sk_buff *skb) 422 { 423 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 424 425 return llc_conn_space(sk, skb) && 426 LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) && ··· 430 431 int llc_conn_ev_rx_sabme_cmd_pbit_set_x(struct sock *sk, struct sk_buff *skb) 432 { 433 - struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); 434 435 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_U(pdu) && 436 LLC_U_PDU_CMD(pdu) == LLC_2_PDU_CMD_SABME ? 0 : 1; ··· 447 int llc_conn_ev_rx_xxx_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb) 448 { 449 u16 rc = 1; 450 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 451 452 if (LLC_PDU_IS_CMD(pdu)) { 453 if (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) { ··· 462 int llc_conn_ev_rx_xxx_cmd_pbit_set_x(struct sock *sk, struct sk_buff *skb) 463 { 464 u16 rc = 1; 465 - struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); 466 467 if (LLC_PDU_IS_CMD(pdu)) { 468 if (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) ··· 478 return rc; 479 } 480 481 - int llc_conn_ev_rx_xxx_rsp_fbit_set_1(struct sock *sk, struct sk_buff *skb) 482 - { 483 - u16 rc = 1; 484 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 485 - 486 - if (LLC_PDU_IS_RSP(pdu)) { 487 - if (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) { 488 - if (LLC_I_PF_IS_1(pdu)) 489 - rc = 0; 490 - } else if (LLC_PDU_TYPE_IS_U(pdu)) 491 - switch (LLC_U_PDU_RSP(pdu)) { 492 - case LLC_2_PDU_RSP_UA: 493 - case LLC_2_PDU_RSP_DM: 494 - case LLC_2_PDU_RSP_FRMR: 495 - if (LLC_U_PF_IS_1(pdu)) 496 - rc = 0; 497 - break; 498 - } 499 - } 500 - return rc; 501 - } 502 - 503 int llc_conn_ev_rx_xxx_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb) 504 { 505 u16 rc = 1; 506 - struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); 507 508 if (LLC_PDU_IS_RSP(pdu)) { 509 if (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) ··· 503 struct sk_buff *skb) 504 { 505 u16 rc = 1; 506 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 507 - u8 vs = llc_sk(sk)->vS; 508 - u8 nr = LLC_I_GET_NR(pdu); 509 510 if (LLC_PDU_IS_CMD(pdu) && 511 (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) && ··· 521 struct sk_buff *skb) 522 { 523 u16 rc = 1; 524 - struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 525 - u8 vs = llc_sk(sk)->vS; 526 - u8 nr = LLC_I_GET_NR(pdu); 527 528 if (LLC_PDU_IS_RSP(pdu) && 529 (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) && ··· 542 543 int llc_conn_ev_p_tmr_exp(struct sock *sk, struct sk_buff *skb) 544 { 545 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 546 547 return ev->type != LLC_CONN_EV_TYPE_P_TMR; 548 } 549 550 int llc_conn_ev_ack_tmr_exp(struct sock *sk, struct sk_buff *skb) 551 { 552 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 553 554 return ev->type != LLC_CONN_EV_TYPE_ACK_TMR; 555 } 556 557 int llc_conn_ev_rej_tmr_exp(struct sock *sk, struct sk_buff *skb) 558 { 559 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 560 561 return ev->type != LLC_CONN_EV_TYPE_REJ_TMR; 562 } 563 564 int llc_conn_ev_busy_tmr_exp(struct sock *sk, struct sk_buff *skb) 565 { 566 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 567 568 return ev->type != LLC_CONN_EV_TYPE_BUSY_TMR; 569 } ··· 575 576 int llc_conn_ev_tx_buffer_full(struct sock *sk, struct sk_buff *skb) 577 { 578 - struct llc_conn_state_ev *ev = llc_conn_ev(skb); 579 580 return ev->type == LLC_CONN_EV_TYPE_SIMPLE && 581 ev->prim_type == LLC_CONN_EV_TX_BUFF_FULL ? 0 : 1;
··· 37 #include <net/llc_conn.h> 38 #include <net/llc_sap.h> 39 #include <net/sock.h> 40 + #include <net/llc_c_ac.h> 41 #include <net/llc_c_ev.h> 42 #include <net/llc_pdu.h> 43 ··· 45 #else 46 #define dprintk(args...) 47 #endif 48 49 /** 50 * llc_util_ns_inside_rx_window - check if sequence number is in rx window ··· 99 100 int llc_conn_ev_conn_req(struct sock *sk, struct sk_buff *skb) 101 { 102 + const struct llc_conn_state_ev *ev = llc_conn_ev(skb); 103 104 return ev->prim == LLC_CONN_PRIM && 105 ev->prim_type == LLC_PRIM_TYPE_REQ ? 0 : 1; ··· 107 108 int llc_conn_ev_data_req(struct sock *sk, struct sk_buff *skb) 109 { 110 + const struct llc_conn_state_ev *ev = llc_conn_ev(skb); 111 112 return ev->prim == LLC_DATA_PRIM && 113 ev->prim_type == LLC_PRIM_TYPE_REQ ? 0 : 1; ··· 115 116 int llc_conn_ev_disc_req(struct sock *sk, struct sk_buff *skb) 117 { 118 + const struct llc_conn_state_ev *ev = llc_conn_ev(skb); 119 120 return ev->prim == LLC_DISC_PRIM && 121 ev->prim_type == LLC_PRIM_TYPE_REQ ? 0 : 1; ··· 123 124 int llc_conn_ev_rst_req(struct sock *sk, struct sk_buff *skb) 125 { 126 + const struct llc_conn_state_ev *ev = llc_conn_ev(skb); 127 128 return ev->prim == LLC_RESET_PRIM && 129 ev->prim_type == LLC_PRIM_TYPE_REQ ? 0 : 1; ··· 131 132 int llc_conn_ev_local_busy_detected(struct sock *sk, struct sk_buff *skb) 133 { 134 + const struct llc_conn_state_ev *ev = llc_conn_ev(skb); 135 136 return ev->type == LLC_CONN_EV_TYPE_SIMPLE && 137 ev->prim_type == LLC_CONN_EV_LOCAL_BUSY_DETECTED ? 0 : 1; ··· 139 140 int llc_conn_ev_local_busy_cleared(struct sock *sk, struct sk_buff *skb) 141 { 142 + const struct llc_conn_state_ev *ev = llc_conn_ev(skb); 143 144 return ev->type == LLC_CONN_EV_TYPE_SIMPLE && 145 ev->prim_type == LLC_CONN_EV_LOCAL_BUSY_CLEARED ? 0 : 1; ··· 152 153 int llc_conn_ev_rx_disc_cmd_pbit_set_x(struct sock *sk, struct sk_buff *skb) 154 { 155 + const struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); 156 157 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_U(pdu) && 158 LLC_U_PDU_CMD(pdu) == LLC_2_PDU_CMD_DISC ? 0 : 1; ··· 160 161 int llc_conn_ev_rx_dm_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb) 162 { 163 + const struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); 164 165 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_U(pdu) && 166 LLC_U_PDU_RSP(pdu) == LLC_2_PDU_RSP_DM ? 0 : 1; ··· 168 169 int llc_conn_ev_rx_frmr_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb) 170 { 171 + const struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); 172 173 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_U(pdu) && 174 LLC_U_PDU_RSP(pdu) == LLC_2_PDU_RSP_FRMR ? 0 : 1; ··· 176 177 int llc_conn_ev_rx_i_cmd_pbit_set_0(struct sock *sk, struct sk_buff *skb) 178 { 179 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 180 181 return llc_conn_space(sk, skb) && 182 LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ··· 186 187 int llc_conn_ev_rx_i_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb) 188 { 189 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 190 191 return llc_conn_space(sk, skb) && 192 LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ··· 197 int llc_conn_ev_rx_i_cmd_pbit_set_0_unexpd_ns(struct sock *sk, 198 struct sk_buff *skb) 199 { 200 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 201 + const u8 vr = llc_sk(sk)->vR; 202 + const u8 ns = LLC_I_GET_NS(pdu); 203 204 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) && 205 LLC_I_PF_IS_0(pdu) && ns != vr && ··· 209 int llc_conn_ev_rx_i_cmd_pbit_set_1_unexpd_ns(struct sock *sk, 210 struct sk_buff *skb) 211 { 212 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 213 + const u8 vr = llc_sk(sk)->vR; 214 + const u8 ns = LLC_I_GET_NS(pdu); 215 216 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) && 217 LLC_I_PF_IS_1(pdu) && ns != vr && ··· 221 int llc_conn_ev_rx_i_cmd_pbit_set_x_inval_ns(struct sock *sk, 222 struct sk_buff *skb) 223 { 224 + const struct llc_pdu_sn * pdu = llc_pdu_sn_hdr(skb); 225 + const u8 vr = llc_sk(sk)->vR; 226 + const u8 ns = LLC_I_GET_NS(pdu); 227 + const u16 rc = LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) && 228 + ns != vr && 229 llc_util_ns_inside_rx_window(ns, vr, llc_sk(sk)->rw) ? 0 : 1; 230 if (!rc) 231 dprintk("%s: matched, state=%d, ns=%d, vr=%d\n", ··· 234 235 int llc_conn_ev_rx_i_rsp_fbit_set_0(struct sock *sk, struct sk_buff *skb) 236 { 237 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 238 239 return llc_conn_space(sk, skb) && 240 LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ··· 244 245 int llc_conn_ev_rx_i_rsp_fbit_set_1(struct sock *sk, struct sk_buff *skb) 246 { 247 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 248 249 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && 250 LLC_I_PF_IS_1(pdu) && ··· 253 254 int llc_conn_ev_rx_i_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb) 255 { 256 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 257 258 return llc_conn_space(sk, skb) && 259 LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ··· 263 int llc_conn_ev_rx_i_rsp_fbit_set_0_unexpd_ns(struct sock *sk, 264 struct sk_buff *skb) 265 { 266 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 267 + const u8 vr = llc_sk(sk)->vR; 268 + const u8 ns = LLC_I_GET_NS(pdu); 269 270 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && 271 LLC_I_PF_IS_0(pdu) && ns != vr && ··· 275 int llc_conn_ev_rx_i_rsp_fbit_set_1_unexpd_ns(struct sock *sk, 276 struct sk_buff *skb) 277 { 278 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 279 + const u8 vr = llc_sk(sk)->vR; 280 + const u8 ns = LLC_I_GET_NS(pdu); 281 282 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && 283 LLC_I_PF_IS_1(pdu) && ns != vr && ··· 287 int llc_conn_ev_rx_i_rsp_fbit_set_x_unexpd_ns(struct sock *sk, 288 struct sk_buff *skb) 289 { 290 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 291 + const u8 vr = llc_sk(sk)->vR; 292 + const u8 ns = LLC_I_GET_NS(pdu); 293 294 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ns != vr && 295 !llc_util_ns_inside_rx_window(ns, vr, llc_sk(sk)->rw) ? 0 : 1; ··· 298 int llc_conn_ev_rx_i_rsp_fbit_set_x_inval_ns(struct sock *sk, 299 struct sk_buff *skb) 300 { 301 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 302 + const u8 vr = llc_sk(sk)->vR; 303 + const u8 ns = LLC_I_GET_NS(pdu); 304 + const u16 rc = LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && 305 + ns != vr && 306 llc_util_ns_inside_rx_window(ns, vr, llc_sk(sk)->rw) ? 0 : 1; 307 if (!rc) 308 dprintk("%s: matched, state=%d, ns=%d, vr=%d\n", ··· 311 312 int llc_conn_ev_rx_rej_cmd_pbit_set_0(struct sock *sk, struct sk_buff *skb) 313 { 314 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 315 316 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 317 LLC_S_PF_IS_0(pdu) && ··· 320 321 int llc_conn_ev_rx_rej_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb) 322 { 323 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 324 325 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 326 LLC_S_PF_IS_1(pdu) && ··· 329 330 int llc_conn_ev_rx_rej_rsp_fbit_set_0(struct sock *sk, struct sk_buff *skb) 331 { 332 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 333 334 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 335 LLC_S_PF_IS_0(pdu) && ··· 338 339 int llc_conn_ev_rx_rej_rsp_fbit_set_1(struct sock *sk, struct sk_buff *skb) 340 { 341 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 342 343 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 344 LLC_S_PF_IS_1(pdu) && ··· 347 348 int llc_conn_ev_rx_rej_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb) 349 { 350 + const struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); 351 352 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 353 LLC_S_PDU_RSP(pdu) == LLC_2_PDU_RSP_REJ ? 0 : 1; ··· 355 356 int llc_conn_ev_rx_rnr_cmd_pbit_set_0(struct sock *sk, struct sk_buff *skb) 357 { 358 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 359 360 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 361 LLC_S_PF_IS_0(pdu) && ··· 364 365 int llc_conn_ev_rx_rnr_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb) 366 { 367 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 368 369 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 370 LLC_S_PF_IS_1(pdu) && ··· 373 374 int llc_conn_ev_rx_rnr_rsp_fbit_set_0(struct sock *sk, struct sk_buff *skb) 375 { 376 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 377 378 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 379 LLC_S_PF_IS_0(pdu) && ··· 382 383 int llc_conn_ev_rx_rnr_rsp_fbit_set_1(struct sock *sk, struct sk_buff *skb) 384 { 385 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 386 387 return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 388 LLC_S_PF_IS_1(pdu) && ··· 391 392 int llc_conn_ev_rx_rr_cmd_pbit_set_0(struct sock *sk, struct sk_buff *skb) 393 { 394 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 395 396 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 397 LLC_S_PF_IS_0(pdu) && ··· 400 401 int llc_conn_ev_rx_rr_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb) 402 { 403 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 404 405 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) && 406 LLC_S_PF_IS_1(pdu) && ··· 409 410 int llc_conn_ev_rx_rr_rsp_fbit_set_0(struct sock *sk, struct sk_buff *skb) 411 { 412 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 413 414 return llc_conn_space(sk, skb) && 415 LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) && ··· 419 420 int llc_conn_ev_rx_rr_rsp_fbit_set_1(struct sock *sk, struct sk_buff *skb) 421 { 422 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 423 424 return llc_conn_space(sk, skb) && 425 LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) && ··· 429 430 int llc_conn_ev_rx_sabme_cmd_pbit_set_x(struct sock *sk, struct sk_buff *skb) 431 { 432 + const struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); 433 434 return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_U(pdu) && 435 LLC_U_PDU_CMD(pdu) == LLC_2_PDU_CMD_SABME ? 0 : 1; ··· 446 int llc_conn_ev_rx_xxx_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb) 447 { 448 u16 rc = 1; 449 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 450 451 if (LLC_PDU_IS_CMD(pdu)) { 452 if (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) { ··· 461 int llc_conn_ev_rx_xxx_cmd_pbit_set_x(struct sock *sk, struct sk_buff *skb) 462 { 463 u16 rc = 1; 464 + const struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); 465 466 if (LLC_PDU_IS_CMD(pdu)) { 467 if (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) ··· 477 return rc; 478 } 479 480 int llc_conn_ev_rx_xxx_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb) 481 { 482 u16 rc = 1; 483 + const struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); 484 485 if (LLC_PDU_IS_RSP(pdu)) { 486 if (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) ··· 524 struct sk_buff *skb) 525 { 526 u16 rc = 1; 527 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 528 + const u8 vs = llc_sk(sk)->vS; 529 + const u8 nr = LLC_I_GET_NR(pdu); 530 531 if (LLC_PDU_IS_CMD(pdu) && 532 (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) && ··· 542 struct sk_buff *skb) 543 { 544 u16 rc = 1; 545 + const struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); 546 + const u8 vs = llc_sk(sk)->vS; 547 + const u8 nr = LLC_I_GET_NR(pdu); 548 549 if (LLC_PDU_IS_RSP(pdu) && 550 (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) && ··· 563 564 int llc_conn_ev_p_tmr_exp(struct sock *sk, struct sk_buff *skb) 565 { 566 + const struct llc_conn_state_ev *ev = llc_conn_ev(skb); 567 568 return ev->type != LLC_CONN_EV_TYPE_P_TMR; 569 } 570 571 int llc_conn_ev_ack_tmr_exp(struct sock *sk, struct sk_buff *skb) 572 { 573 + const struct llc_conn_state_ev *ev = llc_conn_ev(skb); 574 575 return ev->type != LLC_CONN_EV_TYPE_ACK_TMR; 576 } 577 578 int llc_conn_ev_rej_tmr_exp(struct sock *sk, struct sk_buff *skb) 579 { 580 + const struct llc_conn_state_ev *ev = llc_conn_ev(skb); 581 582 return ev->type != LLC_CONN_EV_TYPE_REJ_TMR; 583 } 584 585 int llc_conn_ev_busy_tmr_exp(struct sock *sk, struct sk_buff *skb) 586 { 587 + const struct llc_conn_state_ev *ev = llc_conn_ev(skb); 588 589 return ev->type != LLC_CONN_EV_TYPE_BUSY_TMR; 590 } ··· 596 597 int llc_conn_ev_tx_buffer_full(struct sock *sk, struct sk_buff *skb) 598 { 599 + const struct llc_conn_state_ev *ev = llc_conn_ev(skb); 600 601 return ev->type == LLC_CONN_EV_TYPE_SIMPLE && 602 ev->prim_type == LLC_CONN_EV_TX_BUFF_FULL ? 0 : 1;
+124 -90
net/llc/llc_conn.c
··· 40 /* Offset table on connection states transition diagram */ 41 static int llc_offset_table[NBR_CONN_STATES][NBR_CONN_EV]; 42 43 /** 44 * llc_conn_state_process - sends event to connection state machine 45 * @sk: connection ··· 58 int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) 59 { 60 int rc; 61 - struct llc_sock *llc = llc_sk(sk); 62 struct llc_conn_state_ev *ev = llc_conn_ev(skb); 63 64 /* ··· 68 */ 69 skb_get(skb); 70 ev->ind_prim = ev->cfm_prim = 0; 71 - rc = llc_conn_service(sk, skb); /* sending event to state machine */ 72 - if (rc) { 73 printk(KERN_ERR "%s: llc_conn_service failed\n", __FUNCTION__); 74 goto out_kfree_skb; 75 } 76 77 - if (!ev->ind_prim && !ev->cfm_prim) { 78 /* indicate or confirm not required */ 79 /* XXX this is not very pretty, perhaps we should store 80 * XXX indicate/confirm-needed state in the llc_conn_state_ev ··· 88 goto out_skb_put; 89 } 90 91 - if (ev->ind_prim && ev->cfm_prim) /* Paranoia */ 92 skb_get(skb); 93 94 switch (ev->ind_prim) { 95 case LLC_DATA_PRIM: 96 - llc_save_primitive(skb, LLC_DATA_PRIM); 97 - if (sock_queue_rcv_skb(sk, skb)) { 98 /* 99 * shouldn't happen 100 */ ··· 103 kfree_skb(skb); 104 } 105 break; 106 - case LLC_CONN_PRIM: { 107 - struct sock *parent = skb->sk; 108 - 109 - skb->sk = sk; 110 - skb_queue_tail(&parent->sk_receive_queue, skb); 111 - sk->sk_state_change(parent); 112 - } 113 break; 114 case LLC_DISC_PRIM: 115 sock_hold(sk); ··· 120 sk->sk_socket->state = SS_UNCONNECTED; 121 sk->sk_state = TCP_CLOSE; 122 if (!sock_flag(sk, SOCK_DEAD)) { 123 - sk->sk_state_change(sk); 124 sock_set_flag(sk, SOCK_DEAD); 125 } 126 } 127 kfree_skb(skb); ··· 474 } 475 476 /** 477 - * llc_lookup_established - Finds connection for the remote/local sap/mac 478 * @sap: SAP 479 * @daddr: address of remote LLC (MAC + SAP) 480 * @laddr: address of local LLC (MAC + SAP) ··· 482 * Search connection list of the SAP and finds connection using the remote 483 * mac, remote sap, local mac, and local sap. Returns pointer for 484 * connection found, %NULL otherwise. 485 */ 486 - struct sock *llc_lookup_established(struct llc_sap *sap, struct llc_addr *daddr, 487 - struct llc_addr *laddr) 488 { 489 struct sock *rc; 490 struct hlist_node *node; 491 492 - read_lock_bh(&sap->sk_list.lock); 493 sk_for_each(rc, node, &sap->sk_list.list) { 494 struct llc_sock *llc = llc_sk(rc); 495 ··· 505 } 506 rc = NULL; 507 found: 508 - read_unlock_bh(&sap->sk_list.lock); 509 return rc; 510 } 511 512 /** ··· 529 * Search connection list of the SAP and finds connection listening on 530 * local mac, and local sap. Returns pointer for parent socket found, 531 * %NULL otherwise. 532 */ 533 static struct sock *llc_lookup_listener(struct llc_sap *sap, 534 struct llc_addr *laddr) ··· 537 struct sock *rc; 538 struct hlist_node *node; 539 540 - read_lock_bh(&sap->sk_list.lock); 541 sk_for_each(rc, node, &sap->sk_list.list) { 542 struct llc_sock *llc = llc_sk(rc); 543 ··· 551 } 552 rc = NULL; 553 found: 554 - read_unlock_bh(&sap->sk_list.lock); 555 return rc; 556 } 557 558 /** ··· 577 } 578 579 /** 580 - * find_next_offset - finds offset for next category of transitions 581 * @state: state table. 582 * @offset: start offset. 583 * 584 * Finds offset of next category of transitions in transition table. 585 * Returns the start index of next category. 586 */ 587 - static u16 find_next_offset(struct llc_conn_state *state, u16 offset) 588 { 589 u16 cnt = 0; 590 struct llc_conn_state_trans **next_trans; ··· 611 next_offset = 0; 612 for (ev_type = 0; ev_type < NBR_CONN_EV; ev_type++) { 613 llc_offset_table[state][ev_type] = next_offset; 614 - next_offset += find_next_offset(curr_state, 615 - next_offset) + 1; 616 } 617 } 618 } ··· 656 */ 657 void llc_sap_add_socket(struct llc_sap *sap, struct sock *sk) 658 { 659 write_lock_bh(&sap->sk_list.lock); 660 llc_sk(sk)->sap = sap; 661 sk_add_node(sk, &sap->sk_list.list); ··· 676 write_lock_bh(&sap->sk_list.lock); 677 sk_del_node_init(sk); 678 write_unlock_bh(&sap->sk_list.lock); 679 } 680 681 /** ··· 689 static int llc_conn_rcv(struct sock* sk, struct sk_buff *skb) 690 { 691 struct llc_conn_state_ev *ev = llc_conn_ev(skb); 692 - struct llc_sock *llc = llc_sk(sk); 693 694 - if (!llc->dev) 695 - llc->dev = skb->dev; 696 ev->type = LLC_CONN_EV_TYPE_PDU; 697 ev->reason = 0; 698 return llc_conn_state_process(sk, skb); 699 } 700 701 void llc_conn_handler(struct llc_sap *sap, struct sk_buff *skb) ··· 727 llc_pdu_decode_da(skb, daddr.mac); 728 llc_pdu_decode_dsap(skb, &daddr.lsap); 729 730 - sk = llc_lookup_established(sap, &saddr, &daddr); 731 - if (!sk) { 732 - /* 733 - * Didn't find an active connection; verify if there 734 - * is a listening socket for this llc addr 735 - */ 736 - struct llc_sock *llc; 737 - struct sock *parent = llc_lookup_listener(sap, &daddr); 738 739 - if (!parent) { 740 - dprintk("llc_lookup_listener failed!\n"); 741 - goto drop; 742 - } 743 - 744 - sk = llc_sk_alloc(parent->sk_family, GFP_ATOMIC, parent->sk_prot); 745 - if (!sk) { 746 - sock_put(parent); 747 - goto drop; 748 - } 749 - llc = llc_sk(sk); 750 - memcpy(&llc->laddr, &daddr, sizeof(llc->laddr)); 751 - memcpy(&llc->daddr, &saddr, sizeof(llc->daddr)); 752 - llc_sap_add_socket(sap, sk); 753 - sock_hold(sk); 754 - sock_put(parent); 755 - skb->sk = parent; 756 - } else 757 - skb->sk = sk; 758 bh_lock_sock(sk); 759 if (!sock_owned_by_user(sk)) 760 llc_conn_rcv(sk, skb); 761 else { ··· 763 llc_set_backlog_type(skb, LLC_PACKET); 764 sk_add_backlog(sk, skb); 765 } 766 bh_unlock_sock(sk); 767 sock_put(sk); 768 return; 769 drop: 770 kfree_skb(skb); 771 } 772 773 #undef LLC_REFCNT_DEBUG 774 #ifdef LLC_REFCNT_DEBUG 775 static atomic_t llc_sock_nr; 776 #endif 777 - 778 - /** 779 - * llc_release_sockets - releases all sockets in a sap 780 - * @sap: sap to release its sockets 781 - * 782 - * Releases all connections of a sap. Returns 0 if all actions complete 783 - * successfully, nonzero otherwise 784 - */ 785 - int llc_release_sockets(struct llc_sap *sap) 786 - { 787 - int rc = 0; 788 - struct sock *sk; 789 - struct hlist_node *node; 790 - 791 - write_lock_bh(&sap->sk_list.lock); 792 - 793 - sk_for_each(sk, node, &sap->sk_list.list) { 794 - llc_sk(sk)->state = LLC_CONN_STATE_TEMP; 795 - 796 - if (llc_send_disc(sk)) 797 - rc = 1; 798 - } 799 - 800 - write_unlock_bh(&sap->sk_list.lock); 801 - return rc; 802 - } 803 804 /** 805 * llc_backlog_rcv - Processes rx frames and expired timers. ··· 795 int rc = 0; 796 struct llc_sock *llc = llc_sk(sk); 797 798 - if (llc_backlog_type(skb) == LLC_PACKET) { 799 - if (llc->state > 1) /* not closed */ 800 rc = llc_conn_rcv(sk, skb); 801 else 802 goto out_kfree_skb; 803 } else if (llc_backlog_type(skb) == LLC_EVENT) { 804 /* timer expiration event */ 805 - if (llc->state > 1) /* not closed */ 806 rc = llc_conn_state_process(sk, skb); 807 else 808 goto out_kfree_skb; ··· 832 llc->dec_step = llc->connect_step = 1; 833 834 init_timer(&llc->ack_timer.timer); 835 - llc->ack_timer.expire = LLC_ACK_TIME; 836 llc->ack_timer.timer.data = (unsigned long)sk; 837 llc->ack_timer.timer.function = llc_conn_ack_tmr_cb; 838 839 init_timer(&llc->pf_cycle_timer.timer); 840 - llc->pf_cycle_timer.expire = LLC_P_TIME; 841 llc->pf_cycle_timer.timer.data = (unsigned long)sk; 842 llc->pf_cycle_timer.timer.function = llc_conn_pf_cycle_tmr_cb; 843 844 init_timer(&llc->rej_sent_timer.timer); 845 - llc->rej_sent_timer.expire = LLC_REJ_TIME; 846 llc->rej_sent_timer.timer.data = (unsigned long)sk; 847 llc->rej_sent_timer.timer.function = llc_conn_rej_tmr_cb; 848 849 init_timer(&llc->busy_state_timer.timer); 850 - llc->busy_state_timer.expire = LLC_BUSY_TIME; 851 llc->busy_state_timer.timer.data = (unsigned long)sk; 852 llc->busy_state_timer.timer.function = llc_conn_busy_tmr_cb; 853 ··· 867 * Allocates a LLC sock and initializes it. Returns the new LLC sock 868 * or %NULL if there's no memory available for one 869 */ 870 - struct sock *llc_sk_alloc(int family, int priority, struct proto *prot) 871 { 872 struct sock *sk = sk_alloc(family, priority, prot, 1); 873
··· 40 /* Offset table on connection states transition diagram */ 41 static int llc_offset_table[NBR_CONN_STATES][NBR_CONN_EV]; 42 43 + int sysctl_llc2_ack_timeout = LLC2_ACK_TIME * HZ; 44 + int sysctl_llc2_p_timeout = LLC2_P_TIME * HZ; 45 + int sysctl_llc2_rej_timeout = LLC2_REJ_TIME * HZ; 46 + int sysctl_llc2_busy_timeout = LLC2_BUSY_TIME * HZ; 47 + 48 /** 49 * llc_conn_state_process - sends event to connection state machine 50 * @sk: connection ··· 53 int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) 54 { 55 int rc; 56 + struct llc_sock *llc = llc_sk(skb->sk); 57 struct llc_conn_state_ev *ev = llc_conn_ev(skb); 58 59 /* ··· 63 */ 64 skb_get(skb); 65 ev->ind_prim = ev->cfm_prim = 0; 66 + /* 67 + * Send event to state machine 68 + */ 69 + rc = llc_conn_service(skb->sk, skb); 70 + if (unlikely(rc != 0)) { 71 printk(KERN_ERR "%s: llc_conn_service failed\n", __FUNCTION__); 72 goto out_kfree_skb; 73 } 74 75 + if (unlikely(!ev->ind_prim && !ev->cfm_prim)) { 76 /* indicate or confirm not required */ 77 /* XXX this is not very pretty, perhaps we should store 78 * XXX indicate/confirm-needed state in the llc_conn_state_ev ··· 80 goto out_skb_put; 81 } 82 83 + if (unlikely(ev->ind_prim && ev->cfm_prim)) /* Paranoia */ 84 skb_get(skb); 85 86 switch (ev->ind_prim) { 87 case LLC_DATA_PRIM: 88 + llc_save_primitive(sk, skb, LLC_DATA_PRIM); 89 + if (unlikely(sock_queue_rcv_skb(sk, skb))) { 90 /* 91 * shouldn't happen 92 */ ··· 95 kfree_skb(skb); 96 } 97 break; 98 + case LLC_CONN_PRIM: 99 + /* 100 + * Can't be sock_queue_rcv_skb, because we have to leave the 101 + * skb->sk pointing to the newly created struct sock in 102 + * llc_conn_handler. -acme 103 + */ 104 + skb_queue_tail(&sk->sk_receive_queue, skb); 105 + sk->sk_state_change(sk); 106 break; 107 case LLC_DISC_PRIM: 108 sock_hold(sk); ··· 111 sk->sk_socket->state = SS_UNCONNECTED; 112 sk->sk_state = TCP_CLOSE; 113 if (!sock_flag(sk, SOCK_DEAD)) { 114 sock_set_flag(sk, SOCK_DEAD); 115 + sk->sk_state_change(sk); 116 } 117 } 118 kfree_skb(skb); ··· 465 } 466 467 /** 468 + * __llc_lookup_established - Finds connection for the remote/local sap/mac 469 * @sap: SAP 470 * @daddr: address of remote LLC (MAC + SAP) 471 * @laddr: address of local LLC (MAC + SAP) ··· 473 * Search connection list of the SAP and finds connection using the remote 474 * mac, remote sap, local mac, and local sap. Returns pointer for 475 * connection found, %NULL otherwise. 476 + * Caller has to make sure local_bh is disabled. 477 */ 478 + static struct sock *__llc_lookup_established(struct llc_sap *sap, 479 + struct llc_addr *daddr, 480 + struct llc_addr *laddr) 481 { 482 struct sock *rc; 483 struct hlist_node *node; 484 485 + read_lock(&sap->sk_list.lock); 486 sk_for_each(rc, node, &sap->sk_list.list) { 487 struct llc_sock *llc = llc_sk(rc); 488 ··· 494 } 495 rc = NULL; 496 found: 497 + read_unlock(&sap->sk_list.lock); 498 return rc; 499 + } 500 + 501 + struct sock *llc_lookup_established(struct llc_sap *sap, 502 + struct llc_addr *daddr, 503 + struct llc_addr *laddr) 504 + { 505 + struct sock *sk; 506 + 507 + local_bh_disable(); 508 + sk = __llc_lookup_established(sap, daddr, laddr); 509 + local_bh_enable(); 510 + return sk; 511 } 512 513 /** ··· 506 * Search connection list of the SAP and finds connection listening on 507 * local mac, and local sap. Returns pointer for parent socket found, 508 * %NULL otherwise. 509 + * Caller has to make sure local_bh is disabled. 510 */ 511 static struct sock *llc_lookup_listener(struct llc_sap *sap, 512 struct llc_addr *laddr) ··· 513 struct sock *rc; 514 struct hlist_node *node; 515 516 + read_lock(&sap->sk_list.lock); 517 sk_for_each(rc, node, &sap->sk_list.list) { 518 struct llc_sock *llc = llc_sk(rc); 519 ··· 527 } 528 rc = NULL; 529 found: 530 + read_unlock(&sap->sk_list.lock); 531 return rc; 532 + } 533 + 534 + static struct sock *__llc_lookup(struct llc_sap *sap, 535 + struct llc_addr *daddr, 536 + struct llc_addr *laddr) 537 + { 538 + struct sock *sk = __llc_lookup_established(sap, daddr, laddr); 539 + 540 + return sk ? : llc_lookup_listener(sap, laddr); 541 } 542 543 /** ··· 544 } 545 546 /** 547 + * llc_find_next_offset - finds offset for next category of transitions 548 * @state: state table. 549 * @offset: start offset. 550 * 551 * Finds offset of next category of transitions in transition table. 552 * Returns the start index of next category. 553 */ 554 + static u16 __init llc_find_next_offset(struct llc_conn_state *state, u16 offset) 555 { 556 u16 cnt = 0; 557 struct llc_conn_state_trans **next_trans; ··· 578 next_offset = 0; 579 for (ev_type = 0; ev_type < NBR_CONN_EV; ev_type++) { 580 llc_offset_table[state][ev_type] = next_offset; 581 + next_offset += llc_find_next_offset(curr_state, 582 + next_offset) + 1; 583 } 584 } 585 } ··· 623 */ 624 void llc_sap_add_socket(struct llc_sap *sap, struct sock *sk) 625 { 626 + llc_sap_hold(sap); 627 write_lock_bh(&sap->sk_list.lock); 628 llc_sk(sk)->sap = sap; 629 sk_add_node(sk, &sap->sk_list.list); ··· 642 write_lock_bh(&sap->sk_list.lock); 643 sk_del_node_init(sk); 644 write_unlock_bh(&sap->sk_list.lock); 645 + llc_sap_put(sap); 646 } 647 648 /** ··· 654 static int llc_conn_rcv(struct sock* sk, struct sk_buff *skb) 655 { 656 struct llc_conn_state_ev *ev = llc_conn_ev(skb); 657 658 ev->type = LLC_CONN_EV_TYPE_PDU; 659 ev->reason = 0; 660 return llc_conn_state_process(sk, skb); 661 + } 662 + 663 + static struct sock *llc_create_incoming_sock(struct sock *sk, 664 + struct net_device *dev, 665 + struct llc_addr *saddr, 666 + struct llc_addr *daddr) 667 + { 668 + struct sock *newsk = llc_sk_alloc(sk->sk_family, GFP_ATOMIC, 669 + sk->sk_prot); 670 + struct llc_sock *newllc, *llc = llc_sk(sk); 671 + 672 + if (!newsk) 673 + goto out; 674 + newllc = llc_sk(newsk); 675 + memcpy(&newllc->laddr, daddr, sizeof(newllc->laddr)); 676 + memcpy(&newllc->daddr, saddr, sizeof(newllc->daddr)); 677 + newllc->dev = dev; 678 + dev_hold(dev); 679 + llc_sap_add_socket(llc->sap, newsk); 680 + llc_sap_hold(llc->sap); 681 + out: 682 + return newsk; 683 } 684 685 void llc_conn_handler(struct llc_sap *sap, struct sk_buff *skb) ··· 673 llc_pdu_decode_da(skb, daddr.mac); 674 llc_pdu_decode_dsap(skb, &daddr.lsap); 675 676 + sk = __llc_lookup(sap, &saddr, &daddr); 677 + if (!sk) 678 + goto drop; 679 680 bh_lock_sock(sk); 681 + /* 682 + * This has to be done here and not at the upper layer ->accept 683 + * method because of the way the PROCOM state machine works: 684 + * it needs to set several state variables (see, for instance, 685 + * llc_adm_actions_2 in net/llc/llc_c_st.c) and send a packet to 686 + * the originator of the new connection, and this state has to be 687 + * in the newly created struct sock private area. -acme 688 + */ 689 + if (unlikely(sk->sk_state == TCP_LISTEN)) { 690 + struct sock *newsk = llc_create_incoming_sock(sk, skb->dev, 691 + &saddr, &daddr); 692 + if (!newsk) 693 + goto drop_unlock; 694 + skb_set_owner_r(skb, newsk); 695 + } else { 696 + /* 697 + * Can't be skb_set_owner_r, this will be done at the 698 + * llc_conn_state_process function, later on, when we will use 699 + * skb_queue_rcv_skb to send it to upper layers, this is 700 + * another trick required to cope with how the PROCOM state 701 + * machine works. -acme 702 + */ 703 + skb->sk = sk; 704 + } 705 if (!sock_owned_by_user(sk)) 706 llc_conn_rcv(sk, skb); 707 else { ··· 709 llc_set_backlog_type(skb, LLC_PACKET); 710 sk_add_backlog(sk, skb); 711 } 712 + out: 713 bh_unlock_sock(sk); 714 sock_put(sk); 715 return; 716 drop: 717 kfree_skb(skb); 718 + return; 719 + drop_unlock: 720 + kfree_skb(skb); 721 + goto out; 722 } 723 724 #undef LLC_REFCNT_DEBUG 725 #ifdef LLC_REFCNT_DEBUG 726 static atomic_t llc_sock_nr; 727 #endif 728 729 /** 730 * llc_backlog_rcv - Processes rx frames and expired timers. ··· 762 int rc = 0; 763 struct llc_sock *llc = llc_sk(sk); 764 765 + if (likely(llc_backlog_type(skb) == LLC_PACKET)) { 766 + if (likely(llc->state > 1)) /* not closed */ 767 rc = llc_conn_rcv(sk, skb); 768 else 769 goto out_kfree_skb; 770 } else if (llc_backlog_type(skb) == LLC_EVENT) { 771 /* timer expiration event */ 772 + if (likely(llc->state > 1)) /* not closed */ 773 rc = llc_conn_state_process(sk, skb); 774 else 775 goto out_kfree_skb; ··· 799 llc->dec_step = llc->connect_step = 1; 800 801 init_timer(&llc->ack_timer.timer); 802 + llc->ack_timer.expire = sysctl_llc2_ack_timeout; 803 llc->ack_timer.timer.data = (unsigned long)sk; 804 llc->ack_timer.timer.function = llc_conn_ack_tmr_cb; 805 806 init_timer(&llc->pf_cycle_timer.timer); 807 + llc->pf_cycle_timer.expire = sysctl_llc2_p_timeout; 808 llc->pf_cycle_timer.timer.data = (unsigned long)sk; 809 llc->pf_cycle_timer.timer.function = llc_conn_pf_cycle_tmr_cb; 810 811 init_timer(&llc->rej_sent_timer.timer); 812 + llc->rej_sent_timer.expire = sysctl_llc2_rej_timeout; 813 llc->rej_sent_timer.timer.data = (unsigned long)sk; 814 llc->rej_sent_timer.timer.function = llc_conn_rej_tmr_cb; 815 816 init_timer(&llc->busy_state_timer.timer); 817 + llc->busy_state_timer.expire = sysctl_llc2_busy_timeout; 818 llc->busy_state_timer.timer.data = (unsigned long)sk; 819 llc->busy_state_timer.timer.function = llc_conn_busy_tmr_cb; 820 ··· 834 * Allocates a LLC sock and initializes it. Returns the new LLC sock 835 * or %NULL if there's no memory available for one 836 */ 837 + struct sock *llc_sk_alloc(int family, unsigned int __nocast priority, 838 + struct proto *prot) 839 { 840 struct sock *sk = sk_alloc(family, priority, prot, 1); 841
+23 -11
net/llc/llc_core.c
··· 40 sap->state = LLC_SAP_STATE_ACTIVE; 41 memcpy(sap->laddr.mac, llc_station_mac_sa, ETH_ALEN); 42 rwlock_init(&sap->sk_list.lock); 43 } 44 return sap; 45 } ··· 53 */ 54 static void llc_add_sap(struct llc_sap *sap) 55 { 56 - write_lock_bh(&llc_sap_list_lock); 57 list_add_tail(&sap->node, &llc_sap_list); 58 - write_unlock_bh(&llc_sap_list_lock); 59 } 60 61 /** ··· 69 write_unlock_bh(&llc_sap_list_lock); 70 } 71 72 /** 73 * llc_sap_find - searchs a SAP in station 74 * @sap_value: sap to be found 75 * 76 * Searchs for a sap in the sap list of the LLC's station upon the sap ID. 77 * Returns the sap or %NULL if not found. 78 */ 79 struct llc_sap *llc_sap_find(unsigned char sap_value) ··· 95 struct llc_sap* sap; 96 97 read_lock_bh(&llc_sap_list_lock); 98 - list_for_each_entry(sap, &llc_sap_list, node) 99 - if (sap->laddr.lsap == sap_value) 100 - goto out; 101 - sap = NULL; 102 - out: 103 read_unlock_bh(&llc_sap_list_lock); 104 return sap; 105 } ··· 117 struct packet_type *pt, 118 struct net_device *orig_dev)) 119 { 120 - struct llc_sap *sap = llc_sap_find(lsap); 121 122 - if (sap) { /* SAP already exists */ 123 - sap = NULL; 124 goto out; 125 - } 126 sap = llc_sap_alloc(); 127 if (!sap) 128 goto out; 129 sap->laddr.lsap = lsap; 130 sap->rcv_func = func; 131 llc_add_sap(sap); 132 out: 133 return sap; 134 } 135
··· 40 sap->state = LLC_SAP_STATE_ACTIVE; 41 memcpy(sap->laddr.mac, llc_station_mac_sa, ETH_ALEN); 42 rwlock_init(&sap->sk_list.lock); 43 + atomic_set(&sap->refcnt, 1); 44 } 45 return sap; 46 } ··· 52 */ 53 static void llc_add_sap(struct llc_sap *sap) 54 { 55 list_add_tail(&sap->node, &llc_sap_list); 56 } 57 58 /** ··· 70 write_unlock_bh(&llc_sap_list_lock); 71 } 72 73 + static struct llc_sap *__llc_sap_find(unsigned char sap_value) 74 + { 75 + struct llc_sap* sap; 76 + 77 + list_for_each_entry(sap, &llc_sap_list, node) 78 + if (sap->laddr.lsap == sap_value) 79 + goto out; 80 + sap = NULL; 81 + out: 82 + return sap; 83 + } 84 + 85 /** 86 * llc_sap_find - searchs a SAP in station 87 * @sap_value: sap to be found 88 * 89 * Searchs for a sap in the sap list of the LLC's station upon the sap ID. 90 + * If the sap is found it will be refcounted and the user will have to do 91 + * a llc_sap_put after use. 92 * Returns the sap or %NULL if not found. 93 */ 94 struct llc_sap *llc_sap_find(unsigned char sap_value) ··· 82 struct llc_sap* sap; 83 84 read_lock_bh(&llc_sap_list_lock); 85 + sap = __llc_sap_find(sap_value); 86 + if (sap) 87 + llc_sap_hold(sap); 88 read_unlock_bh(&llc_sap_list_lock); 89 return sap; 90 } ··· 106 struct packet_type *pt, 107 struct net_device *orig_dev)) 108 { 109 + struct llc_sap *sap = NULL; 110 111 + write_lock_bh(&llc_sap_list_lock); 112 + if (__llc_sap_find(lsap)) /* SAP already exists */ 113 goto out; 114 sap = llc_sap_alloc(); 115 if (!sap) 116 goto out; 117 sap->laddr.lsap = lsap; 118 sap->rcv_func = func; 119 + llc_sap_hold(sap); 120 llc_add_sap(sap); 121 out: 122 + write_unlock_bh(&llc_sap_list_lock); 123 return sap; 124 } 125
+5 -6
net/llc/llc_if.c
··· 47 int rc = -ECONNABORTED; 48 struct llc_sock *llc = llc_sk(sk); 49 50 - if (llc->state == LLC_CONN_STATE_ADM) 51 goto out; 52 rc = -EBUSY; 53 - if (llc_data_accept_state(llc->state)) { /* data_conn_refuse */ 54 - llc->failed_data_req = 1; 55 - goto out; 56 - } 57 - if (llc->p_flag) { 58 llc->failed_data_req = 1; 59 goto out; 60 } ··· 107 ev->type = LLC_CONN_EV_TYPE_PRIM; 108 ev->prim = LLC_CONN_PRIM; 109 ev->prim_type = LLC_PRIM_TYPE_REQ; 110 rc = llc_conn_state_process(sk, skb); 111 } 112 out_put: ··· 142 skb = alloc_skb(0, GFP_ATOMIC); 143 if (!skb) 144 goto out; 145 sk->sk_state = TCP_CLOSING; 146 ev = llc_conn_ev(skb); 147 ev->type = LLC_CONN_EV_TYPE_PRIM;
··· 47 int rc = -ECONNABORTED; 48 struct llc_sock *llc = llc_sk(sk); 49 50 + if (unlikely(llc->state == LLC_CONN_STATE_ADM)) 51 goto out; 52 rc = -EBUSY; 53 + if (unlikely(llc_data_accept_state(llc->state) || /* data_conn_refuse */ 54 + llc->p_flag)) { 55 llc->failed_data_req = 1; 56 goto out; 57 } ··· 110 ev->type = LLC_CONN_EV_TYPE_PRIM; 111 ev->prim = LLC_CONN_PRIM; 112 ev->prim_type = LLC_PRIM_TYPE_REQ; 113 + skb_set_owner_w(skb, sk); 114 rc = llc_conn_state_process(sk, skb); 115 } 116 out_put: ··· 144 skb = alloc_skb(0, GFP_ATOMIC); 145 if (!skb) 146 goto out; 147 + skb_set_owner_w(skb, sk); 148 sk->sk_state = TCP_CLOSING; 149 ev = llc_conn_ev(skb); 150 ev->type = LLC_CONN_EV_TYPE_PRIM;
+14 -5
net/llc/llc_input.c
··· 99 static inline int llc_fixup_skb(struct sk_buff *skb) 100 { 101 u8 llc_len = 2; 102 - struct llc_pdu_sn *pdu; 103 104 - if (!pskb_may_pull(skb, sizeof(*pdu))) 105 return 0; 106 107 - pdu = (struct llc_pdu_sn *)skb->data; 108 if ((pdu->ctrl_1 & LLC_PDU_TYPE_MASK) == LLC_PDU_TYPE_U) 109 llc_len = 1; 110 llc_len += 2; 111 skb->h.raw += llc_len; 112 skb_pull(skb, llc_len); 113 if (skb->protocol == htons(ETH_P_802_2)) { ··· 170 */ 171 if (sap->rcv_func) { 172 sap->rcv_func(skb, dev, pt, orig_dev); 173 - goto out; 174 } 175 dest = llc_pdu_type(skb); 176 if (unlikely(!dest || !llc_type_handlers[dest - 1])) 177 - goto drop; 178 llc_type_handlers[dest - 1](sap, skb); 179 out: 180 return 0; 181 drop: 182 kfree_skb(skb); 183 goto out; 184 handle_station: 185 if (!llc_station_handler) 186 goto drop;
··· 99 static inline int llc_fixup_skb(struct sk_buff *skb) 100 { 101 u8 llc_len = 2; 102 + struct llc_pdu_un *pdu; 103 104 + if (unlikely(!pskb_may_pull(skb, sizeof(*pdu)))) 105 return 0; 106 107 + pdu = (struct llc_pdu_un *)skb->data; 108 if ((pdu->ctrl_1 & LLC_PDU_TYPE_MASK) == LLC_PDU_TYPE_U) 109 llc_len = 1; 110 llc_len += 2; 111 + 112 + if (unlikely(!pskb_may_pull(skb, llc_len))) 113 + return 0; 114 + 115 skb->h.raw += llc_len; 116 skb_pull(skb, llc_len); 117 if (skb->protocol == htons(ETH_P_802_2)) { ··· 166 */ 167 if (sap->rcv_func) { 168 sap->rcv_func(skb, dev, pt, orig_dev); 169 + goto out_put; 170 } 171 dest = llc_pdu_type(skb); 172 if (unlikely(!dest || !llc_type_handlers[dest - 1])) 173 + goto drop_put; 174 llc_type_handlers[dest - 1](sap, skb); 175 + out_put: 176 + llc_sap_put(sap); 177 out: 178 return 0; 179 drop: 180 kfree_skb(skb); 181 goto out; 182 + drop_put: 183 + kfree_skb(skb); 184 + goto out_put; 185 handle_station: 186 if (!llc_station_handler) 187 goto drop;
+1 -1
net/llc/llc_output.c
··· 98 dsap, LLC_PDU_CMD); 99 llc_pdu_init_as_ui_cmd(skb); 100 rc = llc_mac_hdr_init(skb, skb->dev->dev_addr, dmac); 101 - if (!rc) 102 rc = dev_queue_xmit(skb); 103 return rc; 104 }
··· 98 dsap, LLC_PDU_CMD); 99 llc_pdu_init_as_ui_cmd(skb); 100 rc = llc_mac_hdr_init(skb, skb->dev->dev_addr, dmac); 101 + if (likely(!rc)) 102 rc = dev_queue_xmit(skb); 103 return rc; 104 }
+1 -1
net/llc/llc_proc.c
··· 134 llc_ui_format_mac(seq, llc->daddr.mac); 135 seq_printf(seq, "@%02X %8d %8d %2d %3d %4d\n", llc->daddr.lsap, 136 atomic_read(&sk->sk_wmem_alloc), 137 - atomic_read(&sk->sk_rmem_alloc), 138 sk->sk_state, 139 sk->sk_socket ? SOCK_INODE(sk->sk_socket)->i_uid : -1, 140 llc->link);
··· 134 llc_ui_format_mac(seq, llc->daddr.mac); 135 seq_printf(seq, "@%02X %8d %8d %2d %3d %4d\n", llc->daddr.lsap, 136 atomic_read(&sk->sk_wmem_alloc), 137 + atomic_read(&sk->sk_rmem_alloc) - llc->copied_seq, 138 sk->sk_state, 139 sk->sk_socket ? SOCK_INODE(sk->sk_socket)->i_uid : -1, 140 llc->link);
+7 -9
net/llc/llc_s_ac.c
··· 58 ev->daddr.lsap, LLC_PDU_CMD); 59 llc_pdu_init_as_ui_cmd(skb); 60 rc = llc_mac_hdr_init(skb, ev->saddr.mac, ev->daddr.mac); 61 - if (!rc) 62 rc = dev_queue_xmit(skb); 63 return rc; 64 } ··· 81 ev->daddr.lsap, LLC_PDU_CMD); 82 llc_pdu_init_as_xid_cmd(skb, LLC_XID_NULL_CLASS_2, 0); 83 rc = llc_mac_hdr_init(skb, ev->saddr.mac, ev->daddr.mac); 84 - if (!rc) 85 rc = dev_queue_xmit(skb); 86 return rc; 87 } ··· 103 llc_pdu_decode_sa(skb, mac_da); 104 llc_pdu_decode_da(skb, mac_sa); 105 llc_pdu_decode_ssap(skb, &dsap); 106 - nskb = llc_alloc_frame(); 107 if (!nskb) 108 goto out; 109 - nskb->dev = skb->dev; 110 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, dsap, 111 LLC_PDU_RSP); 112 llc_pdu_init_as_xid_rsp(nskb, LLC_XID_NULL_CLASS_2, 0); 113 rc = llc_mac_hdr_init(nskb, mac_sa, mac_da); 114 - if (!rc) 115 rc = dev_queue_xmit(nskb); 116 out: 117 return rc; ··· 134 ev->daddr.lsap, LLC_PDU_CMD); 135 llc_pdu_init_as_test_cmd(skb); 136 rc = llc_mac_hdr_init(skb, ev->saddr.mac, ev->daddr.mac); 137 - if (!rc) 138 rc = dev_queue_xmit(skb); 139 return rc; 140 } ··· 148 llc_pdu_decode_sa(skb, mac_da); 149 llc_pdu_decode_da(skb, mac_sa); 150 llc_pdu_decode_ssap(skb, &dsap); 151 - nskb = llc_alloc_frame(); 152 if (!nskb) 153 goto out; 154 - nskb->dev = skb->dev; 155 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, dsap, 156 LLC_PDU_RSP); 157 llc_pdu_init_as_test_rsp(nskb, skb); 158 rc = llc_mac_hdr_init(nskb, mac_sa, mac_da); 159 - if (!rc) 160 rc = dev_queue_xmit(nskb); 161 out: 162 return rc;
··· 58 ev->daddr.lsap, LLC_PDU_CMD); 59 llc_pdu_init_as_ui_cmd(skb); 60 rc = llc_mac_hdr_init(skb, ev->saddr.mac, ev->daddr.mac); 61 + if (likely(!rc)) 62 rc = dev_queue_xmit(skb); 63 return rc; 64 } ··· 81 ev->daddr.lsap, LLC_PDU_CMD); 82 llc_pdu_init_as_xid_cmd(skb, LLC_XID_NULL_CLASS_2, 0); 83 rc = llc_mac_hdr_init(skb, ev->saddr.mac, ev->daddr.mac); 84 + if (likely(!rc)) 85 rc = dev_queue_xmit(skb); 86 return rc; 87 } ··· 103 llc_pdu_decode_sa(skb, mac_da); 104 llc_pdu_decode_da(skb, mac_sa); 105 llc_pdu_decode_ssap(skb, &dsap); 106 + nskb = llc_alloc_frame(NULL, skb->dev); 107 if (!nskb) 108 goto out; 109 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, dsap, 110 LLC_PDU_RSP); 111 llc_pdu_init_as_xid_rsp(nskb, LLC_XID_NULL_CLASS_2, 0); 112 rc = llc_mac_hdr_init(nskb, mac_sa, mac_da); 113 + if (likely(!rc)) 114 rc = dev_queue_xmit(nskb); 115 out: 116 return rc; ··· 135 ev->daddr.lsap, LLC_PDU_CMD); 136 llc_pdu_init_as_test_cmd(skb); 137 rc = llc_mac_hdr_init(skb, ev->saddr.mac, ev->daddr.mac); 138 + if (likely(!rc)) 139 rc = dev_queue_xmit(skb); 140 return rc; 141 } ··· 149 llc_pdu_decode_sa(skb, mac_da); 150 llc_pdu_decode_da(skb, mac_sa); 151 llc_pdu_decode_ssap(skb, &dsap); 152 + nskb = llc_alloc_frame(NULL, skb->dev); 153 if (!nskb) 154 goto out; 155 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap, dsap, 156 LLC_PDU_RSP); 157 llc_pdu_init_as_test_rsp(nskb, skb); 158 rc = llc_mac_hdr_init(nskb, mac_sa, mac_da); 159 + if (likely(!rc)) 160 rc = dev_queue_xmit(nskb); 161 out: 162 return rc;
+13 -7
net/llc/llc_sap.c
··· 26 27 /** 28 * llc_alloc_frame - allocates sk_buff for frame 29 * 30 * Allocates an sk_buff for frame and initializes sk_buff fields. 31 * Returns allocated skb or %NULL when out of memory. 32 */ 33 - struct sk_buff *llc_alloc_frame(void) 34 { 35 struct sk_buff *skb = alloc_skb(128, GFP_ATOMIC); 36 ··· 39 skb_reserve(skb, 50); 40 skb->nh.raw = skb->h.raw = skb->data; 41 skb->protocol = htons(ETH_P_802_2); 42 - skb->dev = dev_base->next; 43 skb->mac.raw = skb->head; 44 } 45 return skb; 46 } 47 48 - void llc_save_primitive(struct sk_buff* skb, u8 prim) 49 { 50 - struct sockaddr_llc *addr = llc_ui_skb_cb(skb); 51 52 /* save primitive for use by the user. */ 53 - addr->sllc_family = skb->sk->sk_family; 54 addr->sllc_arphrd = skb->dev->type; 55 addr->sllc_test = prim == LLC_TEST_PRIM; 56 addr->sllc_xid = prim == LLC_XID_PRIM; ··· 195 if (skb->sk->sk_state == TCP_LISTEN) 196 kfree_skb(skb); 197 else { 198 - llc_save_primitive(skb, ev->prim); 199 200 /* queue skb to the user. */ 201 if (sock_queue_rcv_skb(skb->sk, skb)) ··· 314 315 sk = llc_lookup_dgram(sap, &laddr); 316 if (sk) { 317 - skb->sk = sk; 318 llc_sap_rcv(sap, skb); 319 sock_put(sk); 320 } else
··· 26 27 /** 28 * llc_alloc_frame - allocates sk_buff for frame 29 + * @dev: network device this skb will be sent over 30 * 31 * Allocates an sk_buff for frame and initializes sk_buff fields. 32 * Returns allocated skb or %NULL when out of memory. 33 */ 34 + struct sk_buff *llc_alloc_frame(struct sock *sk, struct net_device *dev) 35 { 36 struct sk_buff *skb = alloc_skb(128, GFP_ATOMIC); 37 ··· 38 skb_reserve(skb, 50); 39 skb->nh.raw = skb->h.raw = skb->data; 40 skb->protocol = htons(ETH_P_802_2); 41 + skb->dev = dev; 42 skb->mac.raw = skb->head; 43 + if (sk != NULL) 44 + skb_set_owner_w(skb, sk); 45 } 46 return skb; 47 } 48 49 + void llc_save_primitive(struct sock *sk, struct sk_buff* skb, u8 prim) 50 { 51 + struct sockaddr_llc *addr; 52 53 + if (skb->sk->sk_type == SOCK_STREAM) /* See UNIX98 */ 54 + return; 55 /* save primitive for use by the user. */ 56 + addr = llc_ui_skb_cb(skb); 57 + addr->sllc_family = sk->sk_family; 58 addr->sllc_arphrd = skb->dev->type; 59 addr->sllc_test = prim == LLC_TEST_PRIM; 60 addr->sllc_xid = prim == LLC_XID_PRIM; ··· 189 if (skb->sk->sk_state == TCP_LISTEN) 190 kfree_skb(skb); 191 else { 192 + llc_save_primitive(skb->sk, skb, ev->prim); 193 194 /* queue skb to the user. */ 195 if (sock_queue_rcv_skb(skb->sk, skb)) ··· 308 309 sk = llc_lookup_dgram(sap, &laddr); 310 if (sk) { 311 + skb_set_owner_r(skb, sk); 312 llc_sap_rcv(sap, skb); 313 sock_put(sk); 314 } else
+14 -11
net/llc/llc_station.c
··· 50 struct sk_buff_head mac_pdu_q; 51 }; 52 53 /* Types of events (possible values in 'ev->type') */ 54 #define LLC_STATION_EV_TYPE_SIMPLE 1 55 #define LLC_STATION_EV_TYPE_CONDITION 2 ··· 222 223 static int llc_station_ac_start_ack_timer(struct sk_buff *skb) 224 { 225 - mod_timer(&llc_main_station.ack_timer, jiffies + LLC_ACK_TIME * HZ); 226 return 0; 227 } 228 ··· 254 static int llc_station_ac_send_null_dsap_xid_c(struct sk_buff *skb) 255 { 256 int rc = 1; 257 - struct sk_buff *nskb = llc_alloc_frame(); 258 259 if (!nskb) 260 goto out; 261 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, 0, LLC_PDU_CMD); 262 llc_pdu_init_as_xid_cmd(nskb, LLC_XID_NULL_CLASS_2, 127); 263 rc = llc_mac_hdr_init(nskb, llc_station_mac_sa, llc_station_mac_sa); 264 - if (rc) 265 goto free; 266 llc_station_send_pdu(nskb); 267 out: ··· 275 { 276 u8 mac_da[ETH_ALEN], dsap; 277 int rc = 1; 278 - struct sk_buff* nskb = llc_alloc_frame(); 279 280 if (!nskb) 281 goto out; 282 rc = 0; 283 - nskb->dev = skb->dev; 284 llc_pdu_decode_sa(skb, mac_da); 285 llc_pdu_decode_ssap(skb, &dsap); 286 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, dsap, LLC_PDU_RSP); 287 llc_pdu_init_as_xid_rsp(nskb, LLC_XID_NULL_CLASS_2, 127); 288 rc = llc_mac_hdr_init(nskb, llc_station_mac_sa, mac_da); 289 - if (rc) 290 goto free; 291 llc_station_send_pdu(nskb); 292 out: ··· 299 { 300 u8 mac_da[ETH_ALEN], dsap; 301 int rc = 1; 302 - struct sk_buff *nskb = llc_alloc_frame(); 303 304 if (!nskb) 305 goto out; 306 rc = 0; 307 - nskb->dev = skb->dev; 308 llc_pdu_decode_sa(skb, mac_da); 309 llc_pdu_decode_ssap(skb, &dsap); 310 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, dsap, LLC_PDU_RSP); 311 llc_pdu_init_as_test_rsp(nskb, skb); 312 rc = llc_mac_hdr_init(nskb, llc_station_mac_sa, mac_da); 313 - if (rc) 314 goto free; 315 llc_station_send_pdu(nskb); 316 out: ··· 692 init_timer(&llc_main_station.ack_timer); 693 llc_main_station.ack_timer.data = (unsigned long)&llc_main_station; 694 llc_main_station.ack_timer.function = llc_station_ack_tmr_cb; 695 - 696 skb = alloc_skb(0, GFP_ATOMIC); 697 if (!skb) 698 goto out; ··· 701 llc_set_station_handler(llc_station_rcv); 702 ev = llc_station_ev(skb); 703 memset(ev, 0, sizeof(*ev)); 704 - llc_main_station.ack_timer.expires = jiffies + 3 * HZ; 705 llc_main_station.maximum_retry = 1; 706 llc_main_station.state = LLC_STATION_STATE_DOWN; 707 ev->type = LLC_STATION_EV_TYPE_SIMPLE;
··· 50 struct sk_buff_head mac_pdu_q; 51 }; 52 53 + #define LLC_STATION_ACK_TIME (3 * HZ) 54 + 55 + int sysctl_llc_station_ack_timeout = LLC_STATION_ACK_TIME; 56 + 57 /* Types of events (possible values in 'ev->type') */ 58 #define LLC_STATION_EV_TYPE_SIMPLE 1 59 #define LLC_STATION_EV_TYPE_CONDITION 2 ··· 218 219 static int llc_station_ac_start_ack_timer(struct sk_buff *skb) 220 { 221 + mod_timer(&llc_main_station.ack_timer, 222 + jiffies + sysctl_llc_station_ack_timeout); 223 return 0; 224 } 225 ··· 249 static int llc_station_ac_send_null_dsap_xid_c(struct sk_buff *skb) 250 { 251 int rc = 1; 252 + struct sk_buff *nskb = llc_alloc_frame(NULL, skb->dev); 253 254 if (!nskb) 255 goto out; 256 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, 0, LLC_PDU_CMD); 257 llc_pdu_init_as_xid_cmd(nskb, LLC_XID_NULL_CLASS_2, 127); 258 rc = llc_mac_hdr_init(nskb, llc_station_mac_sa, llc_station_mac_sa); 259 + if (unlikely(rc)) 260 goto free; 261 llc_station_send_pdu(nskb); 262 out: ··· 270 { 271 u8 mac_da[ETH_ALEN], dsap; 272 int rc = 1; 273 + struct sk_buff* nskb = llc_alloc_frame(NULL, skb->dev); 274 275 if (!nskb) 276 goto out; 277 rc = 0; 278 llc_pdu_decode_sa(skb, mac_da); 279 llc_pdu_decode_ssap(skb, &dsap); 280 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, dsap, LLC_PDU_RSP); 281 llc_pdu_init_as_xid_rsp(nskb, LLC_XID_NULL_CLASS_2, 127); 282 rc = llc_mac_hdr_init(nskb, llc_station_mac_sa, mac_da); 283 + if (unlikely(rc)) 284 goto free; 285 llc_station_send_pdu(nskb); 286 out: ··· 295 { 296 u8 mac_da[ETH_ALEN], dsap; 297 int rc = 1; 298 + struct sk_buff *nskb = llc_alloc_frame(NULL, skb->dev); 299 300 if (!nskb) 301 goto out; 302 rc = 0; 303 llc_pdu_decode_sa(skb, mac_da); 304 llc_pdu_decode_ssap(skb, &dsap); 305 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, dsap, LLC_PDU_RSP); 306 llc_pdu_init_as_test_rsp(nskb, skb); 307 rc = llc_mac_hdr_init(nskb, llc_station_mac_sa, mac_da); 308 + if (unlikely(rc)) 309 goto free; 310 llc_station_send_pdu(nskb); 311 out: ··· 689 init_timer(&llc_main_station.ack_timer); 690 llc_main_station.ack_timer.data = (unsigned long)&llc_main_station; 691 llc_main_station.ack_timer.function = llc_station_ack_tmr_cb; 692 + llc_main_station.ack_timer.expires = jiffies + 693 + sysctl_llc_station_ack_timeout; 694 skb = alloc_skb(0, GFP_ATOMIC); 695 if (!skb) 696 goto out; ··· 697 llc_set_station_handler(llc_station_rcv); 698 ev = llc_station_ev(skb); 699 memset(ev, 0, sizeof(*ev)); 700 llc_main_station.maximum_retry = 1; 701 llc_main_station.state = LLC_STATION_STATE_DOWN; 702 ev->type = LLC_STATION_EV_TYPE_SIMPLE;
+131
net/llc/sysctl_net_llc.c
···
··· 1 + /* 2 + * sysctl_net_llc.c: sysctl interface to LLC net subsystem. 3 + * 4 + * Arnaldo Carvalho de Melo <acme@conectiva.com.br> 5 + */ 6 + 7 + #include <linux/config.h> 8 + #include <linux/mm.h> 9 + #include <linux/init.h> 10 + #include <linux/sysctl.h> 11 + #include <net/llc.h> 12 + 13 + #ifndef CONFIG_SYSCTL 14 + #error This file should not be compiled without CONFIG_SYSCTL defined 15 + #endif 16 + 17 + static struct ctl_table llc2_timeout_table[] = { 18 + { 19 + .ctl_name = NET_LLC2_ACK_TIMEOUT, 20 + .procname = "ack", 21 + .data = &sysctl_llc2_ack_timeout, 22 + .maxlen = sizeof(long), 23 + .mode = 0644, 24 + .proc_handler = &proc_dointvec_jiffies, 25 + .strategy = &sysctl_jiffies, 26 + }, 27 + { 28 + .ctl_name = NET_LLC2_BUSY_TIMEOUT, 29 + .procname = "busy", 30 + .data = &sysctl_llc2_busy_timeout, 31 + .maxlen = sizeof(long), 32 + .mode = 0644, 33 + .proc_handler = &proc_dointvec_jiffies, 34 + .strategy = &sysctl_jiffies, 35 + }, 36 + { 37 + .ctl_name = NET_LLC2_P_TIMEOUT, 38 + .procname = "p", 39 + .data = &sysctl_llc2_p_timeout, 40 + .maxlen = sizeof(long), 41 + .mode = 0644, 42 + .proc_handler = &proc_dointvec_jiffies, 43 + .strategy = &sysctl_jiffies, 44 + }, 45 + { 46 + .ctl_name = NET_LLC2_REJ_TIMEOUT, 47 + .procname = "rej", 48 + .data = &sysctl_llc2_rej_timeout, 49 + .maxlen = sizeof(long), 50 + .mode = 0644, 51 + .proc_handler = &proc_dointvec_jiffies, 52 + .strategy = &sysctl_jiffies, 53 + }, 54 + { 0 }, 55 + }; 56 + 57 + static struct ctl_table llc_station_table[] = { 58 + { 59 + .ctl_name = NET_LLC_STATION_ACK_TIMEOUT, 60 + .procname = "ack_timeout", 61 + .data = &sysctl_llc_station_ack_timeout, 62 + .maxlen = sizeof(long), 63 + .mode = 0644, 64 + .proc_handler = &proc_dointvec_jiffies, 65 + .strategy = &sysctl_jiffies, 66 + }, 67 + { 0 }, 68 + }; 69 + 70 + static struct ctl_table llc2_dir_timeout_table[] = { 71 + { 72 + .ctl_name = NET_LLC2, 73 + .procname = "timeout", 74 + .mode = 0555, 75 + .child = llc2_timeout_table, 76 + }, 77 + { 0 }, 78 + }; 79 + 80 + static struct ctl_table llc_table[] = { 81 + { 82 + .ctl_name = NET_LLC2, 83 + .procname = "llc2", 84 + .mode = 0555, 85 + .child = llc2_dir_timeout_table, 86 + }, 87 + { 88 + .ctl_name = NET_LLC_STATION, 89 + .procname = "station", 90 + .mode = 0555, 91 + .child = llc_station_table, 92 + }, 93 + { 0 }, 94 + }; 95 + 96 + static struct ctl_table llc_dir_table[] = { 97 + { 98 + .ctl_name = NET_LLC, 99 + .procname = "llc", 100 + .mode = 0555, 101 + .child = llc_table, 102 + }, 103 + { 0 }, 104 + }; 105 + 106 + static struct ctl_table llc_root_table[] = { 107 + { 108 + .ctl_name = CTL_NET, 109 + .procname = "net", 110 + .mode = 0555, 111 + .child = llc_dir_table, 112 + }, 113 + { 0 }, 114 + }; 115 + 116 + static struct ctl_table_header *llc_table_header; 117 + 118 + int __init llc_sysctl_init(void) 119 + { 120 + llc_table_header = register_sysctl_table(llc_root_table, 1); 121 + 122 + return llc_table_header ? 0 : -ENOMEM; 123 + } 124 + 125 + void llc_sysctl_exit(void) 126 + { 127 + if (llc_table_header) { 128 + unregister_sysctl_table(llc_table_header); 129 + llc_table_header = NULL; 130 + } 131 + }
-6
net/packet/af_packet.c
··· 761 if (dev->hard_header) { 762 int res; 763 err = -EINVAL; 764 - if (saddr) { 765 - if (saddr->sll_halen != dev->addr_len) 766 - goto out_free; 767 - if (saddr->sll_hatype != dev->type) 768 - goto out_free; 769 - } 770 res = dev->hard_header(skb, dev, ntohs(proto), addr, NULL, len); 771 if (sock->type != SOCK_DGRAM) { 772 skb->tail = skb->data;
··· 761 if (dev->hard_header) { 762 int res; 763 err = -EINVAL; 764 res = dev->hard_header(skb, dev, ntohs(proto), addr, NULL, len); 765 if (sock->type != SOCK_DGRAM) { 766 skb->tail = skb->data;
+3 -1
net/socket.c
··· 1700 struct socket *sock; 1701 char address[MAX_SOCK_ADDR]; 1702 struct iovec iovstack[UIO_FASTIOV], *iov = iovstack; 1703 - unsigned char ctl[sizeof(struct cmsghdr) + 20]; /* 20 is size of ipv6_pktinfo */ 1704 unsigned char *ctl_buf = ctl; 1705 struct msghdr msg_sys; 1706 int err, ctl_len, iov_size, total_len;
··· 1700 struct socket *sock; 1701 char address[MAX_SOCK_ADDR]; 1702 struct iovec iovstack[UIO_FASTIOV], *iov = iovstack; 1703 + unsigned char ctl[sizeof(struct cmsghdr) + 20] 1704 + __attribute__ ((aligned (sizeof(__kernel_size_t)))); 1705 + /* 20 is size of ipv6_pktinfo */ 1706 unsigned char *ctl_buf = ctl; 1707 struct msghdr msg_sys; 1708 int err, ctl_len, iov_size, total_len;