Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: hsr: introduce common code for skb initialization

As a preparatory patch to introduce PRP protocol support in the
driver, refactor the skb init code to a separate function.

Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Murali Karicheri and committed by
David S. Miller
121c33b0 8f4c0e01

+28 -13
+28 -13
net/hsr/hsr_device.c
··· 230 230 .parse = eth_header_parse, 231 231 }; 232 232 233 - static void send_hsr_supervision_frame(struct hsr_port *master, 234 - u8 type, u8 hsr_ver) 233 + static struct sk_buff *hsr_init_skb(struct hsr_port *master, u8 hsr_ver) 235 234 { 235 + struct hsr_priv *hsr = master->hsr; 236 236 struct sk_buff *skb; 237 237 int hlen, tlen; 238 - struct hsr_tag *hsr_tag; 239 - struct hsr_sup_tag *hsr_stag; 240 - struct hsr_sup_payload *hsr_sp; 241 - unsigned long irqflags; 242 238 243 239 hlen = LL_RESERVED_SPACE(master->dev); 244 240 tlen = master->dev->needed_tailroom; ··· 243 247 sizeof(struct hsr_sup_payload) + hlen + tlen); 244 248 245 249 if (!skb) 246 - return; 250 + return skb; 247 251 248 252 skb_reserve(skb, hlen); 249 - 250 253 skb->dev = master->dev; 251 254 skb->protocol = htons(hsr_ver ? ETH_P_HSR : ETH_P_PRP); 252 255 skb->priority = TC_PRIO_CONTROL; 253 256 254 257 if (dev_hard_header(skb, skb->dev, (hsr_ver ? ETH_P_HSR : ETH_P_PRP), 255 - master->hsr->sup_multicast_addr, 258 + hsr->sup_multicast_addr, 256 259 skb->dev->dev_addr, skb->len) <= 0) 257 260 goto out; 261 + 258 262 skb_reset_mac_header(skb); 259 263 skb_reset_network_header(skb); 260 264 skb_reset_transport_header(skb); 265 + 266 + return skb; 267 + out: 268 + kfree_skb(skb); 269 + 270 + return NULL; 271 + } 272 + 273 + static void send_hsr_supervision_frame(struct hsr_port *master, 274 + u8 type, u8 hsr_ver) 275 + { 276 + struct hsr_sup_payload *hsr_sp; 277 + struct hsr_sup_tag *hsr_stag; 278 + struct hsr_tag *hsr_tag; 279 + unsigned long irqflags; 280 + struct sk_buff *skb; 281 + 282 + skb = hsr_init_skb(master, hsr_ver); 283 + if (!skb) { 284 + WARN_ONCE(1, "HSR: Could not send supervision frame\n"); 285 + return; 286 + } 261 287 262 288 if (hsr_ver > 0) { 263 289 hsr_tag = skb_put(skb, sizeof(struct hsr_tag)); ··· 317 299 return; 318 300 319 301 hsr_forward_skb(skb, master); 320 - return; 321 302 322 - out: 323 - WARN_ONCE(1, "HSR: Could not send supervision frame\n"); 324 - kfree_skb(skb); 303 + return; 325 304 } 326 305 327 306 /* Announce (supervision frame) timer function